Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Wyzwalacz SQL Server AFTER INSERT nie widzi właśnie wstawionego wiersza

Wyzwalacze nie mogą modyfikować zmienionych danych (Inserted lub Deleted ) w przeciwnym razie można uzyskać nieskończoną rekurencję, gdy zmiany ponownie wywołają wyzwalacz. Jedną z opcji byłoby wycofanie transakcji przez wyzwalacz.

Edytuj: Powodem tego jest to, że standardem SQL jest to, że wstawione i usunięte wiersze nie mogą być modyfikowane przez wyzwalacz. Podstawowym powodem jest to, że modyfikacje mogą powodować nieskończoną rekurencję. W ogólnym przypadku ta ocena może obejmować wiele wyzwalaczy we wzajemnie rekurencyjnej kaskadzie. Posiadanie przez system inteligentnej decyzji, czy zezwolić na takie aktualizacje, jest niewykonalne obliczeniowo, co jest zasadniczo odmianą problemu z zatrzymaniem.

Akceptowanym rozwiązaniem jest niedopuszczenie do zmiany przez wyzwalacz zmieniających się danych, chociaż może on wycofać transakcję.

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.

Coś takiego cofnie transakcję.

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SPRÓBUJ CATCH z połączonym serwerem w SQL Server 2005 nie działa

  2. Uwagi na temat edycji SQL Server 2019

  3. Nie można połączyć się z AWS EC2 z Visual Studio (a właściwie z dowolnego miejsca)

  4. Używanie merge..output do uzyskania mapowania między source.id i target.id

  5. Replikacja bazy danych SQL Server