ट्रिगर परिवर्तित डेटा को संशोधित नहीं कर सकते (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.