私はHierarchyIDをあまり使わなかったので、少し不安です。テーブルにHierarchyIDがある場合、カスケード削除を実行するにはどうすればよいですか?あなたが欲しいよ...SQL 2008のHierarchyIDデータ型でカスケード削除を実行するにはどうすればよいですか?
私はそれについて移動する方法がわからない私は、CTEおよびhierarchyid型の関数を使用しなければならないと仮定しますが、
私はHierarchyIDをあまり使わなかったので、少し不安です。テーブルにHierarchyIDがある場合、カスケード削除を実行するにはどうすればよいですか?あなたが欲しいよ...SQL 2008のHierarchyIDデータ型でカスケード削除を実行するにはどうすればよいですか?
私はそれについて移動する方法がわからない私は、CTEおよびhierarchyid型の関数を使用しなければならないと仮定しますが、
トリガーベースのソリューションは、次のようになります
CREATE TRIGGER tr_Hierarchy_DeleteChildren
ON Hierarchy
FOR DELETE
AS
DELETE FROM Hierarchy
WHERE ID IN
(
SELECT DISTINCT h.ID
FROM deleted d
INNER JOIN Hierarchy h
ON h.ObjectNode.IsDescendantOf(d.ObjectNode) = 1
EXCEPT
SELECT ID
FROM deleted
)
EXCEPT
たちは、無限再帰ループで終わるしないことを保証します。私自身の実装では、トリガが実行されているコンテキスト情報に実際にフラグを設定し、トリガの開始時にこのフラグをチェックし、フラグがすでに設定されている場合は早期に戻ります。これは必ずしも必要ではありませんが、パフォーマンスはやや良いです。
あなたはトリガを使用したくない場合は別の方法として、あなたはストアドプロシージャに次のロジックを置くことができます:
CREATE PROCEDURE DeleteHierarchyTree
@ParentID hierarchyid
AS
DELETE FROM Hierarchy
WHERE ID.IsDescendantOf(@ParentID) = 1
それは最初にずっと簡単そうですが、人々が持っていることを心に留めておきますにはを覚えておいてください。あなたがトリガを持たず、誰かがSPを経由するのではなく、階層テーブル上に直接DELETE
を実行すると、それが遅すぎるまで誰も知らないうちに子供レコードを非常に簡単に孤立させることができます。
を(すなわち、「親」を削除するとき、すべての「子どもの削除) T-SQLのIsDescendantOfメソッドを見てください。このような何か:
はDECLAREの@ParentNodeHIDがhierarchyid型 SET @ParentNodeHID = HierarchyTable NodeHID.IsDescendantOf(@ParentNodeHID)= 1
(HierarchyTable
はDELETE [あなたがで削除を開始するノード] =階層が格納されている表)
**この方法では、ノードはそれ自身の子と見なされます。ですから、あなたが@ParentNodeHIDに渡すものはWHERE句の条件を満たすでしょう。
BOLの記事を見てみましょう:MS-ヘルプを://MS.SQLCC.v10/MS.SQLSVR.v10.en/s10de_6tsql/html/edc80444-b697-410f-9419-0f63c9b5618d.htm