sql >> Databáze >  >> RDS >> Sqlserver

SQL Server AFTER INSERT trigger nevidí právě vložený řádek

Spouštěče nemohou změnit změněná data (Inserted nebo Deleted ), jinak byste mohli získat nekonečnou rekurzi, protože změny znovu vyvolaly spouštěč. Jednou z možností by bylo, aby spouštěč odvolal transakci.

Upravit: Důvodem je to, že standardem pro SQL je, že vložené a odstraněné řádky nemohou být modifikovány spouštěčem. Základním důvodem je, že modifikace mohou způsobit nekonečnou rekurzi. V obecném případě by toto hodnocení mohlo zahrnovat více spouštěčů ve vzájemně rekurzivní kaskádě. Inteligentní rozhodnutí systému, zda takové aktualizace povolí, je výpočetně neřešitelné, v podstatě jde o variaci na problém se zastavením.

Přijímaným řešením je nepovolit spouštěči změnit měnící se data, ačkoli může transakci vrátit zpět.

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ěco takového vrátí transakci zpět.

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. Oracle:neplatný měsíc

  2. Dotaz na databázi MySQL pomocí Java

  3. Mysql Like obsahující divoký košík dává neočekávaný výsledek

  4. Jak vložit nové ID automatického zvýšení