I have the code to fire a trigger only on an update of a single specific column. The trigger is used to fire a function that will raise a postgres \"notify\" event, which I
This is a misunderstanding. The WHEN clause of the trigger definition expects a boolean expression and you can use OR
operators in it. This should just work (given that all columns actually exist in the table account_details
). I am using similar triggers myself:
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();
Evaluating the expression has a tiny cost, but this is probably more reliable than the alternative:
CREATE TRIGGER ... AFTER UPDATE OF email, username, password ...
Because, per documentation:
A column-specific trigger (one defined using the
UPDATE OF
column_name
syntax) will fire when any of its columns are listed as targets in theUPDATE
command'sSET
list. It is possible for a column's value to change even when the trigger is not fired, because changes made to the row's contents byBEFORE UPDATE
triggers are not considered. Conversely, a command such asUPDATE ... SET x = x ...
will fire a trigger on column x, even though the column's value did not change.
ROW type syntax is shorter to check on many columns (doing the same):
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();
Or, to check for every visible user column in the row:
...
WHEN (OLD IS DISTINCT FROM NEW)
...