Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Дерево в БД - проблема при удалении узла [D7, FB 1.5.]


trubin ©   (2008-05-01 21:35:00) 

Здравствуйте, появилась вот проблемка:

имеется таблица в БД, в которой храниться древовидная структура, конкретнее эта таблица используется для хранения элементов файловой

системы. Кусок DDL:

CREATE TABLE FILES(
 ID          NUMERIC(18,0),  /*первичный ключ*/
 PARENT_ID   NUMERIC(18,0), /*ключ родителя*/
 CHILD_COUNT INTEGER,  /*количество потомков*/
 ...
);


имеется триггер after delete:

CREATE TRIGGER TR_AD_FILES_0 FOR FILES ACTIVE AFTER DELETE POSITION 0
AS
BEGIN
 /*УМЕНЬШАЕМ СЧЕТЧИК ПОТОМКОВ У РОДИТЕЛЯ*/
 IF (OLD.PARENT_ID > 0) THEN
   UPDATE FILES F
   SET F.CHILD_COUNT = F.CHILD_COUNT - 1
   WHERE F.ID = OLD.PARENT_ID;
 /*УДАЛЯЕМ ПОТОМКОВ ДАННОГО ЭЛЕМЕНТА*/
 DELETE FROM FILES F
   WHERE F.PARENT_ID = OLD.ID;
END
;


ПРОБЛЕМА:при удалении узла дерева имеющего множество потомков на многих уровнях вложенности выскакивает ошибка:
"Too many concurrent executions of the same request"

Это, я так понимаю из-за рекурсивного вызова триггером самого себя. Как бы этого избежать? Не хочется городить какие-то сложные

алгоритмы для удаления. Посоветуйте.


kaif   (2008-05-04 14:51:00) [1]

Скорее всего у тебя в дереве есть циклическая ссылка. То есть кто-то из потомков является предком одного из своих родителей. Или же предком самого себя. Скорее всего из-за этого и возникает у тебя бесконечная рекурсия.


sql   (2008-05-04 14:34:00) [2]


> trubin ©   (01.05.08 21:35)  


Несовсем понятно СУБД какая ?


Prohodil Mimo   (2008-05-04 14:28:00) [3]

PEAKTOP ©   (03.05.08 23:14) [8]
а почему нет? всё же происходит в одной транзакции.
С деревьями в FB не работал, а потому не пробовал. Можно чуть подробнее или ссылку на конкретнуу статью, почему нельзя ON DELETE CASCADE на версионнике FOREIGN KEY на саму себя?


PEAKTOP   (2008-05-03 23:14:00) [4]

> а ON DELETE CASCADE не помогает или это хуже триггера?
На версионнике ? Еще раз повторяю: не на блокировочнике, а на версионнике FOREIGN KEY на саму себя ?

> проблема была в данных
Деревья просто снятся но ночам :) в кошмарах ...


Prohodil Mimo   (2008-05-03 20:39:00) [5]

а ON DELETE CASCADE не помогает или это хуже триггера?


trubin   (2008-05-03 18:55:00) [6]


> PEAKTOP ©   (01.05.08 22:33) [1]


Ты прав, проблема была в данных. Но удаление потомков из триггера все-таки убрал - засунул в рекурсивную ХП.


trubin   (2008-05-02 10:55:00) [7]


> Поставь его на before delete

Сразу пробовал - та же картина


> MsGuns ©   (02.05.08 02:43) [4]
> Групповое удаление на само по себе опасная штука, а если
> оно еще зашито в триггер, то неприятности обеспечены


Это я понимаю, вот только сколько не гуглил, книжки не листал особо не помогает...

Буду думать :)


MsGuns   (2008-05-02 02:43:00) [8]

Групповое удаление на само по себе опасная штука, а если оно еще зашито в триггер, то неприятности обеспечены


DrPass   (2008-05-02 02:12:00) [9]

Поставь его на before delete


trubin   (2008-05-01 23:48:00) [10]


> Или данные в таблице корявые, или еще где-то триггер есть,
>  который ты не привел.


Триггер на delete один во всей базе


PEAKTOP   (2008-05-01 22:33:00) [11]

> "Too many concurrent executions of the same request"

Это где-то у тебя на триггере или ХП сервер рекурсивно в бесконечный цикл уходит. По умолчанию - не более 1000 уровней рекурсии положено.

Или данные в таблице корявые, или еще где-то триггер есть, который ты не привел.


Наверх

Титульная страница Поиск, карта сайта Написать письмо