Páginas

23 de out. de 2012

Tipos de triggers no Oracle Database


Olá pessoal,

     No artigo de hoje vou apresentar e comentar a resposta da enquete que fiz em meu blog com a pergunta QUANTOS TIPOS DE TRIGGERS EXISTEM NO BD? (ver Figura 1) e que encerrou no dia 17/10/2012. Essa enquete tinha como objetivo gerar polêmica e dúvidas. A pergunta parece simples, mas poucas pessoas acertaram a resposta (4/28) e eu acredito que foi justamente pelo modo que ela foi feita (mesmo modo que é feito na prova de certificação 1Z0-144). Escolhi a questão sobre tipos de triggers, porque recentemente fiz o exame 1Z0-144 Oracle Database 11g: Program with PL/SQL (onde fui aprovado e me tornei PL/SQL Developer OCA) e tive que responder uma questão em que a pergunta tinha um enunciado semelhante. Para ajudar aqueles que prentendem se preparar para este exame, veremos adiante a resposta.

Figura 1 - Enquete "Quantos tipos de triggers existem no BD?"

     Quando nos deparamos com a pergunta quantos tipos de triggers existem no Oracle Database, a pergunta se refere a quantos tipos de triggers existem baseando-se no nível em que elas são disparadas. No Oracle Database, as triggers podem ser disparadas no nível de linha (Row level trigger) ou nível de instrução (Statement level trigger).

     O código de uma trigger em nível de linha é executado uma vez para cada linha da tabela em que está sendo realizada uma instrução SQL de INSERT, UPDATE ou DELETE, ou seja, se você executar uma instrução UPDATE que altera 10 linhas e que tem uma trigger associada, o código desta trigger será executado 10 vezes. Já  na trigger em nível de instrução, o seu código é executado apenas uma vez para qualquer instrução SQL, portanto, o código deste tipo de trigger seria executado apenas 1 vez para aquela instrução UPDATE que altera as 10 linhas! 

     Exemplo de trigger de linha:
           create or replace TRIGGER HR.TR_EMPLOYEES_JH 
               AFTER UPDATE OF JOB_ID ON HR.EMPLOYEES 
           REFERENCING OLD AS LA NEW AS LN
             FOR EACH ROW
           BEGIN
             -- insere historico de cargos anteriores do empregado
             INSERT INTO HR.JOB_HISTORY 
               (EMPLOYEE_ID, START_DATE, END_DATE, JOB_ID, DEPARTMENT_ID) 
             VALUES
               (:LA.EMPLOYEE_ID, :LA.HIRE_DATE, SYSDATE, :LA.JOB_ID, :LA.DEPARTMENT_ID);
           END;


     Exemplo de trigger de instrução:
           create or replace TRIGGER HR.TR_EMPLOYEES_LOG
               BEFORE DELETE ON HR.EMPLOYEES 
           REFERENCING OLD AS LA NEW AS LN  
           BEGIN    
             -- insere historico de cargos anteriores do empregado
             INSERT INTO HR.LOG_EMPREGADOS 
               (ID, DT_INCLUSAO, NM_USER, TP_OPERACAO) 
             VALUES
               (0, SYSDATE, USER, 'ALL');  
           EXCEPTION
             WHEN OTHERS THEN
               NULL;
           END;


     Para aprender mais sobre triggers, consulte os treinamentos abaixo:
          - Presencial: PL/SQL Essentials and Tuning;
          - Videoaulas: PL/SQL Essentials (ao ser adquirido na opção com suporte, você ganhará o módulo PL/SQL Tuning).

[]s
   

Um comentário:

  1. Boa noite Fábio.
    Você dá treinamento de plsql, Forms/reports particular ?

    ResponderExcluir