Старое и новое значение поля в триггере

     

Внутри тела триггера доступны специальные предопределенные переменные. Эти переменные имеют значение обрабатываемой записи до и после выполнения триггерной операции. С точки зрения кода триггера эти значения имеют тип CURSOR, то есть для обращения к полю обрабатываемой записи используется конструкция < статус поля >.< имя поля >. < Имя поля > соответствует имени поля таблицы. < Статус поля > – идентифицирует новое или старое значение этого поля (указано во фразе OLD [AS] и NEW [AS] предложения CREATE TRIGGER, или OLD и NEW если OLD [AS] и NEW [AS] не заданы).

Внутри кода триггера, вызываемого перед модификацией строки таблицы, можно присваивать новые значения полям переменной NEW (или той, что указана в NEW AS). В этом случае они будут использоваться для формирования значения обрабатываемой записи как результата выполнения операции, с которой связан триггер.

Значения OLD и NEW определены не для всех триггеров. Так, в триггере на INSERT определено только значение NEW, а в триггере на DELETE – только OLD. В триггерах же на весь STATEMENT эти значения вообще не определены.

Для полей типа BLOB допускается работа с OLD и NEW значениями не более 4000 байт, при превышении указанного размера будет происходить усечение значения. В триггере с опцией AFTER UPDATE значение OLD поля BLOB-типа недоступно.

Пример

create or replace table journal(table_name char(66), operation char(20),row_id int,time date,comment char(100));
create or replace trigger check_auto before update on auto for each row execute
code
  if old.personid <  > new.personid then
    execute "select personid from person where personid= ?;" using new.personid; //
    if errcode() = 2 then
      execute "insert into journal values ('AUTO','UPDATE', ?,sysdate,'update to bad personid - IGNORED');" using old.personid; //
      return false; //
    endif; //
  endif; //
end;
update auto set personid = 1001 where personid = 2;
select * from journal;
|AUTO|UPDATE|2|03.11.2017:16:57:35|update to bad personid - IGNORED|