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

Saat menghapus kaskade untuk tabel referensi sendiri

Dengan asumsi Anda menyimpan FOREIGN KEY kendala di tempat, Anda tidak dapat memperbaiki masalah di FOR DELETE pemicu. FOR pemicu (juga dikenal sebagai AFTER pemicu) tembak setelah kegiatan telah berlangsung. Dan kunci asing akan mencegah baris agar tidak dihapus jika memiliki referensi. Pemeriksaan kunci asing terjadi sebelum penghapusan.

Yang Anda butuhkan adalah INSTEAD OF pemicu. Anda juga perlu mengingat bahwa pemicu Anda saat ini hanya mencoba menangani satu "tingkat" referensi. (Jadi, jika baris 3 mereferensikan baris 2 dan baris 2 mereferensikan baris 1, dan Anda menghapus baris 1, pemicu Anda hanya mencoba menghapus baris 2)

Jadi, sesuatu seperti:

CREATE TRIGGER [dbo].[T_comment_Trigger]
    ON [dbo].[Comments]
    INSTEAD OF DELETE
AS
    ;WITH IDs as (
       select id from deleted
       union all
       select c.id
       from Comments c
              inner join
            IDs i
              on
                 c.ParentID = i.id
    )
    DELETE FROM Comments
    WHERE id in (select id from IDs);

Jika ada kendala kunci asing berjenjang (non-self-referencing) lainnya, semuanya harus diganti dengan tindakan di pemicu ini. Dalam kasus seperti itu, saya akan merekomendasikan memperkenalkan variabel tabel untuk menampung daftar semua ID yang pada akhirnya akan dihapus dari Comments tabel:

CREATE TRIGGER [dbo].[T_comment_Trigger]
    ON [dbo].[Comments]
    INSTEAD OF DELETE
AS
    declare @deletions table (ID varchar(7) not null);
    ;WITH IDs as (
       select id from deleted
       union all
       select c.id
       from Comments c
              inner join
            IDs i
              on
                 c.ParentID = i.id
    )
    insert into @deletions(ID)
    select ID from IDs

    DELETE FROM OtherTable
    WHERE CommentID in (select ID from @deletions)

    --This delete comes last
    DELETE FROM Comments
    WHERE id in (select ID from @deletions);



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. 10 Fakta Tentang Pemantauan Kinerja Basis Data yang Mungkin Mengejutkan Anda

  2. OLTP Dalam Memori:Apa yang baru di SQL Server 2016

  3. bergabung dengan kolom data yang dibatasi koma

  4. Menggunakan tupel dalam klausa SQL IN

  5. Harus mendeklarasikan variabel skalar