Wyzwalacze nie mogą modyfikować zmienionych danych (Inserted
lub Deleted
) w przeciwnym razie można uzyskać nieskończoną rekurencję, gdy zmiany ponownie wywołają wyzwalacz. Jedną z opcji byłoby wycofanie transakcji przez wyzwalacz.
Edytuj: Powodem tego jest to, że standardem SQL jest to, że wstawione i usunięte wiersze nie mogą być modyfikowane przez wyzwalacz. Podstawowym powodem jest to, że modyfikacje mogą powodować nieskończoną rekurencję. W ogólnym przypadku ta ocena może obejmować wiele wyzwalaczy we wzajemnie rekurencyjnej kaskadzie. Posiadanie przez system inteligentnej decyzji, czy zezwolić na takie aktualizacje, jest niewykonalne obliczeniowo, co jest zasadniczo odmianą problemu z zatrzymaniem.
Akceptowanym rozwiązaniem jest niedopuszczenie do zmiany przez wyzwalacz zmieniających się danych, chociaż może on wycofać transakcję.
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.
Coś takiego cofnie transakcję.
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.