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)
...