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

Udløser udløser ved opdatering af kolonne A eller KolonneB eller KolonneC

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


  1. Sådan sammenlignes to tabeller kolonne for kolonne i orakel

  2. harMange ringet med noget, der ikke er en forekomst af Sequelize.Model

  3. Hvornår skal jeg bruge Start/End Blocks og Go nøgleordet i SQL Server?

  4. Fejl ved push af data til Heroku:tidszoneforskydning uden for rækkevidde