Banco de Dados 2 Prof. Dr. Sylvio Barbon Junior [email protected] Banco de Dados 2 – Aula 7 TRIGGER Sumário: 1) Visão Geral dos Triggers; 2) Boas Práticas do uso dos Triggers; 3) Privilégios necessários para o uso dos Triggers; 4) Criando Triggers; 5) Codificando o corpo do Trigger; 6) Obtendo informações sobre o Trigger; 7) Ativando e Desativando o Trigger; 8) Exemplos; Banco de Dados 2 – Aula 7 TRIGGER 1) Visão Geral - É um programa armazenado no banco de dados que é disparado (executado) em resposta a um evento; - O evento que dispara o trigger pode estar associado a uma tabela, view ou database, exemplo: - DML: DELETE, INSERT ou UPDATE; - DDL: CREATE, ALTER ou DROP; - Operações: SERVERERROR, LOGON, LOGOFF ETC. Banco de Dados 2 – Aula 7 TRIGGER 1) Visão Geral – – – – – DML Trigger: Disparado por comando DML (DELETE, INSERT ou UPDATE); DDL Trigger: Disparado por comando DDL (CREATE, ALTER ou DROP); INSTEAD OF Trigger é um DML Trigger definido em uma VIEW; SYSTEM Trigger, associados a um usuários e a diversas operações que podem ser realizadas; As triggers pode ser disparadas nos seguintes pontos: • Antes da execução de uma operação (BEFORE); • Após a execução de uma operação (AFTER); • Antes de cada linha afetada por uma operação (BEFORE each ROW); • Depois da execuação da operação, linha a linha (AFTER each ROW); Banco de Dados 2 – Aula 7 TRIGGER 1) Visão Geral – – Os Triggers podem ter 2 estados: • Ativado (Enabled) • Desativado (Disabled) Usos comuns para os Triggers: • Automaticamente gerar valores à elementos derivados; • Reforçar a integridade referencial em nós de bases distribuídas; • Reforçar regras de negócios complexas; • Criar sistemas de log transparentes; • Promover auditoria; • Manter a sincronização de tabelas replicadas; • Adquirir estatísticas do uso de tabelas; • Ajustar valores antes da persistência; • Restringir operações considerando horário ou outra informação; • Reforçar a segurança e previnir transações Banco de Dados 2 – Aula 7 TRIGGER 2) Boas Práticas no uso dos Triggers – – – – Use os triggers para garantir que certa operação será realizada automaticamente; Não crie um trigger que pode ser utilizado com uma solução mais simples: • Não defina um trigger para rejeitar algum dado incorreto, utilize para isso as constraints; • A Oracle recomenda o uso dos triggers para restringir data nas seguintes situações: » Bases Distribuídas; » Regras Complexas de Validação; » Quando a restrição não se aplica a uma constraint: NOT NULL, UNIQUE, PK, FK, CHECK, DELETE CASCADE ou DELETE SET NULL; O comprimento de um código de Trigger não pode passar de 32K Não crie Triggers recursivos; Banco de Dados 2 – Aula 7 TRIGGER 3) Privilégios para o uso dos Triggers – É necessário o privilégio CREATE TRIGGER; GRANT CREATE TRIGGER TO USUARIO; – É necessário ter privilégios de acesso a tabela em questão. Banco de Dados 2 – Aula 7 TRIGGER 4) Criando Triggers CREATE OR REPLACE TRIGGER Imprimir_Diferenca_Trigger BEFORE DELETE OR INSERT OR UPDATE ON Empregado FOR EACH ROW WHEN (NEW.EMPNO > 0) DECLARE sal_diff number; BEGIN sal_diff := :NEW.SAL - :OLD.SAL; dbms_output.put('Salário Antigo: ' || :OLD.sal); dbms_output.put('Novo Salário: ' || :NEW.sal); dbms_output.put_line('Diferença:' || sal_diff); END; Banco de Dados 2 – Aula 7 TRIGGER 4) Criando Triggers – – – – OR REPLACE: garante que se o trigger existir, será substituído; BEFORE: especifica que o trigger será disparado antes da execução da operação; • Não se pode especificar o BEFORE em uma VIEW ou objeto complexo; • Você pode modificar o :NEW e não o :OLD; AFTER: especifica que o trigger será disparado após a execução da operação; • Não se pode especificar o AFTER em uma VIEW ou objeto complexo; • Não se pode modificar o :NEW nem o :OLD; FOR EACH ROW: especifica que o trigger executará seu algoritmo para cada linha afetada; Banco de Dados 2 – Aula 7 TRIGGER 4) Criando Triggers – – – WHEN: especifica um condição que deve ser satisfeita para o disparo do trigger; DECLARE: escopo para criação de variáveis; BEGIN e END: determinam o escopo do algoritmo que será executado pelo trigger; Banco de Dados 2 – Aula 7 TRIGGER 5) Codificando o corpo do Trigger – Linguagem PL/SQL; DECLARE --instruções BEGIN -- instruções END; – Variáveis devem ser declaradas no bloco DECLARE: v_produto_id INTEGER; v_nome VARCHAR(40); v_preco NUMBER(5,2); – Lógica Condicional IF (condição) THEN ELSEIF (condição) THEN END IF; Banco de Dados 2 – Aula 7 TRIGGER 5) Codificando o corpo do Trigger – Estrutura de Laço LOOP -- instrução END LOOP; Exemplo: v_contador := 0; LOOP v_contador := v_contador + 1; EXIT WHEN v_contador = 5; END LOOP; WHILE v_contador < 6 LOOP v_contador := v_contador +1; END LOOP; Banco de Dados 2 – Aula 7 TRIGGER 5) Codificando o corpo do Trigger – Estrutura Loop (continuação) FOR v_contador IN 1..5 LOOP DBMS_OUTPUT.PUT_LINE(v_contador); END LOOP; – Encerrando o Fluxo raise_application_error(-20001,"mensagem"); Banco de Dados 2 – Aula 7 TRIGGER 5) Codificando o Corpo do Trigger – Para disparar as saídas do trigger, você precisa executar o comando: SET SERVEROUTUP ON; 6) Obtendo informações sobre o Trigger – Visão: user_triggers, exemplo: SELECT * FROM user_triggers WHERE trigger_name = 'MINHATRIGGER'; 7) Ativando e Desativando Triggers – ALTER TRIGGER 'NOME' ENABLE; – ALTER TRIGGER 'NOME' DISABLE; Banco de Dados 2 – Aula 7 TRIGGER Referências Bibliográficas: Sistemas de Gerenciamento de Bancos de Dados - 3ªed. R.Ramakrishnan, J.Gehrke – McGraw-Hill http://docs.oracle.com/cd/B19306_01/appdev.102/b14251/adfns_t riggers.htm