Giả sử bạn đang giữ FOREIGN KEY
của mình ràng buộc tại chỗ, bạn không thể khắc phục sự cố trong FOR DELETE
cò súng. FOR
trình kích hoạt (còn được gọi là AFTER
kích hoạt) cháy sau khi hoạt động đã diễn ra. Và khóa ngoại sẽ ngăn chặn một hàng không bị xóa nếu nó có tham chiếu. Kiểm tra khóa ngoại xảy ra trước xóa.
Những gì bạn cần là một INSTEAD OF
cò súng. Bạn cũng cần lưu ý rằng trình kích hoạt hiện tại của bạn chỉ cố gắng giải quyết một "cấp độ" tham chiếu. (Vì vậy, nếu hàng 3 tham chiếu hàng 2 và hàng 2 tham chiếu hàng 1 và bạn xóa hàng 1, trình kích hoạt của bạn chỉ cố gắng xóa hàng 2)
Vì vậy, một cái gì đó như:
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);
Nếu có các ràng buộc khóa ngoại xếp tầng (không tự tham chiếu) khác, tất cả chúng phải được thay thế bằng các hành động trong trình kích hoạt này. Trong trường hợp như vậy, tôi khuyên bạn nên giới thiệu một biến bảng để giữ danh sách tất cả các ID cuối cùng sẽ bị xóa khỏi Comments
bảng:
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);