Dette er en misforståelse. WHEN
klausulen i triggerdefinitionen forventer en boolean
udtryk, og du kan bruge OR
operatører i det. Dette skulle bare fungere (forudsat at alle kolonner faktisk findes i tabellen account_details
). Jeg bruger selv lignende triggere:
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();
Evaluering af udtrykket har en lille omkostning, men det er sandsynligvis mere pålideligt end alternativet:
CREATE TRIGGER ... AFTER UPDATE OF email, username, password ...
Fordi, pr. dokumentation:
En kolonnespecifik trigger (en defineret ved hjælp af UPDATE OF
column_name
syntaks) udløses, når nogen af dens kolonner er angivet som mål i UPDATE
kommandoens SET
liste. Det er muligt for en kolonnes værdi at ændre sig, selv når triggeren ikke udløses, fordi ændringer foretaget i rækkens indhold af BEFORE UPDATE
triggere tages ikke i betragtning. Omvendt kan en kommando såsom UPDATE ... SET x = x ...
vil udløse atrigger på kolonne x, selvom kolonnens værdi ikke ændrede sig.
ROW
type syntaks er kortere at kontrollere på mange kolonner (gør det samme):
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();
Eller for at tjekke for hver synlig brugerkolonne i rækken:
...
WHEN (OLD IS DISTINCT FROM NEW)
...