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 iUPDATE
kommandotsSET
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 avBEFORE UPDATE
triggers beaktas inte. Omvänt, ett kommando somUPDATE ... 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)
...