1

次のような自動参照関係を持つテーブルがあります。

TableA(IDTableA, IDTableARoot,...)

そして、削除する削除トリガーの代わりにこれを持っています:

Delete from TableA where IDTableARoot IN(select deleted.IDTableA from deleted)
    Delete from TableA where IDTableA IN(select deleted.IDTableA from deleted)

私はこの2行があると思います:

行 1: IDTableA: 1 IDTableARoot: 1

行 2: IDTableA: 2 IDTableARoot: 1

行1を削除しようとすると:

delete from TableA where IDTableA = 1;

ID = 1 の行のみが削除されますが、ID = 2 の行は削除されませんが、トリガーの最初のステートメントで削除する必要があるため、IDTableARoot = IDTableA の行を削除する必要があると言います。削除する行の ID です。

では、自己関係に属するカスケード行を削除するにはどうすればよいでしょうか?

どうもありがとう。

4

1 に答える 1

2

DELETE トリガーで別の DELETE を実行しようとしていますが、これは無限ループに入る可能性があるため許可されていません。

トリガーの使用を変更しINSTEAD OF DELETE(このリンクを参照)、トリガー本体のコードを次のように変更することをお勧めします。

UPDATED : @TT が指摘したエラーに対処するため。

CREATE TABLE #CascadeDeleteRows (IDTableA int, IDTableARoot int)

INSERT 
  INTO #CascadeDeleteRows 
SELECT b.IDTable
     , b.IDTableARoot 
  FROM TableA
 WHERE b.IDTableA IN (SELECT deleted.IDTableARoot from deleted)

DELETE 
  FROM TableA 
 WHERE IDTableA IN (SELECT #CascadeDeleteRows.IDTableA FROM #CascadeDeleteRows)

DROP TABLE #CascadeDeleteRows

お役に立てれば

于 2016-01-16T16:49:48.463 に答える