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 de INSERT e UPDATE.
  • :OLD: Refere-se aos valores antigos que estão sendo modificados ou excluídos. Usado em triggers de UPDATE e DELETE.

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!

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Rolar para cima