Pemicu tidak dapat mengubah data yang diubah (Inserted
atau Deleted
) jika tidak, Anda bisa mendapatkan rekursi tak terbatas saat perubahan memicu pemicu lagi. Salah satu opsinya adalah pemicu untuk membatalkan transaksi.
Sunting: Alasan untuk ini adalah bahwa standar untuk SQL adalah bahwa baris yang dimasukkan dan dihapus tidak dapat diubah oleh pemicu. Alasan yang mendasarinya adalah bahwa modifikasi dapat menyebabkan rekursi tak terbatas. Dalam kasus umum, evaluasi ini dapat melibatkan beberapa pemicu dalam kaskade rekursif yang saling menguntungkan. Memiliki sistem yang cerdas memutuskan apakah akan mengizinkan pembaruan semacam itu tidak dapat diselesaikan secara komputasi, pada dasarnya merupakan variasi pada masalah penghentian.
Solusi yang diterima untuk ini adalah tidak mengizinkan pemicu untuk mengubah data yang berubah, meskipun dapat memutar kembali transaksi.
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.
Sesuatu seperti ini akan membatalkan transaksi.
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.