В Oracle вы можете написать триггер уровня, указав предложение FOR EACH ROW
в инструкции CREATE TRIGGER
:
CREATE TRIGGER MY_FANCY_TRIGGER
BEFORE UPDATE ON MY_TABLE
FOR EACH ROW
BEGIN
IF :OLD.my_id_column > 4 AND :NEW.some_other_column <> 'foo' THEN
-- ...
END IF;
END;
Такой триггер позволяет просматривать версии до и после каждой затронутой строки (:OLD
и :NEW
соответственно). Например, следующий оператор заставит этот триггер выполнить один раз для каждой строки в MY_TABLE
:
UPDATE MY_TABLE SET some_other_column = 'bar';
Исключив предложение FOR EACH ROW
, триггер становится триггером уровня инструкций. Это означает, что он выполняется только один раз за оператор, независимо от того, сколько строк (если они есть) повлияло на оператор. К сожалению, триггеры уровня инструкций не имеют доступных переменных :OLD
и :NEW
(потому что количество затронутых строк много меняется).
Можно ли получить значения :OLD
и :NEW
для всех затронутых строк внутри триггера на уровне инструкций? У меня есть некоторая обработка, которую я бы предпочел только раз за один оператор.