Старое и новое значение поля в триггере
Внутри тела триггера доступны специальные предопределенные переменные. Эти переменные имеют значение обрабатываемой
записи до и после выполнения триггерной операции. С точки зрения кода триггера эти значения имеют тип 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|