Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Каскадное удаление данных из одной таблицы.  [new]
Dimidroll93
Member

Откуда:
Сообщений: 3
Есть таблица, в которой хранится древовидная структура.
Например,

CREATE TABLE [dbo].[Stages]
[StageID] [int] IDENTITY(1,1) NOT NULL,
[ParentStageID] [int] NULL,
GO

Соответственно, есть ограничение внешнего ключа таблицы сама на себя для описания древовидной структуры
ALTER TABLE [dbo].[Stages] WITH CHECK ADD CONSTRAINT [FK_Stages_Stages] FOREIGN KEY([ParentStageID])
REFERENCES [dbo].[Stages] ([StageID])

Нужно обеспечить каскадное удаление всех потомков, при этом помним, что триггеры AFTER проверяются после ограничений, а триггер INSTEAD OF выполняется только один раз для таблицы.
Есть какие-нибудь здравые мысли или ссылки?
2 фев 12, 18:37    [12021936]     Ответить | Цитировать Сообщить модератору
 Re: Каскадное удаление данных из одной таблицы.  [new]
полно
Guest
Dimidroll93
Есть таблица, в которой хранится древовидная структура.
Например,

CREATE TABLE [dbo].[Stages]
[StageID] [int] IDENTITY(1,1) NOT NULL,
[ParentStageID] [int] NULL,
GO

Соответственно, есть ограничение внешнего ключа таблицы сама на себя для описания древовидной структуры
ALTER TABLE [dbo].[Stages] WITH CHECK ADD CONSTRAINT [FK_Stages_Stages] FOREIGN KEY([ParentStageID])
REFERENCES [dbo].[Stages] ([StageID])

Нужно обеспечить каскадное удаление всех потомков, при этом помним, что триггеры AFTER проверяются после ограничений, а триггер INSTEAD OF выполняется только один раз для таблицы.
Есть какие-нибудь здравые мысли или ссылки?

1. рекурсивный CTE
2. hierarchyid
3. таблица со всеми родителями (id-parent-level)
2 фев 12, 18:41    [12021959]     Ответить | Цитировать Сообщить модератору
 Re: Каскадное удаление данных из одной таблицы.  [new]
Dimidroll93
Member

Откуда:
Сообщений: 3
Спасибо за совет!

1. Побежал разбираться.
2. Я так понял это добавить идентификатор иерархии к каждой записи и удалять всю иерархию? Не очень нравится ввод дополнительного поля.
3. Добавление лишней таблицы не очень правильно с идеологической точки зрения. Наверное, это выход, но мне как-то не айс.

Да и еще, тот кто удаляет записи, знает только команду
DELETE FROM Stages WHERE StageID=[XX]

Похоже, что правильным решением будет рекурсивный CTE совместно с триггером INSTEAD OF.
2 фев 12, 19:25    [12022115]     Ответить | Цитировать Сообщить модератору
 Re: Каскадное удаление данных из одной таблицы.  [new]
Dimidroll93
Member

Откуда:
Сообщений: 3
Решение.

CREATE TRIGGER [dbo].[HierarchyStageDeletion]
ON [dbo].[Stages]
INSTEAD OF DELETE
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;

WITH DirectReports (StageID, ParentStageID, HierarchyLevel)
AS
(
SELECT s.StageID, s.ParentStageID,0 as HierarchyLevel
FROM Stages as s
INNER JOIN Deleted ON s.StageID=Deleted.StageID
UNION ALL
SELECT s.StageID, s.ParentStageID, HierarchyLevel+1
FROM Stages as s
INNER JOIN DirectReports as d ON s.ParentStageID = d.StageID
)
DELETE FROM Stages
WHERE StageID IN
(SELECT x.StageID FROM (SELECT TOP 100 PERCENT * FROM DirectReports ORDER BY HierarchyLevel DESC) AS x)
END
2 фев 12, 20:35    [12022359]     Ответить | Цитировать Сообщить модератору
 Re: Каскадное удаление данных из одной таблицы.  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
Древний баян, вообще-то
2 фев 12, 21:20    [12022473]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить