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
Boa noite Fábio.
ResponderExcluirVocê dá treinamento de plsql, Forms/reports particular ?