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 deUPDATE
commando'sSET
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 doorBEFORE UPDATE
triggers worden niet in overweging genomen. Omgekeerd, een commando zoalsUPDATE ... 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)
...