PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Attivatore di attivazione all'aggiornamento della colonna A o della colonna B o della colonna C

Questo è un malinteso. Il WHEN la clausola della definizione del trigger prevede un boolean espressione e puoi usare OR operatori in esso. Dovrebbe funzionare (dato che tutte le colonne esistono effettivamente nella tabella account_details ). Sto usando trigger simili io stesso:

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();

La valutazione dell'espressione ha un costo minimo, ma è probabilmente più affidabile rispetto all'alternativa:

CREATE TRIGGER ... AFTER UPDATE OF email, username, password ...

Perché, secondo la documentazione:

Un trigger specifico per la colonna (definito utilizzando UPDATE OF column_name sintassi) si attiverà quando una qualsiasi delle sue colonne è elencata come target in UPDATE SET del comando elenco. È possibile che il valore di una colonna cambi anche quando il trigger non viene attivato, perché le modifiche apportate al contenuto della riga da BEFORE UPDATE i trigger non vengono considerati. Al contrario, un comando come UPDATE ... SET x = x ... si attiverà atrigger sulla colonna x, anche se il valore della colonna non è cambiato.

ROW la sintassi del tipo è più breve per controllare molte colonne (facendo lo stesso):

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();

Oppure, per controllare ogni colonna utente visibile nella riga:

...
WHEN (OLD IS DISTINCT FROM NEW)
...