PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Déclencher le déclencheur lors de la mise à jour de la colonne A ou de la colonne B ou de la colonne C

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 le UPDATE 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 par BEFORE UPDATE les déclencheurs ne sont pas pris en compte. A l'inverse, une commande telle que UPDATE ... 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)
...