I trigger non possono modificare i dati modificati (Inserted
o Deleted
) altrimenti potresti ottenere una ricorsione infinita poiché le modifiche hanno richiamato nuovamente il trigger. Un'opzione potrebbe essere che l'attivatore annulli la transazione.
Modifica: Il motivo è che lo standard per SQL è che le righe inserite ed eliminate non possono essere modificate dal trigger. Il motivo alla base è che le modifiche potrebbero causare una ricorsione infinita. Nel caso generale, questa valutazione potrebbe coinvolgere più trigger in una cascata ricorsiva reciprocamente. Avere un sistema che decide in modo intelligente se consentire tali aggiornamenti è computazionalmente intrattabile, essenzialmente una variazione del problema di arresto.
La soluzione accettata a questo non è consentire al trigger di modificare i dati in modifica, sebbene possa annullare la transazione.
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.
Qualcosa del genere annullerà la transazione.
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.