Utlösare kan inte ändra de ändrade data (Inserted
eller Deleted
) annars kan du få oändlig rekursion eftersom ändringarna anropade triggern igen. Ett alternativ skulle vara att utlösaren återställer transaktionen.
Redigera: Anledningen till detta är att standarden för SQL är att infogade och raderade rader inte kan modifieras av triggern. Den underliggande orsaken till detta är att ändringarna kan orsaka oändlig rekursion. I det allmänna fallet kan denna utvärdering involvera flera triggers i en ömsesidigt rekursiv kaskad. Att låta ett system på ett intelligent sätt besluta om sådana uppdateringar ska tillåtas är beräkningsmässigt svårlöst, i grunden en variant av stoppproblemet.
Den accepterade lösningen på detta är att inte tillåta utlösaren att ändra data som ändras, även om den kan rulla tillbaka transaktionen.
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ågot liknande kommer att återställa transaktionen.
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.