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

SQL Server EFTER INSERT trigger kan ikke se den netop indsatte række

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.


  1. Skal hver brugertabel have et grupperet indeks?

  2. Bruger $_SESSION til at transportere data

  3. Failover &Failback for PostgreSQL på Microsoft Azure

  4. Java-databaseabstraktion til GWT (eller:Er Hibernate et godt valg?)