Triggers kunnen de gewijzigde gegevens niet wijzigen (Inserted
of Deleted
) anders zou u oneindige recursie kunnen krijgen omdat de wijzigingen de trigger opnieuw aanriepen. Een optie zou zijn dat de trigger de transactie terugdraait.
Bewerken: De reden hiervoor is dat de standaard voor SQL is dat ingevoegde en verwijderde rijen niet kunnen worden gewijzigd door de trigger. De onderliggende reden hiervoor is dat de wijzigingen oneindige recursie kunnen veroorzaken. In het algemene geval kan deze evaluatie meerdere triggers in een wederzijds recursieve cascade omvatten. Een systeem intelligent laten beslissen of dergelijke updates worden toegestaan, is rekenkundig onhandelbaar, in wezen een variatie op het stopprobleem.
De geaccepteerde oplossing hiervoor is om de trigger niet toe te staan de veranderende gegevens te wijzigen, hoewel het de transactie kan terugdraaien.
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.
Zoiets zal de transactie terugdraaien.
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.