Os gatilhos no PostgreSQL são procedimentos especiais que são executados ou acionados automaticamente quando ocorrem determinados eventos em uma tabela do banco de dados. Eles são usados para manter a integridade dos dados, aplicar regras comerciais e automatizar verificações ou transformações complexas.
Uso
Os acionadores são empregados para responder automaticamente a eventos como operações `INSERT`, `UPDATE` ou `DELETE` em uma tabela. Eles podem ser definidos para serem executados "ANTES", "DEPOIS" ou "DENTRO" do evento e, opcionalmente, podem ser condicionados ao fato de o evento ser bem-sucedido. Os acionadores podem ser definidos no nível da linha, sendo executados para cada linha afetada, ou no nível da instrução, sendo executados uma vez por instrução SQL.
Nessa sintaxe, `CREATE TRIGGER` define um novo acionador chamado `trigger_name` que chama uma função especificada `function_name` antes, depois ou em vez de um evento de modificação de dados em `table_name`.
Os acionadores interagem com os comandos de controle de transação, como `COMMIT` e `ROLLBACK`. Se um acionador causar um erro, a transação inteira normalmente será revertida, a menos que você a manipule explicitamente.
Exemplos
1. Acionador básico para auditoria
CREATETABLEaudit_log(
id SERIALPRIMARYKEY,
operation VARCHAR(10),
operation_time TIMESTAMPDEFAULTCURRENT_TIMESTAMP);CREATEORREPLACEFUNCTIONlog_insert()RETURNSTRIGGERAS $$
BEGININSERTINTOaudit_log(operation)VALUES('INSERT');RETURNNEW;END;
$$ LANGUAGE plpgsql;CREATETRIGGER insert_audit
AFTERINSERTON target_table
FOREACHROWEXECUTEFUNCTIONlog_insert();Tecnologia
Esse exemplo básico registra cada operação `INSERT` em `target_table` na tabela `audit_log`.
2. Acionador com lógica condicional
CREATEORREPLACEFUNCTIONcheck_salary()RETURNSTRIGGERAS $$
BEGINIFNEW.salary <OLD.salary THENRAISEEXCEPTION'Salary cannot be decreased!';ENDIF;RETURNNEW;END;
$$ LANGUAGE plpgsql;CREATETRIGGER salary_check
BEFOREUPDATEON employees
FOREACHROWEXECUTEFUNCTIONcheck_salary();Tecnologia
Esse acionador garante que o salário de um funcionário não possa ser reduzido durante uma operação de atualização.
3. Acionador em cascata
CREATEORREPLACEFUNCTIONdelete_cascade()RETURNSTRIGGERAS $$
BEGINDELETEFROM orders WHERE customer_id =OLD.id;RETURNOLD;END;
$$ LANGUAGE plpgsql;CREATETRIGGER cascade_delete
AFTERDELETEON customers
FOREACHROWEXECUTEFUNCTIONdelete_cascade();Tecnologia
Esse exemplo exclui automaticamente todos os pedidos associados a um cliente quando o cliente é removido.
Gerenciamento de acionadores
Para desativar ou eliminar um acionador quando ele não for mais necessário, você pode usar os seguintes comandos:
ALTERTABLE table_name DISABLETRIGGER trigger_name;DROPTRIGGER trigger_name ON table_name;Tecnologia
Para visualizar os acionadores existentes em um banco de dados, você pode consultar o catálogo do sistema `pg_trigger`.
Dicas e práticas recomendadas
Mantenha os acionadores simples. A lógica complexa pode levar a gargalos de desempenho e desafios de manutenção.
Faça um teste completo. Certifique-se de que seus acionadores funcionem conforme o esperado, testando-os em vários cenários.
Acionadores de documentos. Documente claramente a finalidade e a operação de cada acionador para ajudar futuros desenvolvedores.
Considere as permissões. Certifique-se de que os usuários que acionam os eventos tenham as permissões adequadas para executar as funções associadas.
Monitore o impacto no desempenho. Esteja ciente de que o uso extensivo de acionadores pode afetar o desempenho, especialmente em tabelas com muitas transações.
Evite acionadores recursivos. Os acionadores recursivos podem levar a loops infinitos e devem ser tratados com cautela.
Os gatilhos no PostgreSQL são procedimentos especiais que são executados ou acionados automaticamente quando ocorrem determinados eventos em uma tabela do banco de dados. Eles são usados para manter a integridade dos dados, aplicar regras comerciais e automatizar verificações ou transformações complexas.
Uso
Os acionadores são empregados para responder automaticamente a eventos como operações `INSERT`, `UPDATE` ou `DELETE` em uma tabela. Eles podem ser definidos para serem executados "ANTES", "DEPOIS" ou "DENTRO" do evento e, opcionalmente, podem ser condicionados ao fato de o evento ser bem-sucedido. Os acionadores podem ser definidos no nível da linha, sendo executados para cada linha afetada, ou no nível da instrução, sendo executados uma vez por instrução SQL.
Nessa sintaxe, `CREATE TRIGGER` define um novo acionador chamado `trigger_name` que chama uma função especificada `function_name` antes, depois ou em vez de um evento de modificação de dados em `table_name`.
Os acionadores interagem com os comandos de controle de transação, como `COMMIT` e `ROLLBACK`. Se um acionador causar um erro, a transação inteira normalmente será revertida, a menos que você a manipule explicitamente.
Exemplos
1. Acionador básico para auditoria
Esse exemplo básico registra cada operação `INSERT` em `target_table` na tabela `audit_log`.
2. Acionador com lógica condicional
Esse acionador garante que o salário de um funcionário não possa ser reduzido durante uma operação de atualização.
3. Acionador em cascata
Esse exemplo exclui automaticamente todos os pedidos associados a um cliente quando o cliente é removido.
Gerenciamento de acionadores
Para desativar ou eliminar um acionador quando ele não for mais necessário, você pode usar os seguintes comandos:
Para visualizar os acionadores existentes em um banco de dados, você pode consultar o catálogo do sistema `pg_trigger`.
Dicas e práticas recomendadas