sql >> Database >  >> RDS >> PostgreSQL

Activeer trigger bij update van columnA of ColumnB of ColumnC

Dit is een misverstand. De WHEN clausule van de triggerdefinitie verwacht een boolean uitdrukking en u kunt OR . gebruiken exploitanten daarin. Dit zou gewoon moeten werken (aangezien alle kolommen daadwerkelijk bestaan ​​in de tabel account_details ). Ik gebruik zelf soortgelijke 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();

Het evalueren van de uitdrukking kost weinig, maar dit is waarschijnlijk betrouwbaarder dan het alternatief:

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

Omdat, volgens documentatie:

Een kolomspecifieke trigger (een gedefinieerd met behulp van de UPDATE OF column_name syntaxis) wordt geactiveerd wanneer een van de kolommen wordt weergegeven als doelen in de UPDATE commando's SET lijst. Het is mogelijk dat de waarde van een kolom verandert, zelfs als de trigger niet wordt geactiveerd, omdat wijzigingen in de inhoud van de rij zijn aangebracht door BEFORE UPDATE triggers worden niet in overweging genomen. Omgekeerd, een commando zoals UPDATE ... SET x = x ... zal atrigger activeren op kolom x, ook al is de waarde van de kolom niet veranderd.

ROW type syntaxis is korter om op veel kolommen te controleren (doe hetzelfde):

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

Of, om te controleren op elke zichtbare gebruikerskolom in de rij:

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


  1. FROM trefwoord niet gevonden waar verwacht (Oracle SQL)

  2. 10 seconden toevoegen in current_timestamp SQL (Oracle)

  3. MAKEDATE() Voorbeelden – MySQL

  4. Installeer Web Server in Windows XP met Apache2, PHP5 en MySQL4 – Deel 4