Banner Hospedagem de Sites
09/06/2020

Aplicação Gatilhos Triggers ORACLE

Decerto, o principal foco da Aplicação Gatilhos Triggers ORACLE é o de possibilitar o disparo de determinadas programações através do monitoramento de ações em tabelas de dados.

Introdução: Aplicação Gatilhos Triggers ORACLE

Enquanto um procedimento (procedure) ou uma função (function) são disparadas, acionadas por uma chamada explícita, ou seja, o usuário para acionar essas programações precisa fazer uma chamada direta a programação que deseja executar.

Então a Trigger é disparada implicitamente  pela aplicação de um dos comando da Linguagem de Manipulação de Dados, do inglês Data Manipulation Language (DML): INSERT, UPDATE, ou DELETE, aplicados a uma determinada tabela de dados monitorada por esse recurso.

Assim, uma Trigger é disparada automaticamente, quando um dos eventos citados ocorre em uma tabela de dados que está sendo monitorada por esse objeto.

Aplicações

Primeiramente, as principais aplicações de uma Trigger têm relação ao tratamento de consistências, segurança e restrições relacionadas aos dados de um banco de dados.

Então, algumas atividades são citadas, como segue:

  • Primeiro, criar validações que envolvam pesquisa, ou pesquisas em uma ou várias tabelas relacionadas ou não;
  • Segundo, implantação de logs para registrar modificações nos dados de tabelas;
  • Terceiro, atualizar outras tabelas em função da aplicação dos comandos INSERT, UPDATE ou DELETE em uma determinada tabela;
  • Quarto, forçar a implantação de alguma regra de integridade de uma das colunas;
  • Entre outras aplicações.

Restrições

Pois é importante notar que existem algumas restrições para aplicação de uma Trigger, são elas:

  • Desse modo, a aplicação dos comandos COMMIT, ROLLBACK ou SAVEPOINT;
  • Nesse sentido, também tem a restrição quanto acionar programações PROCEDURES ou FUNCTIONS que contenham os comandos COMMIT, ROLLBACK ou SAVEPOINT;
  • Uma Trigger não pode modificar o conteúdo da tabela que monitora, pois isso gera uma mutação;
  • Por conseqüência, não permite alterar chaves primárias, únicas ou estrangeiras;
  • Por outro lado, em alguns bancos de dados existem limitações do tamanho do código que pode ser inserido em uma Trigger.

Contudo, o termo mutação é usado quando o conteúdo de um registro está sendo alterado por um comando INSERT, UPDATE ou DELETE, mas um comando anterior (INSERT, UPDATE ou DELETE) ainda não foi concluído.

Sintaxe

CREATE OR REPLACE TRIGGER nome_da_trigger 
   {BEFORE / AFTER} 
   DELETE OR INSERT OR UPDATE OF ( nome_coluna_1, nome_coluna_n ) 
   ON nome_da_tabela 
   REFERENCING [OLD AS antigo] [NEW as novo] 
   FOR EACH { ROW | STATEMENT }
   WHEN ( condição )
DECLARE        
   variáveis, constantes, ... 
BEGIN        
   bloco PL/SQL; 
END;

     Explicação Diretivas:

  • OR REPLACE – recria a Trigger, caso a mesma já exista (opcional).
  • nome_da_trigger – nome com o qual a trigger será criada.
  • BEFORE – dispara a programação da Trigger antes de executar o comando que a acionou.
  • AFTER – dispara a programação da Trigger depois de executar o comando que a acionou. Não é possível especificar AFTER em uma view, tanto normal quanto materializada.
  • DELETE – dispara a Trigger quando um comando DELETE é executado na tabela monitorada.
  • INSERT – dispara a Trigger quando um comando INSERT é executado na tabela monitorada.
  • UPDATE  – dispara a Trigger quando um comando UPDATE é executado na tabela monitorada. Quando a cláusula OF é omitida, qualquer coluna que sofrer uma alteração disparará a Trigger, já se usar a cláusula OF e especificar uma coluna, ou algumas colunas na tabela monitorada a Trigger só será disparada se essas colunas sofrerem alterações.
  • ON nome_da_tabela – Específica o nome da tabela que será monitorada pela Trigger.

Outras Diretivas:

  • REFERENCING – Específica os nomes de correlação para se referenciar ao valor antes (OLD), ou depois (NEW) dentro da Trigger (opcional).
  • FOR EACH ROW – Designará a Trigger para tratamento por linha, assim disparando a Trigger a cada linha que for afetada.
  • FOR EACH STATEMENT- Designará a Trigger para tratamento por instrução, assim disparando a Trigger uma vez por comando aplicado, independentemente se afetou nenhuma, uma ou várias linhas (não é uma boa opção para usar em logs).
  • WHEN ( condição ) – especifica a restrição da Trigger, ou seja uma condição que precisa ser atendida para que a Trigger seja disparada. Só pode ser ativada para uma Trigger FOR EACH ROW (por linha) (opcional).
  • BLOC PL/SQL – É a programação que será executada no disparo da Trigger.

Resumo Diretivas

Resumindo, são tratadas em uma Trigger as dimensões Tempo, Eventos de Disparo e Tipo:

  • Tempo:
    • Before: antes do evento de disparo da Trigger.
    • After: depois do evento de disparo da Trigger.
  • Eventos de Disparo:
    • Insert
    • Update (colunas devem ser especificadas)
    • Delete
  • Tipo:
    • Instrução: manipula um grupo de dados dentro de uma tabela e executa uma única vez. 
    • Linha: manipula linhas de uma tabela e pode ser executada uma ou mais vezes.

