Dies ist ein Missverständnis. Das WHEN
-Klausel der Triggerdefinition erwartet einen boolean
Ausdruck und Sie können OR
verwenden Betreiber darin. Dies sollte einfach funktionieren (vorausgesetzt, dass alle Spalten tatsächlich in der Tabelle account_details
vorhanden sind ). Ich verwende selbst ähnliche Trigger:
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();
Das Auswerten des Ausdrucks ist mit geringen Kosten verbunden, aber dies ist wahrscheinlich zuverlässiger als die Alternative:
CREATE TRIGGER ... AFTER UPDATE OF email, username, password ...
Denn laut Dokumentation:
Ein spaltenspezifischer Trigger (einer, der mit UPDATE OF
definiert wurde column_name
syntax) wird ausgelöst, wenn eine seiner Spalten als Ziele in UPDATE
aufgeführt ist SET
des Befehls aufführen. Es ist möglich, dass sich der Wert einer Spalte ändert, auch wenn der Trigger nicht ausgelöst wird, da Änderungen am Inhalt der Zeile durch BEFORE UPDATE
vorgenommen wurden Trigger werden nicht berücksichtigt. Umgekehrt ein Befehl wie UPDATE ... SET x = x ...
wird einen Trigger auf Spalte x auslösen, obwohl sich der Wert der Spalte nicht geändert hat.
ROW
type-Syntax ist kürzer, um viele Spalten zu überprüfen (das Gleiche tun):
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();
Oder um nach alle zu suchen sichtbare Benutzerspalte in der Zeile:
...
WHEN (OLD IS DISTINCT FROM NEW)
...