Реферат: Иерархические структуры данных в реляционных БД
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable parent_level integer;
BEGIN
if (NEW."ID" is null) then NEW."ID" =GEN_ID(CATALOG_GEN,1);
/*Корневыеэлементыимеютуровень 1*/
if ((NEW."PARENT_ID" is NULL) and (NEW."LEVEL" <> 1)) then
exception WRONG_LEVEL;
/*Значение поля Level для некорневых элементов должно быть на 1 больше, чем у их родителя*/
if (NEW."PARENT_ID" is NOT NULL) THEN
begin
select "LEVEL" from "CATALOG" WHERE "ID" = NEW."PARENT_ID" into :parent_level;
if (NEW."LEVEL" <> :parent_level+1) then
exception WRONG_LEVEL;
end
END ^
/*
Триггер перед обновлением - контролирует правильность поля Level
*/
CREATE TRIGGER "CATALOG_BEFORE_UPD" FOR "CATALOG"
ACTIVE BEFORE UPDATE POSITION 0
AS
declare variable parent_level integer;
declare variable child_id integer;
BEGIN
if ((NEW."PARENT_ID" is NULL) and (NEW."LEVEL" <> 1)) then
exception WRONG_LEVEL;
select "LEVEL" from "CATALOG" WHERE "ID" = NEW."PARENT_ID" into :parent_level;
if (NEW."LEVEL" <> :parent_level+1) then