Последовательный запуск триггеров
При попытке вставки записи в таблицу accounts, над ней должно пройти шифрование и должна добавиться новая запись в стороннюю таблицу с содержанием кода вставляемой записи и ключом шифрования. Для этого я решил сделать триггер. Дело в том, что таблица accounts уже имеет триггер, который генерирует уникальное значение. Я указываю, что хочу чтобы сперва генерировался PK, а потом вызывался уже новый триггер.
Для этого я изменил триггер PK:
CREATE OR REPLACE TRIGGER ACCOUNTS_Triger
before INSERT ON ACCOUNTS FOR each ROW
FOLLOWS trig_insert
BEGIN
:new.ACCOUNT_ID := ACCOUNTS_seq.nextval;
END;
Код нового триггера:
CREATE OR REPLACE TRIGGER trig_insert
BEFORE INSERT ON ACCOUNTS
FOR EACH ROW
DECLARE
p_key VARCHAR2(200);
BEGIN
dbms_output.put_line(:new.ACCOUNT_ID);
INSERT INTO ACCOUNTS_KEY VALUES(:new.ACCOUNT_ID, p_key);
END;
На текущий момент у меня происходит ошибка, которая гласит, что поле :new.ACCOUNT_ID содержит null.
Как мне изменить код, чтобы триггеры вызывались последовательно в заданном мной порядке?
Ответы (1 шт):
Ключевое слово FOLLOWS значит -- "следующий за ...". Проверьте порядок вызова триггеров:
create table accounts (account_id int)
/
create or replace trigger trig1 before insert on accounts for each row
begin
dbms_output.put_line('trig1: set new account_id');
:new.account_id := 1;
end;
/
create or replace trigger trig2
before insert on accounts for each row
follows trig1
begin
dbms_output.put_line('trig2: new account_id='||:new.account_id);
end;
/
Результат:
SQL> insert into accounts values (null);
trig1: set new account_id
trig2: new account_id=1
1 row created.