sql >> Databasteknik >  >> RDS >> Sqlserver

SQL Server EFTER INSERT-utlösaren ser inte den nyss infogade raden

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.


  1. Databasdesignfråga - Kategorier / Underkategorier

  2. Hur infogar man i tabellnamnet som alias med hjälp av pg-promise insert helper?

  3. fel uppstod när en anslutning till SQL Server upprättades

  4. JDBC Skapa tabell Exempel Användningsförklaring