Regras para criação de Triggers:

  • principalmente, é necessário saber  que o número máximo de triggers possíveis em uma tabela é 12:
    •   1 – BEFORE UPDATE linha
    •   2 – BEFORE UPDATE comando
    •   3 – BEFORE DELETE linha
    •   4 – BEFORE DELETE comando
    •   5 – BEFORE INSERT linha
    •   6 – BEFORE INSERT comando
    •   7 – AFTER UPDATE linha
    •   8 – AFTER UPDATE comando
    •   9 – AFTER DELETE linha
    • 10 – AFTER DELETE comando
    • 11 – AFTER INSERT linha
    • 12 – AFTER INSERT comando

Predicados:

Uma vez que, há o monitoramento de mais de um comando na mesma Trigger, exemplo, está monitorando o INSERT, o UPDATE e o DELETE, é necessário o uso de predicados no bloco de programação para identificar qual dos comandos disparou a Trigger:

  • Inserting
  • Updating
  • Deleting

Sob o mesmo ponto de vista, dentro de uma trigger de linha, pode ser feito o controle de valores antes e depois da aplicação do evento, para isso é importante entender o funcionamento do valor OLD e NEW:

EVENTOOLDNEW
INSERTNULLVALOR INSERIDO
UPDATEVALOR ANTES DA ALTERAÇÃOVALOR DEPOIS DA ALTERAÇÃO
DELETEVALOR ANTES DA EXCLUSÃONULL

Experimento Prático

Primeiro passo

Por conseguinte, para realizar o experimento prático será usada uma tabela FUNCIONARIO.

CREATE TABLE FUNCIONARIO(
    ID NUMBER(5) PRIMARY KEY,
    NOME VARCHAR2(120) NOT NULL,
    GENERO CHAR(1) NOT NULL,
    SALARIO NUMBER(10,2) NOT NULL,
    CONSTRAINT CK_GENERO_FUNC CHECK (GENERO IN ('M', 'F'))
);

Segundo passo

Será criada uma Trigger para controlar o teto máximo de salário que um funcionário pode receber. Onde em qualquer inclusão de valor na coluna SALARIO (INSERT), ou qualquer alteração do valor da coluna SALARIO, seja monitorada por essa Trigger e cancele a operação (não permita o INSERT ou UPDATE), se o valor for superior a 9000.

CREATE OR REPLACE TRIGGER TRG_VALIDARSALARIO
BEFORE INSERT OR UPDATE OF SALARIO
ON FUNCIONARIO
FOR EACH ROW
BEGIN
    IF :NEW.SALARIO > 9000 THEN
        RAISE_APPLICATION_ERROR(-20000, 'SALARIO ACIMA VALOR PERMITIDO');
    END IF;
END;

A Trigger acima tem objetivo de validar valor em uma determinada coluna de uma tabela de dados, em caso de operações de inclusão ou alteração de valores nesta.

No caso, qualquer INSERT ou UPDATE aplicado na tabela FUNCIONARIO será monitorada.

Entretanto, havendo qualquer INSERT o código da Trigger será disparado e executado, verificando se o valor da coluna SALARIO é maior que 9000, se for usara a PROCEDURE interna do ORACLE: RAISE_APPLICATION_ERROR, que tem foco mostrar uma mensagem de erro, dessa forma não efetivando o comando INSERT aplicado.

Contudo, o código da Trigger só será disparado e executado em um UPDATE, quando o mesmo interferir no valor da coluna SALARIO. Fazendo a mesma checagem, se for maior que 9000 o valor passado para esta coluna, anulará o UPDATE com o disparo de um erro.

Terceiro passo

Para testar a efetividade no caso da inclusão, o INSERT abaixo será aplicado:

INSERT INTO FUNCIONARIO (ID, NOME, GENERO, SALARIO) 
        VALUES (1,'MARIA SOUZA', 'F', 9500);

No caso, este INSERT disparará o erro, pois o valor da coluna SALARIO supera o valor de 9000:

ORA-20000: SALARIO ACIMA VALOR PERMITIDO 

Quarto passo

Para testar o UPDATE, será aplicado um INSERT com o valor abaixo dos 9000, isso confirmará que o registro será gravado se não infringir a regra; e dará possibilidade de usar o registro para testar a regra em um UPDATE:

INSERT INTO FUNCIONARIO (ID, NOME, GENERO, SALARIO) 
        VALUES (1,'MARIA SOUZA', 'F', 7000);

Após efetivado o INSERT, para verificar a checagem em um UPDATE, a seguinte instrução é aplicada:

UPDATE FUNCIONARIO SET SALARIO = 12000 WHERE ID = 1;

Assim, tendo como resultado o erro esperado:

ORA-20000: SALARIO ACIMA VALOR PERMITIDO 

Em contra partida, se o valor for menor que 9000, o UPDATE será efetivado.

Por fim, com este experimento comprova um dos usos para a Trigger, que é ajudar a realizar validações de valores para as colunas, ou seja regras de valores.

Conclusão: Aplicação Gatilhos Triggers ORACLE

Concluindo, este artigo aborda a Aplicação de Gatilhos Triggers banco dados ORACLE, apresentando e demonstrando o uso deste recurso no banco de dados em estudo.

Por fim, clique aqui e acesse outros artigos relacionado à banco de dados.

Share

Luis Alexandre da Silva

Professor e Consultor de tecnologia em desenvolvimento de sistemas.Possui mestrado em Ciência da Computação pela UNESP (2016), especialização em Gestão Integrada de Pessoas e Sistemas de Informação pela FIB (2008) e graduação em Análise de Sistemas pela Universidade do Sagrado Coração (1997).Por fim, tem experiência em Gerenciamento de Projetos, Linguagens de Programação e Banco de Dados. Atuando principalmente nos seguintes temas: ensino, gerenciamento de projetos, ITIL, Desenvolvimento WEB e processos BPO.

Você pode querer ver também...

Deixe um comentário

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