Za předpokladu, že si ponecháte svůj FOREIGN KEY
omezení, nemůžete problém vyřešit v FOR DELETE
spoušť. FOR
spouštěče (známé také jako AFTER
spouští) spustit po aktivita proběhla. A cizí klíč zabrání řádek před smazáním, pokud má odkazy. Kontroly cizího klíče probíhají před smazání.
Co potřebujete, je INSTEAD OF
spoušť. Musíte také mít na paměti, že váš aktuální spouštěč se pokusil vypořádat pouze s jednou „úrovní“ odkazování. (Pokud tedy řádek 3 odkazuje na řádek 2 a řádek 2 odkazuje na řádek 1 a vy smažete řádek 1, váš spouštěč se pokusil odstranit pouze řádek 2)
Takže něco jako:
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);
Pokud existují jiná omezení (bez sebeodkazování), kaskádová omezení cizího klíče, musí být všechna nahrazena akcemi v tomto spouštěči. V takovém případě bych doporučil zavést proměnnou tabulky, která bude obsahovat seznam všech ID, která budou nakonec odstraněna z Comments
tabulka:
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);