firebird 2.5 ждать одного триггера от другого

В таблице 1 у меня есть триггер 1, который вставляет в таблицу 3 с триггером 3, который использует результаты триггер 2 в таблице 2. Есть ли в Firebird 2.5 способ запускать триггер 1 в таблице 1 только после триггера 2 в таблице 2 ? Может быть, какое-то «ожидание триггера»?


person user2205473    schedule 01.05.2013    source источник


Ответы (1)


Нет, в Firebird 2.5 вы не можете указать, чтобы триггер запускался только после какого-либо другого триггера.

Порядок выполнения триггеров определяется порядком операторов, которые их запускают, т.е. если вы используете

INSERT INTO table2 ...
INSERT INTO table1 ...

тогда (ON INSERT) триггеры table2 выполняются перед table1. Если таблица имеет более одного триггера данного типа, то порядок определяется предложением POSITION объявления триггера.

Если вы не можете гарантировать порядок операторов INSERT, возможно, вы можете использовать триггер базы данных в качестве обходного пути — создайте триггер ON TRANSACTION COMMIT, в котором вы проверяете флаг, который вы установили в trigger2. Если флаг есть, выполните материал, для которого требуются данные, сгенерированные в файле trigger2. Для установки флага вы можете использовать RDB$ SET_CONTEXT с пространством имен USER_TRANSACTION. Что-то типа

CREATE TRIGGER trigger2 ACTIVE AFTER INSERT ON table2
AS
BEGIN
  RDB$SET_CONTEXT ('USER_TRANSACTION', 'doTrigger1', 1);
END

CREATE TRIGGER trigger1 ACTIVE ON TRANSACTION COMMIT
AS
BEGIN
  IF(RDB$GET_CONTEXT ('USER_TRANSACTION', 'doTrigger1') = 1)THEN BEGIN
     -- proccess data
  END
END

Полный синтаксис TRIGGER DDL см. в справочнике по языку Firebirds. .

person ain    schedule 01.05.2013