sql >> データベース >  >> RDS >> Sqlserver

自己参照テーブルのカスケードの削除時

    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);
    



    1. AndroidのデータとUI間の緩い結合のベストプラクティス-アダプター、フィルター、CursorLoader、ContentProvider

    2. SQLServerの行番号で内部結合を行う方法

    3. JSON_LENGTH()–MySQLでJSONドキュメントの長さを返します

    4. T-SQLとは何ですか?