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);