Pular para o conteúdo principal
Documentos
Sintaxe básicaFunções JSONAcionadoresGerenciamento de tabelas e esquemasFunções de cadeia de caracteresFunções matemáticasFunções de dataBancos de dadosÍndices

Acionadores AFTER do PostgreSQL

Os gatilhos no PostgreSQL são funções que são executadas automaticamente em resposta a eventos específicos em uma tabela, como INSERT, UPDATE ou DELETE. Um acionador AFTER é executado após a conclusão do evento de acionamento, permitindo que você acesse o estado final dos dados.

Uso

Os acionadores AFTER são usados quando você precisa executar ações após um evento de modificação de dados, garantindo que quaisquer operações dependentes ocorram somente após a conclusão bem-sucedida do evento inicial. Eles são definidos usando a instrução CREATE TRIGGER.


CREATE TRIGGER trigger_name
AFTER event [OR event ...]
ON table_name
FOR EACH ROW
EXECUTE FUNCTION function_name();

Nessa sintaxe, AFTER event especifica o evento (INSERT, UPDATE, DELETE) que ativa o acionador, e function_name() é a função a ser executada após o evento.

Exemplos

1. Acionador básico AFTER INSERT


CREATE OR REPLACE FUNCTION log_new_user()
RETURNS TRIGGER AS $$
BEGIN
  INSERT INTO user_logs(user_id, action, log_time)
  VALUES (NEW.id, 'User Created', NOW());
  RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER after_user_insert
AFTER INSERT ON users
FOR EACH ROW
EXECUTE FUNCTION log_new_user();

Este exemplo registra a entrada de um novo usuário em user_logs após uma inserção na tabela users.

2. Acionador AFTER UPDATE


CREATE OR REPLACE FUNCTION update_inventory_log()
RETURNS TRIGGER AS $$
BEGIN
  INSERT INTO inventory_logs(product_id, change, log_time)
  VALUES (NEW.product_id, NEW.quantity - OLD.quantity, NOW());
  RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER after_inventory_update
AFTER UPDATE ON inventory
FOR EACH ROW
EXECUTE FUNCTION update_inventory_log();

Esse acionador registra a alteração da quantidade de um produto em inventory_logs depois que a tabela inventory é atualizada.

3. Acionador AFTER DELETE com lógica condicional


CREATE OR REPLACE FUNCTION log_deleted_order()
RETURNS TRIGGER AS $$
BEGIN
  IF OLD.status = 'completed' THEN
    INSERT INTO order_logs(order_id, action, log_time)
    VALUES (OLD.id, 'Completed Order Deleted', NOW());
  END IF;
  RETURN OLD;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER after_order_delete
AFTER DELETE ON orders
FOR EACH ROW
EXECUTE FUNCTION log_deleted_order();

Esse exemplo registra a exclusão de pedidos concluídos da tabela orders, somente se o status do pedido for "concluído".

Dicas e práticas recomendadas

  • Use acionadores AFTER para operações dependentes. Aplique-as quando as ações subsequentes dependerem da conclusão da transação original.
  • Mantenha as funções de acionamento eficientes. Certifique-se de que a função executada pelo acionador seja otimizada para evitar a lentidão das transações.
  • Evite lógicas complexas. Simplifique a lógica dentro dos acionadores para manter a clareza e a facilidade de manutenção.
  • Teste os acionadores minuciosamente. Certifique-se de que os acionadores não afetem involuntariamente a lógica do aplicativo, testando-os de forma abrangente.
  • Documentar o comportamento do acionador. Mantenha uma documentação clara do que cada acionador foi projetado para fazer, especialmente em aplicativos maiores.
  • Monitore o impacto no desempenho. Use ferramentas de registro ou monitoramento para rastrear o impacto do desempenho dos acionadores nos bancos de dados de produção.
  • Compreender as interações das transações. Os acionadores AFTER fazem parte da transação; se ocorrer um erro na função do acionador, toda a transação poderá ser revertida.
  • Considere as limitações. Esteja ciente dos possíveis conflitos com restrições de chave estrangeira ou ações em cascata ao usar acionadores AFTER.
  • Gerenciar o ciclo de vida do acionador. Você sabe como desativar ou remover um acionador quando ele não for mais necessário usando ALTER TABLE ou DROP TRIGGER.