Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Рекурсивный триггер
|
|||
|---|---|---|---|
|
#18+
Мой вопрос очень хорошо описан здесь: http://www.tsqlsolutions.com/Articles/Index.cfm?ArticleID=23123 (но там само решение можно почитать, только если подписчик) у меня такое же дерево, так же устроена иерархия(ID, ParentID). Как же сделать триггер, чтобы при DELETE стирались и все ответвления? PS - SQL Server 2000 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.04.2002, 06:43 |
|
||
|
Рекурсивный триггер
|
|||
|---|---|---|---|
|
#18+
Все просто оказалось . Правда, насколько я понял, уровень вложения не может быть больше 32 - но в данном случае, это для меня не страшно. IF @@rowcount = 0 RETURN DELETE FROM L FROM [dbo].[tblStruct] AS L JOIN deleted AS D ON L.Parent_ID = D.Category_ID ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.04.2002, 12:16 |
|
||
|
Рекурсивный триггер
|
|||
|---|---|---|---|
|
#18+
Не, не совсем так просто . При таком раскладе: 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 Работает правильно, только ощущение что я как-то некрасиво это делаю . Кто сталкивался с подобным поделитесь опытом плз. Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.04.2002, 02:29 |
|
||
|
Рекурсивный триггер
|
|||
|---|---|---|---|
|
#18+
http://www.sql.ru/articles/article.php?id=303 http://www.sql.ru/articles/article.php?id=304 http://www.sql.ru/subscribe/066.shtml#1 http://www.sql.ru/subscribe/047.shtml#5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.04.2002, 12:16 |
|
||
|
|

start [/forum/topic.php?fid=46&msg=32027139&tid=1823200]: |
0ms |
get settings: |
4ms |
get forum list: |
9ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
42ms |
get topic data: |
5ms |
get forum data: |
1ms |
get page messages: |
23ms |
get tp. blocked users: |
1ms |
| others: | 212ms |
| total: | 301ms |

| 0 / 0 |
