В Postgres 9.0 или более поздней версии добавьте предложение WHEN
к определению триггера (оператор CREATE TRIGGER
):
CREATE TRIGGER foo
BEFORE UPDATE
FOR EACH ROW
WHEN (OLD IS DISTINCT FROM NEW) -- parentheses required!
EXECUTE PROCEDURE ...;
Возможно только для триггеровBEFORE
/ AFTER
UPDATE
, где определены как OLD
, так и NEW
.Вы получите исключение, пытаясь использовать это предложение WHEN
с триггерами INSERT
или DELETE
.
И радикально упростить функцию триггера соответственно:
...
IF OLD.locked > 0 THEN
RAISE EXCEPTION 'Message';
END IF;
...
Нет необходимости проверять IF TG_OP='UPDATE' ...
, так как этот триггер работает только для UPDATE
.
Или переместите это условие также в предложение WHEN:
CREATE TRIGGER foo
BEFORE UPDATE
FOR EACH ROW
WHEN (OLD.locked > 0
AND OLD IS DISTINCT FROM NEW)
EXECUTE PROCEDURE ...;
Оставляя толькобезусловный RAISE EXCEPTION
в вашей триггерной функции, которая вызывается только при необходимости для начала.
Прочитайте мелкий шрифт:
В BEFORE
В триггере условие WHEN
оценивается непосредственно перед выполнением или выполнением функции, поэтому использование WHEN
существенно не отличается от проверки того же условия в начале функции триггера.В частности, обратите внимание, что строка NEW
, видимая условием, является текущим значением, которое, возможно, было изменено более ранними триггерами.Кроме того, условие WHEN
триггера BEFORE
не позволяет просматривать системные столбцы строки NEW
(например, oid
), поскольку они еще не были установлены.
InДля триггера AFTER
условие WHEN
оценивается сразу после обновления строки и определяет, стоит ли событие в очереди для запуска триггера в конце оператора.Таким образом, когда условие AFTER
триггера *1054* не возвращает true, нет необходимости ставить в очередь событие или повторно извлекать строку в конце оператора.Это может привести к значительному ускорению операторов, которые изменяют много строк, если триггер нужно запускать только для нескольких строк.
Related:
Также для обращения к заголовку вопроса
Можно ли динамически циклически проходить по столбцам таблицы?
Да.Примеры: