Как я могу сделать Каскадное удаление с типом данных HierarchyID SQL 2008?

<sarcasm> Обеспечивают специфические особенности и детали, и Вы получите точно, что Вы попросили, не, что Вы хотели .</sarcasm>

Серьезно, детали хороши в какой-то степени.

никогда не предполагают, что разработчик понимает Вашу торговлю или даже хочет изучить его. Я нашел многих, многие разработчики действительно не хотят понимать учет или radiatiological науки или безотносительно другой торговли, в которую Вы вовлечены. Если они действительно не торопятся для изучения, это только на самом поверхностном уровне.

Приземленные детали или решения, которые фундаментальны для Вашей торговли или рабочего процесса, не будут очевидны для разработчиков. Что-то столь же простое как поле или порядок вкладки на странице может потерянный на разработчике, потому что они никогда не должны были вводить Ваши данные. Или то, что две части данных связаны, может быть очевидно для Вас, но они могут казаться абсолютно разъединенными разработчику. Возможно, рабочий процесс соответствует определенному шаблону, кроме тех случаев, когда определенное событие или ситуация происходят...

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

8
задан willem 29 July 2009 в 07:45
поделиться

2 ответа

Раствор на основе триггера будет:

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
    )

, за исключением гарантирует, что мы не заканчиваемся в бесконечной рекурсивной цикле. В своих собственных реализациях я фактически устанавливаю флаг в контексте информацию о том, что триггер работает, а затем проверьте этот флаг в начале триггера и вернитесь рано, если флаг уже установлен. Это не нужно, но немного лучше для производительности.

В качестве альтернативы, если вы не хотите использовать триггер, вы можете поместить следующую логику в сохраненной процедуре:

CREATE PROCEDURE DeleteHierarchyTree
    @ParentID hierarchyid
AS
DELETE FROM Hierarchy
WHERE ID.IsDescendantOf(@ParentID) = 1

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

5
ответ дан 5 December 2019 в 19:02
поделиться

Вы захотите взглянуть на метод IsDescendantOf в T-SQL. Примерно так:

DECLARE @ParentNodeHIDierarchyid SET @ParentNodeHID = [узел, с которого вы хотите начать удаление]

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

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

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

Взгляните на статью BOL: ms-help: //MS.SQLCC.v10/MS.SQLSVR.v10.en/s10de_6tsql/html/edc80444-b697-410f-9419-0f63c9b5618d.htm

4
ответ дан 5 December 2019 в 19:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: