Triggere kan ikke ændre de ændrede data (Inserted
eller Deleted
) ellers kunne du få uendelig rekursion, da ændringerne påkaldte triggeren igen. En mulighed ville være, at triggeren ruller transaktionen tilbage.
Rediger: Grunden til dette er, at standarden for SQL er, at indsatte og slettede rækker ikke kan ændres af triggeren. Den underliggende årsag er, at ændringerne kan forårsage uendelig rekursion. I det generelle tilfælde kan denne evaluering involvere flere triggere i en gensidigt rekursiv kaskade. At lade et system intelligent beslutte, om det skal tillade sådanne opdateringer, er beregningsmæssigt vanskeligt at løse, i det væsentlige en variation af stopproblemet.
Den accepterede løsning på dette er ikke at tillade triggeren at ændre de skiftende data, selvom den kan rulle transaktionen tilbage.
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.
Noget som dette vil rulle transaktionen tilbage.
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.