Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

INSERT ट्रिगर के बाद SQL सर्वर अभी-अभी डाली गई पंक्ति को नहीं देखता है

ट्रिगर परिवर्तित डेटा को संशोधित नहीं कर सकते (Inserted या Deleted ) अन्यथा आप अनंत रिकर्सन प्राप्त कर सकते हैं क्योंकि परिवर्तनों ने ट्रिगर को फिर से बुलाया। एक विकल्प यह होगा कि ट्रिगर लेन-देन को वापस ले ले।

संपादित करें: इसका कारण यह है कि SQL के लिए मानक यह है कि सम्मिलित और हटाई गई पंक्तियों को ट्रिगर द्वारा संशोधित नहीं किया जा सकता है। अंतर्निहित कारण यह है कि संशोधन अनंत रिकर्सन का कारण बन सकते हैं। सामान्य स्थिति में, इस मूल्यांकन में पारस्परिक रूप से पुनरावर्ती कैस्केड में कई ट्रिगर शामिल हो सकते हैं। इस तरह के अपडेट की अनुमति देने के लिए एक सिस्टम बुद्धिमानी से तय करता है कि क्या कम्प्यूटेशनल रूप से कठिन है, अनिवार्य रूप से रोकने की समस्या पर भिन्नता है।

इसका स्वीकृत समाधान ट्रिगर को बदलते डेटा को बदलने की अनुमति नहीं देना है, हालांकि यह लेनदेन को वापस ले सकता है।

create table Foo (
       FooID int
      ,SomeField varchar (10)
)
go

create trigger FooInsert
    on Foo after insert as
    begin
        delete inserted
         where isnumeric (SomeField) = 1
    end
go


Msg 286, Level 16, State 1, Procedure FooInsert, Line 5
The logical tables INSERTED and DELETED cannot be updated.

कुछ इस तरह से लेन-देन वापस ले लिया जाएगा।

create table Foo (
       FooID int
      ,SomeField varchar (10)
)
go

create trigger FooInsert
    on Foo for insert as
    if exists (
       select 1
         from inserted 
        where isnumeric (SomeField) = 1) begin
              rollback transaction
    end
go

insert Foo values (1, '1')

Msg 3609, Level 16, State 1, Line 1
The transaction ended in the trigger. The batch has been aborted.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. लिंक में क्रॉस लागू करें

  2. SQL सर्वर में एक स्ट्रिंग को कैसे विभाजित करें

  3. क्या डायनामिक एसक्यूएल का उपयोग किए बिना उपयोगकर्ता द्वारा निर्दिष्ट कॉलम नाम से पूछताछ करना संभव है?

  4. SQL चयन में कॉलम को स्ट्रिंग में बदलें

  5. विभाजित डेटा में गुम दिनांक और मान कैसे भरें?