Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Pemicu SQL Server AFTER INSERT tidak melihat baris yang baru saja dimasukkan

Pemicu tidak dapat mengubah data yang diubah (Inserted atau Deleted ) jika tidak, Anda bisa mendapatkan rekursi tak terbatas saat perubahan memicu pemicu lagi. Salah satu opsinya adalah pemicu untuk membatalkan transaksi.

Sunting: Alasan untuk ini adalah bahwa standar untuk SQL adalah bahwa baris yang dimasukkan dan dihapus tidak dapat diubah oleh pemicu. Alasan yang mendasarinya adalah bahwa modifikasi dapat menyebabkan rekursi tak terbatas. Dalam kasus umum, evaluasi ini dapat melibatkan beberapa pemicu dalam kaskade rekursif yang saling menguntungkan. Memiliki sistem yang cerdas memutuskan apakah akan mengizinkan pembaruan semacam itu tidak dapat diselesaikan secara komputasi, pada dasarnya merupakan variasi pada masalah penghentian.

Solusi yang diterima untuk ini adalah tidak mengizinkan pemicu untuk mengubah data yang berubah, meskipun dapat memutar kembali transaksi.

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.

Sesuatu seperti ini akan membatalkan transaksi.

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. Fungsi agregat pada beberapa tabel tidak memberikan hasil yang benar

  2. tidak ada sqljdbc_auth di java.library.path

  3. SQL Server BCP Ekspor di mana koma di bidang SQL

  4. Temukan Entitas Referensi di SQL Server:sys.dm_sql_referencing_entities()

  5. SQL Server 2008 versi OVER(... Baris Tidak Terbatas Sebelumnya)