Zakładając, że zachowujesz FOREIGN KEY
ograniczenie w miejscu, nie można naprawić problemu w FOR DELETE
cyngiel. FOR
wyzwalacze (znane również jako AFTER
wyzwalacze) uruchom po działalność miała miejsce. A klucz obcy zapobiegnie wiersz przed usunięciem, jeśli ma odniesienia. Sprawdzenie klucza obcego następuje przed usunięcie.
Potrzebujesz INSTEAD OF
cyngiel. Musisz również pamiętać, że twój obecny wyzwalacz próbował poradzić sobie tylko z jednym „poziomem” odwoływania się. (Jeśli więc wiersz 3 odwołuje się do wiersza 2, a wiersz 2 odwołuje się do wiersza 1, a usuniesz wiersz 1, wyzwalacz próbował tylko usunąć wiersz 2)
A więc coś takiego:
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);
Jeśli istnieją inne (nieodwołujące się do siebie) kaskadowe ograniczenia klucza obcego, wszystkie muszą zostać zastąpione przez akcje w tym wyzwalaczu. W takim przypadku zalecam wprowadzenie zmiennej tabeli do przechowywania listy wszystkich identyfikatorów, które ostatecznie zostaną usunięte z Comments
tabela:
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);