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 OFcolumn_namesyntax) aktiveras när någon av dess kolumner är listade som mål iUPDATEkommandotsSETlista. 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 UPDATEtriggers 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)
...