>
> Можно ли решить задачку без помощи процедур или EXECUTE BLOCK?
> --
> Александр Замараев
Из практики внедрения ERP листочки в деревья нужно удалять
исключительно рекурсивными функциями Аккермана (как сказали выше -
триггерами).
В примитивной функции обрабатывается одно дерево. следовательно просто
делаем
CREATE OR ALTER TRIGGER TRIG$MY_TABLE_BD_000 FOR MY_TABLE
ACTIVE BEFORE DELETE POSITION 0
AS
BEGIN
DELETE FROM MY_TABLE FS WHERE (FS.PARENT_ID = OLD.ID);
END
Когда в деревянной таблице хранится более одного дерева,то накладываем
просто ограничение:
CREATE OR ALTER TRIGGER TRIG$MY_TABLE_BD_000 FOR MY_TABLE
ACTIVE BEFORE DELETE POSITION 0
AS
BEGIN
DELETE FROM MY_TABLE FS
WHERE (FS.PARENT_ID = OLD.ID)
AND ((FS.GROUP_ID+0) = OLD.GROUP_ID);
END
Все, при удалении любого узла рекурсивно удаляются все дочерние узлы.
Аналогично нужно написать и про UPDATE, если вдруг вздумается с какого-
либо перепугу поменять ID нода.
(лично я не даю юзверям редактировать ID, и вообще его редактирует
исключительно триггер на BEFORE INSERT вставляя значение из
генератора. Но триггеры все равно пишу, ибо вдруг кто-то полезет в
базу)