powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Рекурсивный триггер
4 сообщений из 4, страница 1 из 1
Рекурсивный триггер
    #32027126
Ilyasio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Мой вопрос очень хорошо описан здесь: http://www.tsqlsolutions.com/Articles/Index.cfm?ArticleID=23123 (но там само решение можно почитать, только если подписчик)
у меня такое же дерево, так же устроена иерархия(ID, ParentID). Как же сделать триггер, чтобы при DELETE стирались и все ответвления?
PS - SQL Server 2000
...
Рейтинг: 0 / 0
Рекурсивный триггер
    #32027139
Ilyasio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Все просто оказалось . Правда, насколько я понял, уровень вложения не может быть больше 32 - но в данном случае, это для меня не страшно.

IF @@rowcount = 0 RETURN

DELETE FROM L
FROM [dbo].[tblStruct] AS L JOIN deleted AS D
ON L.Parent_ID = D.Category_ID
...
Рейтинг: 0 / 0
Рекурсивный триггер
    #32027153
Ilyasio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не, не совсем так просто
. При таком раскладе:

IF @@rowcount = 0 RETURN

DELETE FROM L
FROM [dbo].[tblStruct] AS L JOIN deleted AS D
ON L.Parent_ID = D.Category_ID
получается так, что если удаленное ответвление не имеет "детей", то оно все равно удаляет своего "родителя"

Поэтому пришлось отимизировать так(добавил поле Is_Parent bit)

CREATE TRIGGER tgDeleteChilds ON [dbo].[tblStruct] FOR DELETE
AS
IF @@rowcount = 0 RETURN -- > stop recursion
DECLARE @pid int
DELETE FROM S
FROM [dbo].[tblStruct] AS S JOIN deleted AS D
ON D.Category_ID = S.Parent_ID
SET @pid = (SELECT TOP 1 Parent_ID FROM deleted)
-- > stop recursion if deleted is not a parent
IF (SELECT TOP 1 Is_Parent FROM deleted)=0 RETURN
exec spDismissParent @pid

Вот spDismissParent(проверяет остались ли "дети", если нет - SET Is_Parent=0 ):

CREATE PROCEDURE dbo.spDismissParent (@pid int)
AS
SELECT * FROM dbo.tblStruct WHERE Parent_ID=@pid
IF @@ROWCOUNT = 0
UPDATE dbo.tblStruct SET Is_Parent=0 WHERE Category_ID=@pid
GO

Работает правильно, только ощущение что я как-то некрасиво это делаю
. Кто сталкивался с подобным поделитесь опытом плз. Спасибо.
...
Рейтинг: 0 / 0
Рекурсивный триггер
    #32027160
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Рекурсивный триггер
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]