>
> Можно ли решить задачку без помощи процедур или 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 вставляя значение из
генератора. Но триггеры все равно пишу, ибо вдруг кто-то полезет в
базу)

Ответить