Това е недоразумение. WHEN
клаузата на дефиницията на тригера очаква boolean
израз и можете да използвате OR
оператори в него. Това просто трябва да работи (като се има предвид, че всички колони действително съществуват в таблицата account_details
). Аз самият използвам подобни тригери:
CREATE TRIGGER trigger_update_account_details
AFTER UPDATE ON account_details
FOR EACH ROW
WHEN (OLD.email IS DISTINCT FROM NEW.email
OR OLD.username IS DISTINCT FROM NEW.username
OR OLD.password IS DISTINCT FROM NEW.password)
EXECUTE PROCEDURE notify_insert_account_details();
Оценяването на израза има малка цена, но това вероятно е по-надеждно отколкото алтернативата:
CREATE TRIGGER ... AFTER UPDATE OF email, username, password ...
Защото според документация:
Специфичен за колона тригер (дефиниран с помощта на
UPDATE OF
column_name
синтаксис) ще се задейства, когато някоя от колоните му е изброена като цели вUPDATE
SET
на командата списък. Възможно е стойността на колона да се промени дори когато тригерът не се задейства, тъй като промените, направени в съдържанието на реда отBEFORE UPDATE
тригерите не се разглеждат. Обратно, команда катоUPDATE ... SET x = x ...
ще задейства атригер в колона x, въпреки че стойността на колоната не се е променила.
ROW
Синтаксисът на типа е по-кратък за проверка на много колони (прави същото):
CREATE TRIGGER trigger_update_account_details
AFTER UPDATE ON account_details
FOR EACH ROW
WHEN ((OLD.email, OLD.username, OLD.password, ...)
IS DISTINCT FROM
(NEW.email, NEW.username, NEW.password, ...))
EXECUTE PROCEDURE notify_insert_account_details();
Или, за да проверите за всеки видима потребителска колона в реда:
...
WHEN (OLD IS DISTINCT FROM NEW)
...