Este é um mal-entendido. O
WHEN
cláusula da definição do gatilho espera um boolean
expressão e você pode usar OR
operadores nele. Isso deve funcionar (dado que todas as colunas realmente existem na tabela account_details
). Eu mesmo estou usando gatilhos semelhantes: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();
Avaliar a expressão tem um custo pequeno, mas provavelmente mais confiável do que a alternativa:
CREATE TRIGGER ... AFTER UPDATE OF email, username, password ...
Porque, por documentação:
Um gatilho específico de coluna (um definido usando oUPDATE OF
column_name
sintaxe) será acionado quando qualquer uma de suas colunas estiver listada como alvos noUPDATE
comandoSET
Lista. É possível que o valor de uma coluna seja alterado mesmo quando o gatilho não é acionado, porque as alterações feitas no conteúdo da linha porBEFORE UPDATE
gatilhos não são considerados. Por outro lado, um comando comoUPDATE ... SET x = x ...
irá disparar o acionador na coluna x, mesmo que o valor da coluna não tenha sido alterado.
ROW
sintaxe de tipo é mais curta para verificar em muitas colunas (fazendo o mesmo):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();
Ou, para verificar todos coluna de usuário visível na linha:
...
WHEN (OLD IS DISTINCT FROM NEW)
...