Можно ли передавать параметры в триггер?
Можно ли передавать параметры триггерам, как в процедурах и функциях?
Если да, то можно ли вызвать триггер явно с этими параметрами?
Свободный перевод вопроса Can we pass parameters in triggers? от участника @Gok
Ответы (1 шт):
Tриггер срабатывает при наступлении DML события на объекте БД, на котором определен триггер. Это событие нельзя вызвать явно, единственный способ - выполнить DML запрос.
Передача параметров не является частью определения триггера.
Одно из самых простых решений -- передать параметры в переменной сессии. Для этого, переменная сессии должна быть установленна до наступления события DML.
Воспроизводимый пример:
create table t (id int, memo varchar2(96), dt date)
/
create or replace package pack as
type paramarr is table of varchar2 (32) index by varchar2 (8);
params paramarr;
end;
/
create or replace trigger tnewtrig before insert on t for each row
begin
:new.memo := 'triggered by '||user||' with params: param1='||
pack.params('param1')||' param2='||pack.params('param2');
:new.dt := sysdate;
end;
/
Запуск и результат:
exec pack.params := pack.paramarr ('param1' => 'val1', 'param2' => 'val2');
insert into t (id) values (1);
select * from t;
ID MEMO DT
---------- ---------------- -------------------
1 triggered by ME 2021-06-25 11:49:36
with params:
param1=val1
param2val2
Важно: следует учесть, что переменные сессии не транзакциональны, т.е. не следует в них хранить значения, подсчитанные в разных трнзакциях. При откате одной из транзакций, изменённое в этой транзакции заначение переменной сессии не откатится и по сути, станет недействительным.