Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Тригерът на SQL Server AFTER INSERT не вижда току-що вмъкнатия ред

Тригерите не могат да променят променените данни (Inserted или Deleted ) в противен случай бихте могли да получите безкрайна рекурсия, тъй като промените извикват отново тригера. Една от опциите би била тригерът да върне транзакцията назад.

Редактиране: Причината за това е, че стандартът за SQL е, че вмъкнатите и изтритите редове не могат да бъдат модифицирани от тригера. Основната причина е, че модификациите могат да причинят безкрайна рекурсия. В общия случай тази оценка може да включва множество тригери във взаимно рекурсивна каскада. Наличието на система, която интелигентно решава дали да разреши такива актуализации, е изчислително неразрешимо, по същество вариант на проблема със спирането.

Приетото решение за това е да не се позволява на тригера да променя променящите се данни, въпреки че може да върне обратно транзакцията.

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.

Нещо подобно ще отмени транзакцията.

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. Periodic InvalidCastException и сървърът не успя да възобнови транзакцията с Linq

  2. Как да определите дали екземпляр на SQL Server е чувствителен към главни и малки букви или не

  3. SQL WHERE клауза, съответстваща на стойности с крайни интервали

  4. Как да изхвърлим всички наши изображения от поле VARBINARY(MAX) в SQL Server 2008 във файловата система?

  5. Как да вмъкна данни, ако не между тях в sql сървър 2008?