Intereting Posts
Создайте представление, которое группирует некоторые данные, но не группирует другие данные Рекурсивный CTE – консолидировать даты начала и окончания Проверьте, существует ли временная таблица и удаляется ли она, прежде чем создавать временную таблицу Прослушивание SignalR sqlServer Интерпретация типов кодов в sys.objects в SQL Server СТАТИСТИКА SQL Server Напишите номер с двумя десятичными знаками SQL-сервер Используйте Tablediff для сравнения всех таблиц Выберите данные (join?) Только из одной таблицы, используя идентификатор из другой таблицы Можно ли сохранить порядок сортировки SQL Server в переменной? Преобразование данных строки в столбец SQL Server Сравните две версии хранимой процедуры Как изменить подключение по умолчанию к серверу в Visual Studio 2012 SQL Project? не удалось создать список полей для запроса Как передать нулевую переменную в хранимую процедуру SQL из C # .net-кода

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

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

Я предполагаю, что мне придется использовать функции CTE и HierarchyID, но не знаю, как это сделать …

Solutions Collecting From Web of "Как я могу сделать Cascading Delete с типом данных HierarchyID SQL 2008?"

Решение на основе триггера было бы:

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, он мог бы очень легко осилить ваши детские записи, не зная до тех пор, пока не станет слишком поздно.

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

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

DELETE HierarchyTable WHERE 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