Förutsatt att du behåller din FOREIGN KEY
begränsning på plats kan du inte åtgärda problemet i en FOR DELETE
utlösare. FOR
utlösare (även känd som AFTER
triggers) avfyras efter aktiviteten har ägt rum. Och en främmande nyckel kommer att förhindra en rad tas bort om den har referenser. Kontroller av främmande nyckel sker före radering.
Vad du behöver är en INSTEAD OF
utlösare. Du måste också komma ihåg att din nuvarande trigger bara försökte hantera en "nivå" av referenser. (Så, om rad 3 hänvisar till rad 2 och rad 2 hänvisar till rad 1, och du tar bort rad 1, försökte din trigger bara ta bort rad 2)
Så, något i stil med:
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);
Om det finns andra (icke-självrefererande) kaskadande främmande nyckelbegränsningar måste de alla ersättas av åtgärder i denna utlösare. I ett sådant fall skulle jag rekommendera att införa en tabellvariabel för att hålla listan över alla ID:n som så småningom kommer att raderas från Comments
tabell:
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);