C'est un malentendu. Le WHEN
la clause de la définition du déclencheur attend un boolean
expression et vous pouvez utiliser OR
opérateurs en elle. Cela devrait fonctionner (étant donné que toutes les colonnes existent réellement dans la table account_details
). J'utilise moi-même des déclencheurs similaires :
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();
L'évaluation de l'expression a un coût minime, mais c'est probablement plus fiable que l'alternative :
CREATE TRIGGER ... AFTER UPDATE OF email, username, password ...
Parce que, selon la documentation :
Un déclencheur spécifique à une colonne (un déclencheur défini à l'aide de
UPDATE OF
column_name
syntaxe) se déclenchera lorsque l'une de ses colonnes sera répertoriée comme cible dans leUPDATE
SET
de la commande liste. Il est possible que la valeur d'une colonne change même lorsque le déclencheur n'est pas déclenché, car les modifications apportées au contenu de la ligne parBEFORE UPDATE
les déclencheurs ne sont pas pris en compte. A l'inverse, une commande telle queUPDATE ... SET x = x ...
déclenchera un déclencheur sur la colonne x, même si la valeur de la colonne n'a pas changé.
ROW
la syntaxe du type est plus courte pour vérifier sur plusieurs colonnes (en faisant la même chose) :
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();
Ou, pour vérifier tous colonne utilisateur visible dans la ligne :
...
WHEN (OLD IS DISTINCT FROM NEW)
...