
O que são Triggers?
Triggers são blocos de código PL/SQL executados automaticamente em resposta a eventos no banco de dados, como inserções, atualizações ou exclusões. Elas automatizam processos, garantem a integridade dos dados e aplicam regras de negócios, mantendo a consistência dos dados no Oracle.
Vantagens de Usar Triggers
- Automação de Processos: Permitem a execução automática de tarefas em resposta a eventos, como atualizar logs, calcular valores derivados ou sincronizar tabelas.
- Garantia de Integridade de Dados: Reforçam regras de negócios e garantem que os dados permaneçam consistentes e válidos, prevenindo inserções ou modificações inválidas.
- Auditoria e Monitoramento: Facilitam o rastreamento de mudanças nos dados, registrando automaticamente alterações em tabelas de auditoria.
- Desencadeamento de Ações Complexas: Executam várias instruções em resposta a um evento, como cálculos complexos ou atualizações em múltiplas tabelas.
- Flexibilidade e Modularidade: Adicionam lógica a eventos específicos sem a necessidade de modificar o código da aplicação.
Tipos de Triggers
Triggers em PL/SQL podem ser categorizadas de acordo com:
Tipo de Evento que as Dispara:
-
- DML Triggers (Data Manipulation Language): Disparadas por operações de INSERT, UPDATE ou DELETE.
- DDL Triggers (Data Definition Language): Disparadas por operações que alteram a estrutura do banco, como CREATE, ALTER e DROP.
- Logon/Logoff Triggers: Disparadas quando um usuário se conecta ou desconecta do banco de dados.
- Instead-of Triggers: Usadas principalmente com views complexas para gerenciar operações DML que normalmente não seriam permitidas.
Momento em que são Executadas:
-
- Before Triggers: Executadas antes que a operação DML seja aplicada.
- After Triggers: Executadas após a conclusão da operação DML.
- Instead-of Triggers: Executadas em vez da operação DML, frequentemente usadas em views.
Aplicabilidade:
-
- Row-level Triggers: Executadas uma vez para cada linha afetada pela operação.
- Statement-level Triggers: Executadas uma vez para a operação, independentemente do número de linhas afetadas.
Criando Triggers em PL/SQL
A criação de uma trigger envolve definir o tipo de evento que a dispara, o momento de execução e a ação que deve ser realizada. Abaixo estão exemplos básicos de cada tipo de trigger.
DML Triggers
Exemplo de Before Row-level Trigger (INSERT):
CREATE OR REPLACE TRIGGER verificar_salario BEFORE INSERT ON funcionarios FOR EACH ROW BEGIN IF :NEW.salario < 1000 THEN RAISE_APPLICATION_ERROR(-20001, 'Salário não pode ser inferior a 1000.'); END IF; END;
Esta trigger impede que registros com um salário inferior a 1000 sejam inseridos na tabela funcionarios
.
Exemplo de After Statement-level Trigger (UPDATE):
CREATE OR REPLACE TRIGGER log_update_funcionarios AFTER UPDATE ON funcionarios BEGIN INSERT INTO log_atualizacoes (data_hora, usuario, operacao) VALUES (SYSDATE, USER, 'UPDATE'); END;
Esta trigger registra no log todas as atualizações realizadas na tabela funcionarios
, inserindo a data, o usuário e o tipo de operação.
Exemplo de Before Row-level Trigger com OF
:
CREATE OR REPLACE TRIGGER verificar_alteracao_salario BEFORE UPDATE OF salario ON funcionarios FOR EACH ROW BEGIN IF :NEW.salario < 1000 THEN RAISE_APPLICATION_ERROR(-20002, 'Salário não pode ser inferior a 1000 após atualização.'); END IF; END;
Esta trigger é ativada somente quando a coluna salario
é alterada na tabela funcionarios
. Ela impede que o salário seja atualizado para um valor inferior a 1000.
DDL Triggers
Exemplo de Trigger para Criar Log de Criação de Tabelas:
CREATE OR REPLACE TRIGGER log_criacao_tabela AFTER CREATE ON SCHEMA BEGIN INSERT INTO log_ddl (usuario, operacao, nome_objeto, data_hora) VALUES (USER, 'CREATE TABLE', ORA_DICT_OBJ_NAME, SYSDATE); END;
Esta trigger cria um registro no log sempre que uma nova tabela é criada no esquema, registrando o usuário e o nome da tabela criada.
Logon/Logoff Triggers
Exemplo de Logon Trigger:
CREATE OR REPLACE TRIGGER log_logon AFTER LOGON ON DATABASE BEGIN INSERT INTO log_acessos (usuario, data_hora, acao) VALUES (USER, SYSDATE, 'LOGON'); END;
Esta trigger registra no log sempre que um usuário se conecta ao banco de dados, indicando o horário da conexão.
Instead-of Triggers
Exemplo de Instead-of Trigger para View:
CREATE OR REPLACE TRIGGER atualizar_view_funcionarios INSTEAD OF UPDATE ON vw_funcionarios FOR EACH ROW BEGIN UPDATE funcionarios SET nome = :NEW.nome, salario = :NEW.salario WHERE id = :OLD.id_funcionario; END;
Esta trigger permite a atualização da tabela funcionarios
através da view view_funcionarios
, substituindo a operação de UPDATE na view.
Observação: :NEW
e :OLD
não podem ser usados em triggers de INSERT
e DELETE
simultaneamente. Além disso, em triggers INSTEAD OF
, esses pseudoparametros são utilizados para referenciar os valores que seriam modificados pela operação original.
Trigger com Condição IF INSERTING
Triggers podem usar condições para verificar o tipo de evento que está ocorrendo. Por exemplo, você pode usar a condição IF INSERTING
para executar ações específicas apenas durante uma inserção:
CREATE OR REPLACE TRIGGER processar_operacoes BEFORE INSERT OR UPDATE OR DELETE ON funcionarios FOR EACH ROW BEGIN IF INSERTING THEN -- Código a ser executado apenas durante uma inserção DBMS_OUTPUT.PUT_LINE('Nova linha inserida.'); ELSIF UPDATING THEN -- Código a ser executado apenas durante uma atualização DBMS_OUTPUT.PUT_LINE('Linha atualizada.'); ELSIF DELETING THEN -- Código a ser executado apenas durante uma exclusão DBMS_OUTPUT.PUT_LINE('Linha excluída.'); END IF; END;
Esta trigger usa as condições IF INSERTING
, IF UPDATING
e IF DELETING
para executar diferentes blocos de código dependendo do tipo de operação que está sendo realizada. Isso permite personalizar o comportamento da trigger para diferentes eventos DML.
Observação:
:NEW
: Refere-se aos valores novos que estão sendo inseridos ou atualizados. Usado em triggers deINSERT
eUPDATE
.:OLD
: Refere-se aos valores antigos que estão sendo modificados ou excluídos. Usado em triggers deUPDATE
eDELETE
.
Considerações Finais
Triggers são ferramentas poderosas no Oracle para automatizar tarefas, garantir a integridade dos dados e facilitar a auditoria e o monitoramento. Compreender e utilizar adequadamente os diferentes tipos de triggers pode melhorar significativamente a robustez e a eficiência das suas aplicações em Oracle.
Se você tiver alguma dúvida ou sugestão, deixe um comentário abaixo!