Можно ли передавать параметры в триггер?

Можно ли передавать параметры триггерам, как в процедурах и функциях?
Если да, то можно ли вызвать триггер явно с этими параметрами?


Свободный перевод вопроса Can we pass parameters in triggers? от участника @Gok


Ответы (1 шт):

Автор решения: 0xdb

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                          

Важно: следует учесть, что переменные сессии не транзакциональны, т.е. не следует в них хранить значения, подсчитанные в разных трнзакциях. При откате одной из транзакций, изменённое в этой транзакции заначение переменной сессии не откатится и по сути, станет недействительным.

→ Ссылка