2009-07-29 4 views
7

Я не использовал HierarchyID, поэтому я немного не уверен. Если в моей таблице есть Иерархический идентификатор, как мне выполнить каскадное удаление? (Т.е. удалить все «дети» при удалении «родителя»)Как я могу сделать Cascading Delete с типом данных HierarchyID SQL 2008?

я предполагаю, я должен использовать функции КТР и hierarchyid` в, но не уверен, как идти об этом ...

ответ

5

триггер-решение будет:

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 

кажется намного проще в первом, но имейте в виду, что люди до использовать это. Если у вас нет триггера, а кто-то делает прямую DELETE в таблице иерархии вместо того, чтобы проходить через SP, он может очень легко осилить ваши дочерние записи, не зная до тех пор, пока не станет слишком поздно.

3

Вы хотите чтобы посмотреть на метод IsDescendantOf в T-SQL. Что-то вроде этого:

DECLARE @ParentNodeHID hierarchyid` в SET @ParentNodeHID = [узел вы хотите, чтобы начать удаление в]

УДАЛИТЬ HierarchyTable ГДЕ NodeHID.IsDescendantOf (@ParentNodeHID) = 1

(HierarchyTable = Таблица, где хранятся ваши иерархии)

** Имейте в виду, что с помощью этого метода узел считается дочерним по отношению к нему. Итак, все, что вы передадите в @ParentNodeHID, будет соответствовать условиям предложения WHERE.

Посмотрите на статью BOL: Ms-помощь: //MS.SQLCC.v10/MS.SQLSVR.v10.en/s10de_6tsql/html/edc80444-b697-410f-9419-0f63c9b5618d.htm

 Смежные вопросы

  • Нет связанных вопросов^_^