sql >> Database >  >> RDS >> Sqlserver

SQL Server AFTER INSERT-trigger ziet de zojuist ingevoegde rij niet

Triggers kunnen de gewijzigde gegevens niet wijzigen (Inserted of Deleted ) anders zou u oneindige recursie kunnen krijgen omdat de wijzigingen de trigger opnieuw aanriepen. Een optie zou zijn dat de trigger de transactie terugdraait.

Bewerken: De reden hiervoor is dat de standaard voor SQL is dat ingevoegde en verwijderde rijen niet kunnen worden gewijzigd door de trigger. De onderliggende reden hiervoor is dat de wijzigingen oneindige recursie kunnen veroorzaken. In het algemene geval kan deze evaluatie meerdere triggers in een wederzijds recursieve cascade omvatten. Een systeem intelligent laten beslissen of dergelijke updates worden toegestaan, is rekenkundig onhandelbaar, in wezen een variatie op het stopprobleem.

De geaccepteerde oplossing hiervoor is om de trigger niet toe te staan ​​de veranderende gegevens te wijzigen, hoewel het de transactie kan terugdraaien.

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.

Zoiets zal de transactie terugdraaien.

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. 10 redenen om bij MySQL te blijven

  2. Hoe gegevens uit een pl/sql-functie te halen als een parameter meer dan één waarde heeft in functie met enkele parameters?

  3. Psycopg2-invoeging niet opgeslagen

  4. Hoe gegevens in de MySQL-tabel in Java JTable te krijgen?