PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Auslösetrigger bei Aktualisierung von SpalteA oder SpalteB oder SpalteC

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