wil*_*lem 8 sql-server hierarchyid
我没有太多使用HierarchyID,所以我有点不确定.如果我的表有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
)
Run Code Online (Sandbox Code Playgroud)
在EXCEPT我们没有一个无限递归循环最终保证.在我自己的实现中,我实际上在触发器正在运行的上下文信息中设置了一个标志,然后在触发器的开头检查此标志并在标志已经设置的情况下提前返回.这不是必需的,但性能稍好一些.
或者,如果您不想使用触发器,则可以将以下逻辑放在存储过程中:
CREATE PROCEDURE DeleteHierarchyTree
@ParentID hierarchyid
AS
DELETE FROM Hierarchy
WHERE ID.IsDescendantOf(@ParentID) = 1
Run Code Online (Sandbox Code Playgroud)
一开始似乎要简单得多,但请记住,人们必须记住使用它.如果您没有触发器,并且某人直接DELETE在层次结构表上执行而不是通过SP,则可以非常轻松地孤立您的子记录而无需任何人知道,直到为时已晚.