В 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
для всех затронутых строк внутри триггера уровня оператора? У меня есть некоторая обработка, которую я предпочел бы выполнять только один раз для каждого оператора.