В таблице 1 у меня есть триггер 1, который вставляет в таблицу 3 с триггером 3, который использует результаты триггер 2 в таблице 2. Есть ли в Firebird 2.5 способ запускать триггер 1 в таблице 1 только после триггера 2 в таблице 2 ? Может быть, какое-то «ожидание триггера»?
firebird 2.5 ждать одного триггера от другого
Ответы (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. а>.