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