Spouštěče nemohou změnit změněná data (Inserted
nebo Deleted
), jinak byste mohli získat nekonečnou rekurzi, protože změny znovu vyvolaly spouštěč. Jednou z možností by bylo, aby spouštěč odvolal transakci.
Upravit: Důvodem je to, že standardem pro SQL je, že vložené a odstraněné řádky nemohou být modifikovány spouštěčem. Základním důvodem je, že modifikace mohou způsobit nekonečnou rekurzi. V obecném případě by toto hodnocení mohlo zahrnovat více spouštěčů ve vzájemně rekurzivní kaskádě. Inteligentní rozhodnutí systému, zda takové aktualizace povolí, je výpočetně neřešitelné, v podstatě jde o variaci na problém se zastavením.
Přijímaným řešením je nepovolit spouštěči změnit měnící se data, ačkoli může transakci vrátit zpět.
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.
Něco takového vrátí transakci zpět.
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.