1


0

トリガーが起動しないのはなぜですか?

私は次の表を持っています:

if object_id(N'dbo.Node') is null
create table dbo.Node
(
    ID bigint identity primary key,
    ParentID bigint null foreign key references Node(ID) on delete no action,
    DateCreated datetime not null,
    LastUpdated datetime not null,
    [Name] nvarchar(500) not null,
);

今、外部キーをカスケード削除として設定しようとするとSQL Serverが文句を言うので、作業を行うためのトリガーを作成しました:

create trigger Node_Delete on Node for delete
as
begin
    delete from Node where ParentID in (select id from deleted)
end

ここにサンプルデータセットがあります:

ID                   ParentID             DateCreated             LastUpdated             Name
520                  1                    2010-01-12 02:26:26.890 2010-01-12 02:26:26.890 Test 1
523                  520                  2010-01-12 02:32:44.777 2010-01-12 02:32:44.777 Test 2

さて、次のSQLを実行しましょう:

delete from Node where ID=520

ノードは、子ノードとともに削除する必要があります。 なぜこのエラーが発生するのですか?

Msg 547, Level 16, State 0, Line 1
The DELETE statement conflicted with the SAME TABLE REFERENCE constraint "FK__Node__ParentID__117F9D94". The conflict occurred in database "mydb", table "dbo.Node", column 'ParentID'.
The statement has been terminated.

1 Answer


3


外部キーは最初の削除をブロックし、トリガーは起動しません。 最先の子孫から削除するINSTEAD OFトリガーを試してください。