Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Il trigger di SQL Server AFTER INSERT non vede la riga appena inserita

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.