FOREIGN KEY
を保持していると仮定します 制約が設定されているため、FOR DELETE
で問題を修正することはできません 引き金。 FOR
トリガー(AFTER
とも呼ばれます トリガー)後に発砲 活動が行われました。そして、外部キーは防止します 参照がある場合、行が削除されないようにします。外部キーチェックは前に行われます 削除。
必要なのはINSTEAD OF
引き金。また、現在のトリガーは1つの「レベル」の参照のみを処理しようとしたことを覚えておく必要があります。 (したがって、行3が行2を参照し、行2が行1を参照し、行1を削除した場合、トリガーは行2のみを削除しようとしました)
つまり、次のようなものです:
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);
他の(自己参照しない)カスケード外部キー制約がある場合、それらはすべてこのトリガーのアクションに置き換える必要があります。このような場合、Comments
から最終的に削除されるすべてのIDのリストを保持するテーブル変数を導入することをお勧めします。 テーブル:
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);