Ervan uitgaande dat u uw FOREIGN KEY
. behoudt beperking aanwezig is, kunt u het probleem niet oplossen in een FOR DELETE
trekker. FOR
triggers (ook bekend als AFTER
triggers) vuren na de activiteit heeft plaatsgevonden. En een externe sleutel verhindert een rij kan worden verwijderd als deze verwijzingen heeft. Externe sleutelcontroles vinden vóór . plaats verwijderen.
Wat je nodig hebt is een INSTEAD OF
trekker. U moet er ook rekening mee houden dat uw huidige trigger slechts één "niveau" van verwijzingen probeerde aan te pakken. (Dus als rij 3 verwijst naar rij 2 en rij 2 naar rij 1 verwijst en u verwijdert rij 1, heeft uw trigger alleen geprobeerd rij 2) te verwijderen
Dus zoiets als:
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);
Als er andere (niet naar zichzelf verwijzende) trapsgewijze beperkingen voor externe sleutels zijn, moeten deze allemaal worden vervangen door acties in deze trigger. In een dergelijk geval raad ik aan om een tabelvariabele in te voeren die de lijst bevat van alle ID's die uiteindelijk zullen worden verwijderd uit de Comments
tafel:
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);