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
ouDROP TRIGGER
.