PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Disparar acionador na atualização da colunaA ou ColunaB ou ColunaC


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 o UPDATE OF column_name sintaxe) será acionado quando qualquer uma de suas colunas estiver listada como alvos no UPDATE comando SET 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 por BEFORE UPDATE gatilhos não são considerados. Por outro lado, um comando como UPDATE ... 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)
...