sql >> Databasteknik >  >> RDS >> PostgreSQL

Utlöser utlösare vid uppdatering av kolumnA eller kolumnB eller kolumnC

Detta är ett missförstånd. WHEN satsen i triggerdefinitionen förväntar sig en boolean uttryck och du kan använda OR operatörer i den. Detta borde bara fungera (med tanke på att alla kolumner faktiskt finns i tabellen account_details ). Jag använder själv liknande triggers:

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();

Att utvärdera uttrycket har en liten kostnad, men det är förmodligen mer tillförlitligt än alternativet:

CREATE TRIGGER ... AFTER UPDATE OF email, username, password ...

Eftersom, per dokumentation:

En kolumnspecifik utlösare (en definierad med UPDATE OF column_name syntax) aktiveras när någon av dess kolumner är listade som mål i UPDATE kommandots SET lista. Det är möjligt för en kolumns värde att ändras även när utlösaren inte aktiveras, eftersom ändringar gjordes i radens innehåll av BEFORE UPDATE triggers beaktas inte. Omvänt, ett kommando som UPDATE ... SET x = x ... kommer att aktivera atrigger på kolumn x, även om kolumnens värde inte ändrades.

ROW typsyntax är kortare för att kontrollera på många kolumner (gör samma sak):

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 för att kontrollera alla synlig användarkolumn i raden:

...
WHEN (OLD IS DISTINCT FROM NEW)
...


  1. PostgreSQL skickar data från rekursiv CTE till funktion

  2. Kan inte hitta rubriken 'libpq-fe.h när du försöker installera pg gem

  3. verify_queryable_inventory returnerade ORA-20008:Timeout

  4. Implementera automatisk säkerhetskopiering och återställning av databas med standardmedel