To nieporozumienie. WHEN
klauzula definicji wyzwalacza oczekuje boolean
wyrażenie i możesz użyć OR
operatorów w nim. To powinno po prostu działać (biorąc pod uwagę, że wszystkie kolumny faktycznie istnieją w tabeli account_details
). Sam używam podobnych wyzwalaczy:
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();
Ocena wyrażenia ma niewielki koszt, ale jest to prawdopodobnie bardziej wiarygodne niż alternatywa:
CREATE TRIGGER ... AFTER UPDATE OF email, username, password ...
Ponieważ zgodnie z dokumentacją:
Wyzwalacz specyficzny dla kolumny (zdefiniowany za pomocą UPDATE OF
column_name
składnia) zostanie uruchomiony, gdy którakolwiek z jego kolumn zostanie wymieniona jako cele w UPDATE
SET
polecenia lista. Możliwe jest, że wartość kolumny zmieni się, nawet gdy wyzwalacz nie zostanie uruchomiony, ponieważ zmiany wprowadzone w zawartości wiersza przez BEFORE UPDATE
wyzwalacze nie są brane pod uwagę. I odwrotnie, polecenie takie jak UPDATE ... SET x = x ...
uruchomi wyzwalacz w kolumnie x, nawet jeśli wartość kolumny nie uległa zmianie.
ROW
składnia typu jest krótsza, aby sprawdzić wiele kolumn (robi to samo):
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();
Lub, aby sprawdzić wszystkie widoczna kolumna użytkownika w wierszu:
...
WHEN (OLD IS DISTINCT FROM NEW)
...