39
Nelson Freire (ISEP–LEI-BDDAD 2017/18) 1/39 Oracle PL/SQL Triggers Bases de Dados BDDAD

Oracle PL/SQL - Departamento de Engenharia Informáticanfreire/BDDAD - ORACLE - PL_SQL - Trig… · Uso de Triggers. Nelson Freire (ISEP–LEI-BDDAD 2017/18) 3/39 Introdução Oracle

  • Upload
    others

  • View
    27

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Oracle PL/SQL - Departamento de Engenharia Informáticanfreire/BDDAD - ORACLE - PL_SQL - Trig… · Uso de Triggers. Nelson Freire (ISEP–LEI-BDDAD 2017/18) 3/39 Introdução Oracle

Nelson Freire (ISEP–LEI-BDDAD 2017/18) 1/39

Oracle PL/SQLTriggers

Bases de DadosBDDAD

Page 2: Oracle PL/SQL - Departamento de Engenharia Informáticanfreire/BDDAD - ORACLE - PL_SQL - Trig… · Uso de Triggers. Nelson Freire (ISEP–LEI-BDDAD 2017/18) 3/39 Introdução Oracle

Nelson Freire (ISEP–LEI-BDDAD 2017/18) 2/39

▪ Introdução

▪ Conceito de Trigger

▪ Tipos de Triggers

▪ Designações de um Trigger

▪ Triggers DML

▪ Características Particulares

▪ Interesse

▪ Comando CREATE TRIGGER

▪ Passos Para Criar um Trigger

▪ Pseudo-Registos NEW e OLD

▪ Tratamento Diferenciado de Comandos de Triggering

▪ Participação em Transações

▪ Limitação “Mutating Table” em Triggersde Linha

▪ Exemplo

SumárioTriggers

▪ Aspetos Gerais

▪ Lista de Triggers Associados a Tabela

▪ Ordem de Disparo de Triggers

▪ Impedir/Permitir Triggers

▪ Eliminar Triggers

▪ Limitação do Tamanho de um Trigger

▪ Uso de Triggers

Page 3: Oracle PL/SQL - Departamento de Engenharia Informáticanfreire/BDDAD - ORACLE - PL_SQL - Trig… · Uso de Triggers. Nelson Freire (ISEP–LEI-BDDAD 2017/18) 3/39 Introdução Oracle

Nelson Freire (ISEP–LEI-BDDAD 2017/18) 3/39

Introdução

Oracle PL/SQL - Triggers

Page 4: Oracle PL/SQL - Departamento de Engenharia Informáticanfreire/BDDAD - ORACLE - PL_SQL - Trig… · Uso de Triggers. Nelson Freire (ISEP–LEI-BDDAD 2017/18) 3/39 Introdução Oracle

Nelson Freire (ISEP–LEI-BDDAD 2017/18) 4/39

▪ Trigger

▪ Unidade de programação PL/SQL

▪ Tem um nome

▪ Armazenado na BD -- com/sem erros de compilação.

▪ Invocação:

▪ Automática -- realizada pela BD.

▪ Trigger dispara automaticamente.

▪ Permitida, por omissão. -- disparo do trigger desinibido.

▪ Pode ser impedida. -- disparo do trigger inibido.

▪ Explicita

▪ impossível.

▪ Ocorre:

▪ Quando surge o evento de triggering.

▪ Evento de Triggering

▪ Ocorre quando … é executado um comando SQL sobre um dado item.

▪ Item: tabela / vista / esquema / BD.

▪ Comando SQL é designado comando de triggering.

▪ Disparo do Trigger (Timing-Point)

▪ Antes / depois da execução de comando de triggering.

▪ Único / múltiplo ( para cada linha afetada pelo comando de triggering).

invocação permitida

invocação impedida

Conceito de TriggerTriggers

Page 5: Oracle PL/SQL - Departamento de Engenharia Informáticanfreire/BDDAD - ORACLE - PL_SQL - Trig… · Uso de Triggers. Nelson Freire (ISEP–LEI-BDDAD 2017/18) 3/39 Introdução Oracle

Nelson Freire (ISEP–LEI-BDDAD 2017/18) 5/39

Tipos de TriggersTriggers

Triggers Trigger dispara quando … Interesse Observações

DML Executado comando DML(INSERT, UPDATE ou DELETE) sobre tabela / vista.

▪ Validar valores armazenados.▪ Atribuir valores por omissão.▪ Proibir certas operações DML.

Mais usados por utilizadores de PL/SQL.

DDL Executado comando DDL: CREATE, DROP, ALTER, GRANT, REVOKE, …

▪ Auditoria▪ Impedir a execução de certos

comandos DDL.

Eventos da BD

▪ BD arranca / termina.▪ Utilizador da BD faz

LOGON / LOGOFF.▪ Ocorrem erros.

Monitorar atividade na BD. Eventos da BD: STARTUP, SHUTDOWN, LOGON, LOGOFF, SERVERERROR, …

INSTEADOF

▪ Executado comando CREATE

▪ Executado comando DML(INSERT, UPDATE ou DELETE) sobre vistas.

Substituir a execução de comando de triggering pela execução de um dado código.

Essencialmente, são alternativas a triggers DMLsobre vistas.

SUSPENDMODE

Execução de comando é suspensa … devido a problemas de espaço (falta de tablespace / quota excedida)

▪ Alertar alguém para o problema.

▪ Resolver o problema.

▪ Comandos entram em modo de suspensão até à resolução do problema.

▪ Item: DATABASE / SCHEMA

Page 6: Oracle PL/SQL - Departamento de Engenharia Informáticanfreire/BDDAD - ORACLE - PL_SQL - Trig… · Uso de Triggers. Nelson Freire (ISEP–LEI-BDDAD 2017/18) 3/39 Introdução Oracle

Nelson Freire (ISEP–LEI-BDDAD 2017/18) 6/39

▪ Baseadas

▪ Nome do comando de triggering -- ex: Trigger INSERT / Trigger LOGON

▪ Nome do item de triggering -- ex: Trigger DATABASE / Trigger SCHEMA

▪ Timing-point do disparo do trigger -- ex: Trigger BEFORE Statement / Trigger AFTER EACH ROW

Designações de um TriggerTriggers

Page 7: Oracle PL/SQL - Departamento de Engenharia Informáticanfreire/BDDAD - ORACLE - PL_SQL - Trig… · Uso de Triggers. Nelson Freire (ISEP–LEI-BDDAD 2017/18) 3/39 Introdução Oracle

Nelson Freire (ISEP–LEI-BDDAD 2017/18) 7/39

Triggers DML

Oracle PL/SQL - Triggers

Page 8: Oracle PL/SQL - Departamento de Engenharia Informáticanfreire/BDDAD - ORACLE - PL_SQL - Trig… · Uso de Triggers. Nelson Freire (ISEP–LEI-BDDAD 2017/18) 3/39 Introdução Oracle

Nelson Freire (ISEP–LEI-BDDAD 2017/18) 8/39

▪ Evento de Triggering

▪ Composto por:

▪ Comandos de triggering:

▪ Comandos DML:

▪ INSERT

▪ UPDATE

▪ DELETE

▪ Item sobre o qual atuam os comandos de triggering:

▪ Tabela / Vista

▪ Exemplos

▪ Um comando de triggering

▪ INSERT ON empregados -- tabela empregados

▪ UPDATE ON empregados

▪ DELETE ON empregados

▪ Múltiplos comandos de triggering

▪ INSERT OR UPDATE ON empregados

▪ INSERT OR DELETE ON empregados

▪ UPDATE OR DELETE ON empregados

▪ INSERT OR UPDATE OR UPDATE ON empregados

Execução de comando DML

Triggers DML Características Particulares

Page 9: Oracle PL/SQL - Departamento de Engenharia Informáticanfreire/BDDAD - ORACLE - PL_SQL - Trig… · Uso de Triggers. Nelson Freire (ISEP–LEI-BDDAD 2017/18) 3/39 Introdução Oracle

Nelson Freire (ISEP–LEI-BDDAD 2017/18) 9/39

▪ Forçar

▪ Regras de negócio complexas -- impossível definir em CREATE TABLE.

▪ Regras de integridade referencial -- impossível definir em CREATE TABLE.

▪ Atribuir

▪ Valores por omissão -- impossível definir em CREATE TABLE.

▪ Impedir

▪ Certas operações DML -- ex: após horas normais de serviço.

▪ Certas alterações de tabelas -- i.e., fazer a validação de alterações de tabelas.

▪ Transações inválidas -- i.e., provocar ROLLBACK de transação.

▪ Registar

▪ Eventos -- ex: erros

▪ Informação de auditoria

▪ Estatísticas do acesso a tabelas.

Triggers não servem apenas para impor:▪ Regras de negócio complexas.▪ Restrições de integridade da BD.

Triggers DML Interesse

CONSTRAINTpreferívela trigger

Page 10: Oracle PL/SQL - Departamento de Engenharia Informáticanfreire/BDDAD - ORACLE - PL_SQL - Trig… · Uso de Triggers. Nelson Freire (ISEP–LEI-BDDAD 2017/18) 3/39 Introdução Oracle

Nelson Freire (ISEP–LEI-BDDAD 2017/18) 10/39

▪ Sintaxe (simplificada)

▪ Exemplo

Triggers DML 1/7Comando CREATE TRIGGER

CREATE [OR REPLACE] TRIGGER nome_trigger

{ BEFORE | AFTER }

{ INSERT | DELETE | UPDATE | UPDATE OF lista_colunas } ON tabela/vista

[ FOR EACH ROW [ WHEN (condição) ] ]

[DECLARE]

-- instruções de declarações

BEGIN

-- instruções executáveis

[EXCEPTION]

-- handlers de exceções

END [nome_trigger];

Carateres especiais: [……….] = opcional { …|… } = alternativas

nome do trigger (tgr_... por convenção)

timing-point do disparo do trigger

evento de triggering

- 1 disparo para cada linha afetada(cada disparo sob condição)

- sem cláusula: apenas 1 disparo

corpo do trigger

especifica a ação do trigger

NEW▪ Pseudo-registo da linha afetada

por comando de triggering.cor▪ Campo do pseudo-registo.

Trigger sobre a tabela barcos

Page 11: Oracle PL/SQL - Departamento de Engenharia Informáticanfreire/BDDAD - ORACLE - PL_SQL - Trig… · Uso de Triggers. Nelson Freire (ISEP–LEI-BDDAD 2017/18) 3/39 Introdução Oracle

Nelson Freire (ISEP–LEI-BDDAD 2017/18) 11/39

▪ Cláusula CREATE [OR REPLACE] TRIGGER

▪ Especifica o nome do trigger.

▪ É um identificador

▪ Sujeito às regras dos identificadores.

▪ Iniciado por letra, …

▪ Convenção

▪ Prefixo: trg_

▪ Razão

▪ Evitar conflitos de nomes

▪ Tabela, função e procedimento … podem ter o mesmo nome.

▪ OR REPLACE

▪ Opcional

▪ Omisso

▪ Gerada exceção … se o trigger existir.

Triggers DML 2/7Comando CREATE TRIGGER

CREATE [OR REPLACE] TRIGGER nome_trigger

{ BEFORE | AFTER }

{ INSERT | DELETE | UPDATE | UPDATE OF lista_colunas } ON tabela/vista

[ FOR EACH ROW [ WHEN (condição) ] ]

nome do trigger

Page 12: Oracle PL/SQL - Departamento de Engenharia Informáticanfreire/BDDAD - ORACLE - PL_SQL - Trig… · Uso de Triggers. Nelson Freire (ISEP–LEI-BDDAD 2017/18) 3/39 Introdução Oracle

Nelson Freire (ISEP–LEI-BDDAD 2017/18) 12/39

▪ Cláusula BEFORE | AFTER

▪ Especifica:

▪ Timing-point do disparo do trigger.

▪ Ação do trigger.

▪ BEFORE

▪ Antes da execução de comando de triggering.

▪ Interesse:

▪ Consultar / alterar as linhas afetadas por comando de triggering antes de processadas.

▪ Exemplo (ilustrado)

▪ Linhas afetadas por comando INSERT / UPDATE … alteradas antes de serem inseridas /atualizadas na tabela barcos.

▪ AFTER

▪ Depois da execução de comando de triggering.

▪ Interesse:

▪ Consultar as linhas afetadas por comando de triggering depois de processadas.

▪ Exemplo

▪ Para registar numa tabela de logs as linhas eliminadas por DELETE.

3/7Comando CREATE TRIGGERTriggers DML

timing-pointCREATE [OR REPLACE] TRIGGER nome_trigger

{ BEFORE | AFTER }

{ INSERT | DELETE | UPDATE | UPDATE OF lista_colunas } ON tabela/vista

[ FOR EACH ROW [ WHEN (condição) ] ]…

Page 13: Oracle PL/SQL - Departamento de Engenharia Informáticanfreire/BDDAD - ORACLE - PL_SQL - Trig… · Uso de Triggers. Nelson Freire (ISEP–LEI-BDDAD 2017/18) 3/39 Introdução Oracle

Nelson Freire (ISEP–LEI-BDDAD 2017/18) 13/39

▪ Cláusula INSERT | DELETE | UPDATE | UPDATE OF …

▪ Especifica:

▪ Evento de triggering.

▪ Em termos de:

▪ Comando / combinação de comandos DML.

▪ INSERT, UPDATE ou DELETE

▪ Item sobre o qual atuam esses comandos:

▪ Tabela / Vista

▪ Cláusula UPDATE OF lista_colunas

▪ Para disparar o trigger:

▪ Só quando são atualizadas as colunas indicadas.

4/7Comando CREATE TRIGGERTriggers DML

evento de triggering

CREATE [OR REPLACE] TRIGGER nome_trigger

{ BEFORE | AFTER }

{ INSERT | DELETE | UPDATE | UPDATE OF lista_colunas } ON tabela/vista

[ FOR EACH ROW [ WHEN (condição) ] ]…

Page 14: Oracle PL/SQL - Departamento de Engenharia Informáticanfreire/BDDAD - ORACLE - PL_SQL - Trig… · Uso de Triggers. Nelson Freire (ISEP–LEI-BDDAD 2017/18) 3/39 Introdução Oracle

Nelson Freire (ISEP–LEI-BDDAD 2017/18) 14/39

▪ Cláusula FOR EACH ROW [ WHEN (condição) ]

▪ Opcional

▪ Omissa:

▪ Trigger de tabela / instrução

▪ Especifica:

▪ Trigger de linha

▪ Trigger de linha:

▪ Pode aceder aos dados das linhas afetadas por comando de triggering.

▪ Através dos pseudo-registos:

▪ NEW -- NEW na condição WHEN e :NEW no corpo do trigger.

▪ OLD -- OLD na condição WHEN e :OLD no corpo do trigger.

▪ Interesse:

▪ Processar os dados de cada linha da tabela afetada por comando de triggering.

▪ WHEN (condição):

▪ Condiciona o disparo do trigger. -- restringir a execução da ação do trigger.

5/7Comando CREATE TRIGGERTriggers DML

trigger de linha

CREATE [OR REPLACE] TRIGGER nome_trigger

{ BEFORE | AFTER }

{ INSERT | DELETE | UPDATE | UPDATE OF lista_colunas } ON tabela/vista

[ FOR EACH ROW [ WHEN (condição) ] ]…

Representa a linhaa inserir / atualizar

Page 15: Oracle PL/SQL - Departamento de Engenharia Informáticanfreire/BDDAD - ORACLE - PL_SQL - Trig… · Uso de Triggers. Nelson Freire (ISEP–LEI-BDDAD 2017/18) 3/39 Introdução Oracle

Nelson Freire (ISEP–LEI-BDDAD 2017/18) 15/39

▪ Trigger de Tabela / Instrução

▪ Dispara só 1 vez -- ação do trigger executada 1 vez.

▪ Exemplo – com comando de triggering UPDATE.

▪ Trigger de Linha

▪ Dispara múltiplas vezes: 1 vez para cada linha afetada pelo comando de triggering.

▪ Exemplo – com comando de triggering UPDATE.

▪ Tem acesso aos dados de cada linha afetada -- através dos pseudo-registos NEW e OLD

1 disparo sobre toda a tabela

1 disparo sobre cada linha

Com cláusula

Sem cláusulaFOR EACH ROW

Trigger não tem acesso aos dadosde cada linha afetada.Pseudo-registos :NEW e :OLD ilegais

6/7Comando CREATE TRIGGERTriggers DML

Page 16: Oracle PL/SQL - Departamento de Engenharia Informáticanfreire/BDDAD - ORACLE - PL_SQL - Trig… · Uso de Triggers. Nelson Freire (ISEP–LEI-BDDAD 2017/18) 3/39 Introdução Oracle

Nelson Freire (ISEP–LEI-BDDAD 2017/18) 16/39

▪ Cláusula WHEN (condição)

▪ Opcional

▪ Usada:

▪ Só em triggers de linha. -- senão, erro de compilação

▪ Especifica:

▪ Condição de disparo do trigger.

▪ Trigger designado Trigger Condicional.

▪ Interesse:

▪ Evitar disparos desnecessários do trigger.

▪ Condição

▪ Parêntesis

▪ Obrigatórios

▪ Pode referenciar:

▪ Pseudo-registos NEW e OLD -- sem prefixo dois pontos

▪ Pode invocar funções

▪ Só SQL predefinidas.

▪ Proibido incluir:

▪ Subquery

7/7Comando CREATE TRIGGERTriggers DML

CREATE [OR REPLACE] TRIGGER nome_trigger

{ BEFORE | AFTER }

{ INSERT | DELETE | UPDATE | UPDATE OF lista_colunas } ON tabela/vista

[ FOR EACH ROW [ WHEN (condição) ] ]

…de disparo do trigger

Page 17: Oracle PL/SQL - Departamento de Engenharia Informáticanfreire/BDDAD - ORACLE - PL_SQL - Trig… · Uso de Triggers. Nelson Freire (ISEP–LEI-BDDAD 2017/18) 3/39 Introdução Oracle

Nelson Freire (ISEP–LEI-BDDAD 2017/18) 17/39

1. Decidir sobre:

▪ Evento de triggering:

▪ Disparo do trigger aplica-se apenas a um comando INSERT, UPDATE ou DELETE

ou

▪ Disparo do trigger aplica-se a uma combinação desses comandos ?

▪ Timing-point do disparo do trigger:

▪ Antes da execução de comando de triggering -- com cláusula BEFORE

ou

Depois da execução de comando de triggering ? -- com cláusula AFTER

▪ 1 vez para o comando de triggering -- sem cláusula FOR EACH ROW

ou

1 vez para cada linha afetada pelo comando de triggering ? -- com cláusula FOR EACH ROW

▪ Condicionada -- com cláusula WHEN

ou

Não condicionada ? -- sem cláusula WHEN

2. Escrever comando CREATE TRIGGER.

3. Compilar o comando criado.

4. Testar o trigger.

Passos para Criar Trigger DMLTriggers DML

Page 18: Oracle PL/SQL - Departamento de Engenharia Informáticanfreire/BDDAD - ORACLE - PL_SQL - Trig… · Uso de Triggers. Nelson Freire (ISEP–LEI-BDDAD 2017/18) 3/39 Introdução Oracle

Nelson Freire (ISEP–LEI-BDDAD 2017/18) 18/39

▪ Estruturas de Dados

▪ Estruturas semelhantes ao registo PL/SQL. -- daí pseudo-registo.

▪ Tipo: nome_tabela%ROWTYPE -- nome da tabela do evento de triggering.

▪ Contém: valores dos campos da linha afetada por comando de triggering.

▪ Referenciados como Variáveis

▪ No corpo do trigger

▪ Com prefixo :

▪ Sintaxe

▪ :NEW.campo

▪ :OLD.campo

▪ Na condição da cláusula WHEN

▪ Sem prefixo :

▪ Sintaxe

▪ NEW.campo

▪ OLD.campo

Pseudo-Registos NEW e OLD 1/7Triggers DML

:NEW

NEW

Page 19: Oracle PL/SQL - Departamento de Engenharia Informáticanfreire/BDDAD - ORACLE - PL_SQL - Trig… · Uso de Triggers. Nelson Freire (ISEP–LEI-BDDAD 2017/18) 3/39 Introdução Oracle

Nelson Freire (ISEP–LEI-BDDAD 2017/18) 19/39

▪ Disponíveis

▪ Apenas em triggers de linha.

Pseudo-Registos NEW e OLD 2/7Triggers DML

Sem cláusula FOR EACH ROW=> Trigger de Tabela

Erro ORA-4082

:NEW gera erro de compilação

Page 20: Oracle PL/SQL - Departamento de Engenharia Informáticanfreire/BDDAD - ORACLE - PL_SQL - Trig… · Uso de Triggers. Nelson Freire (ISEP–LEI-BDDAD 2017/18) 3/39 Introdução Oracle

Nelson Freire (ISEP–LEI-BDDAD 2017/18) 20/39

▪ NEW

▪ Disponível

▪ Apenas em triggers INSERT e UPDATE

▪ Contém:

▪ Valores dos campos da linha afetada depois das alterações realizadas.

▪ OLD

▪ Disponível

▪ Apenas em triggers UPDATE e DELETE

▪ Contém:

▪ Valores dos campos da linha afetada antes das alterações realizadas.

▪ Valores de OLD e NEW

▪ Para a linha em processamento pelo comando de triggering.

Pseudo-Registos NEW e OLD 3/7

Comando de Triggering OLD.campo NEW.campo

INSERT NULL Valor depois do INSERT

UPDATE Valor antes do UPDATE Valor depois do UPDATE

DELETE Valor antes do DELETE NULL

Triggers DML

Page 21: Oracle PL/SQL - Departamento de Engenharia Informáticanfreire/BDDAD - ORACLE - PL_SQL - Trig… · Uso de Triggers. Nelson Freire (ISEP–LEI-BDDAD 2017/18) 3/39 Introdução Oracle

Nelson Freire (ISEP–LEI-BDDAD 2017/18) 21/39

▪ Nomes NEW e OLD

▪ Podem ser personalizados.

▪ Na cláusula REFERENCING

▪ Comando CREATE TRIGGER

▪ Interesse

▪ Melhorar a legibilidade do código.

▪ Código mais específico da aplicação.

Pseudo-Registos NEW e OLD 4/7Triggers DML

NEW substituído por NOVO

:NEW substituído por :NOVO

Sintaxe

Cláusula REFERENCING

Exemplo

Page 22: Oracle PL/SQL - Departamento de Engenharia Informáticanfreire/BDDAD - ORACLE - PL_SQL - Trig… · Uso de Triggers. Nelson Freire (ISEP–LEI-BDDAD 2017/18) 3/39 Introdução Oracle

Nelson Freire (ISEP–LEI-BDDAD 2017/18) 22/39

▪ Limitações dos Pseudo-Registos

▪ Ilegais em operação ao nível do registo. -- legal apenas nível do campo do registo.

▪ Exemplo

▪ :NEW := NULL; -- :NEW.campo := NULL; -- é legal

▪ Ilegais como argumento de subprograma (função/procedimento).

▪ Mas é legal um campo do pseudo-registo.

▪ Ilegal modificar OLD.campo

▪ Porque é ilegal alterar valores armazenados na BD.

▪ Tentativa gera erro ORA-04085.

▪ Ilegal modificar NEW.campo … se comando de triggering é DELETE.

▪ Tentativa gera erro ORA-04084.

▪ Trigger AFTER impedido de modificar NEW.campo

▪ Porque comando de triggering é executado antes.

▪ Tentativa gera erro ORA-04084.

▪ Trigger BEFORE pode modificar NEW.campo

▪ Antes do comando INSERT / UPDATE do evento armazenar esse valor na tabela.

▪ Quando um comando DML faz disparar, simultaneamente, um trigger BEFORE e um trigger AFTER:

▪ Se o trigger BEFORE alterar NEW.campo … então o trigger AFTER “vê” essa alteração.

Pseudo-Registos NEW e OLD 5/7Triggers DML

Page 23: Oracle PL/SQL - Departamento de Engenharia Informáticanfreire/BDDAD - ORACLE - PL_SQL - Trig… · Uso de Triggers. Nelson Freire (ISEP–LEI-BDDAD 2017/18) 3/39 Introdução Oracle

Nelson Freire (ISEP–LEI-BDDAD 2017/18) 23/39

▪ Exemplo – Trigger AFTER FOR EACH ROW

▪ Insere uma linha na tabela de logs LOG_EMPREGADOS …

… depois de qualquer comando UPDATE afetar a coluna SALARIO da tabela EMPREGADOS

Pseudo-Registos NEW e OLD 6/7Triggers DML

Page 24: Oracle PL/SQL - Departamento de Engenharia Informáticanfreire/BDDAD - ORACLE - PL_SQL - Trig… · Uso de Triggers. Nelson Freire (ISEP–LEI-BDDAD 2017/18) 3/39 Introdução Oracle

Nelson Freire (ISEP–LEI-BDDAD 2017/18) 24/39

▪ Exemplo - Trigger Condicional (com cláusula WHEN)

▪ Cria um trigger que:

▪ Imprime informação sobre atualizações na coluna SALARIO da tabela EMPREGADOS.

▪ Sempre que um comando UPDATE afeta a tabela EMPREGADOS.

▪ Exceto quando a informação é do Presidente.

▪ A BD avalia a condição WHEN para cada linha da tabela EMPREGADO afetada.

▪ Se TRUE: trigger é disparado antes da execução do comando de triggering.

▪ Senão: trigger não é disparado mas o comando de triggering continua a sua execução.

Pseudo-Registos NEW e OLD 7/7Triggers DML

Page 25: Oracle PL/SQL - Departamento de Engenharia Informáticanfreire/BDDAD - ORACLE - PL_SQL - Trig… · Uso de Triggers. Nelson Freire (ISEP–LEI-BDDAD 2017/18) 3/39 Introdução Oracle

Nelson Freire (ISEP–LEI-BDDAD 2017/18) 25/39

▪ Requer

▪ Diretivas operacionais -- funções que retornam TRUE / FALSE.

Tratamento Diferenciado de Comandos de Triggering

Evento do trigger com vários comandos DML

Diretivas operacionais usadas em condições (expressões booleanas)

Diretivas operacionais determinam o comandoDML que disparou o trigger.

Diretivas operacionais podem ser usadas em qualquer bloco PL/SQL. Contudo só são TRUEdentro de triggers ou código invocado dentro dum trigger DML

Triggers DML

Directiva Operacional Retorna TRUE quando comando de triggering é

INSERTING INSERT

UPDATING UPDATE

UPDATING('coluna') UPDATE que afeta a coluna especificada

DELETING DELETE

Page 26: Oracle PL/SQL - Departamento de Engenharia Informáticanfreire/BDDAD - ORACLE - PL_SQL - Trig… · Uso de Triggers. Nelson Freire (ISEP–LEI-BDDAD 2017/18) 3/39 Introdução Oracle

Nelson Freire (ISEP–LEI-BDDAD 2017/18) 26/39

▪ Comandos DML Dentro dum Trigger

▪ Por omissão:

▪ Fazem parte da transação que originou o disparo do trigger. -- transação principal.

▪ i.e., trigger participa na transação principal.

▪ Consequência:

▪ Trigger quando termina com exceção não tratada:

▪ Provoca o ROLLBACK do comando que originou o disparo do trigger.

▪ Especificação de Instruções COMMIT/ROLLBACK … Dentro do Trigger

▪ Apenas quando o trigger:

▪ É definido como transação autónoma. -- independente da transação principal.

▪ Exemplo

▪ Guarda informação de auditoria sobre tabela bonus_empregados:

Instrução especifica que os comandos DML da ação do triggerconstituem uma transação autónoma

Não afeta transação principal Alteração da tabela é garantida.

ROLLBACK da transação principal não afeta.

Participação de Triggers em TransaçõesTriggers DML

Page 27: Oracle PL/SQL - Departamento de Engenharia Informáticanfreire/BDDAD - ORACLE - PL_SQL - Trig… · Uso de Triggers. Nelson Freire (ISEP–LEI-BDDAD 2017/18) 3/39 Introdução Oracle

Nelson Freire (ISEP–LEI-BDDAD 2017/18) 27/39

▪ Impede▪ Leitura/escrita na tabela do evento de triggering.

▪ Justificação▪ Tabela já está sendo alterada (“is mutating”) por comando DML (INSERT, UPDATE ou DELETE)

que fez o trigger disparar.

▪ Exemplo

Limitação “Mutating Table” em Triggers de Linha 1/3Triggers DML

Consulta da tabela que estásendo alterada por comandoDML que fez o triggerdisparar.

Comando DML faz o triggerdisparar e surge um erro ...

… erro ORA-4091 – MutatingTable

Trigger de linha sobre tabela.

Trigger compilado sem erros.

Page 28: Oracle PL/SQL - Departamento de Engenharia Informáticanfreire/BDDAD - ORACLE - PL_SQL - Trig… · Uso de Triggers. Nelson Freire (ISEP–LEI-BDDAD 2017/18) 3/39 Introdução Oracle

Nelson Freire (ISEP–LEI-BDDAD 2017/18) 28/39

▪ Consequência

1. Rolled Back

▪ Trigger

▪ Comando de triggering

2. Controlo da Execução

▪ Retorna à aplicaçãoque mandou executar ocomando de triggering.

Limitação “Mutating Table” em Triggers de Linha 2/3Triggers DML

Comando de triggeringé rolled back.

Erro ORA-4091 –Mutating Table

Trigger é rolled back.

Exemplo

Page 29: Oracle PL/SQL - Departamento de Engenharia Informáticanfreire/BDDAD - ORACLE - PL_SQL - Trig… · Uso de Triggers. Nelson Freire (ISEP–LEI-BDDAD 2017/18) 3/39 Introdução Oracle

Nelson Freire (ISEP–LEI-BDDAD 2017/18) 29/39

▪ Evitar o Erro

▪ Exemplo - Trigger AFTER EACH ROW para UPDATE da “Mutating Table”

▪ Alternativas:

▪ Usar uma tabela temporária.

▪ Usar um trigger DML composto. -- compound DML trigger

▪ Usar uma tabela temporária.

▪ Usar 2 triggers:

▪ Trigger de Linha

▪ Trigger de tabela / instrução

▪ Trigger de linha

▪ Trigger AFTER EACH ROW -- executado antes de triggers AFTER

▪ Atualiza a tabela temporária.

▪ Trigger de tabela / instrução

▪ Trigger AFTER

▪ Atualiza a “mutating table” com os valores da tabela temporária.

Limitação “Mutating Table” em Triggers de Linha 3/3Triggers DML

Page 30: Oracle PL/SQL - Departamento de Engenharia Informáticanfreire/BDDAD - ORACLE - PL_SQL - Trig… · Uso de Triggers. Nelson Freire (ISEP–LEI-BDDAD 2017/18) 3/39 Introdução Oracle

Nelson Freire (ISEP–LEI-BDDAD 2017/18) 30/39

▪ Restrição

▪ empregados.salario [categorias.salario_min, categorias.salario_max] -- envolve 2 tabelas.

▪ Implementação

▪ Impossível com CONSTRAINT CHECK

▪ Limitada a colunas da mesma tabela.

▪ Possível com TRIGGER

▪ Faz a validação do salario

▪ Se inválido … impede a execução de comandos INSERT / UPDATE

Exemplo - Verificação de Restrição Complexa 1/3Triggers DML

Page 31: Oracle PL/SQL - Departamento de Engenharia Informáticanfreire/BDDAD - ORACLE - PL_SQL - Trig… · Uso de Triggers. Nelson Freire (ISEP–LEI-BDDAD 2017/18) 3/39 Introdução Oracle

Nelson Freire (ISEP–LEI-BDDAD 2017/18) 31/39

Exemplo - Verificação de Restrição Complexa 2/3

Exceção própria (definida pelo programador)

Procedimento (DBMS_STANDARD)

Lança exceção própria e retorna código do erro e mensagem de erro.

Comando INSERT/UPDATE pendenteque disparou o trigger é ROLLEDBACK.

Lança exceção quando o novo salário é inválido

Obtém os salários, mínimo e máximo, do novo empregado ou da nova categoria do empregado.

Código do erro:inteiro [-20000, -20999]

Triggers DML

Page 32: Oracle PL/SQL - Departamento de Engenharia Informáticanfreire/BDDAD - ORACLE - PL_SQL - Trig… · Uso de Triggers. Nelson Freire (ISEP–LEI-BDDAD 2017/18) 3/39 Introdução Oracle

Nelson Freire (ISEP–LEI-BDDAD 2017/18) 32/39

Exemplo - Verificação de Restrição Complexa 3/3

Salário inválido (fora dos limites da categoria)

Exceção lançada pelo trigger provoca o ROLLED BACK do INSERT.

Código de erro e mensagem de erroretornados por RAISE_APPLICATION_ERROR

Comando DMLimpedido de executar, por ação do trigger.

Triggers DML

Page 33: Oracle PL/SQL - Departamento de Engenharia Informáticanfreire/BDDAD - ORACLE - PL_SQL - Trig… · Uso de Triggers. Nelson Freire (ISEP–LEI-BDDAD 2017/18) 3/39 Introdução Oracle

Nelson Freire (ISEP–LEI-BDDAD 2017/18) 33/39

Aspetos Gerais

Oracle PL/SQL - Triggers

Page 34: Oracle PL/SQL - Departamento de Engenharia Informáticanfreire/BDDAD - ORACLE - PL_SQL - Trig… · Uso de Triggers. Nelson Freire (ISEP–LEI-BDDAD 2017/18) 3/39 Introdução Oracle

Nelson Freire (ISEP–LEI-BDDAD 2017/18) 34/39

▪ SQL Developer

▪ Separador Triggers da Tabela selecionada.

▪ Exemplo:

▪ Tabela EMPREGADOS

Lista de Triggers Associados a uma Tabela Triggers

separador

Page 35: Oracle PL/SQL - Departamento de Engenharia Informáticanfreire/BDDAD - ORACLE - PL_SQL - Trig… · Uso de Triggers. Nelson Freire (ISEP–LEI-BDDAD 2017/18) 3/39 Introdução Oracle

Nelson Freire (ISEP–LEI-BDDAD 2017/18) 35/39

▪ Múltiplos Triggers

▪ Definidos Para:

▪ Mesmo comando de triggering

▪ Sobre a mesma tabela

▪ Ordem de Disparo:

1. Triggers de Tabela BEFORE

2. Triggers de Linha BEFORE

3. Triggers de Linha AFTER

4. Triggers de Tabela AFTER

▪ Exemplo:

1. CREATE TRIGGER trg_1 BEFORE UPDATE ON tabelaX …

2. CREATE TRIGGER trg_2 BEFORE UPDATE ON tabelaX FOR EACH ROW …

3. CREATE TRIGGER trg_3 AFTER UPDATE ON tabelaX FOR EACH ROW …

4. CREATE TRIGGER trg_4 AFTER UPDATE ON tabelaX …

▪ Quando um comando DML faz disparar, simultaneamente, um trigger BEFORE e um trigger AFTER:

▪ Se o trigger BEFORE alterar NEW.campo … então o trigger AFTER “vê” essa alteração.

Ordem de Disparo de TriggersTriggers

Mesma tabelaMesmo comando

1. BEFORE

2. AFTER

Page 36: Oracle PL/SQL - Departamento de Engenharia Informáticanfreire/BDDAD - ORACLE - PL_SQL - Trig… · Uso de Triggers. Nelson Freire (ISEP–LEI-BDDAD 2017/18) 3/39 Introdução Oracle

Nelson Freire (ISEP–LEI-BDDAD 2017/18) 36/39

▪ Comando CREATE TRIGGER

▪ Cria trigger no estado enable (permitido) -- por omissão

▪ Criar Trigger Inibido

▪ Especificar a cláusula DISABLE

▪ Trigger de linha:

▪ FOR EACH ROW DISABLE [WHEN(condição)]

▪ Trigger de Tabela:

▪ Evento de triggering [REFERENCING …] DISABLE …

▪ Interesse

▪ Permitir apenas triggers sem erros de compilação.

▪ Algumas Razões para Impedir Temporariamente um Trigger

▪ Trigger tem referência de um objeto indisponível.

▪ Necessidade de carregar rapidamente grandes quantidades de dados.

▪ Disparos de triggers consomem tempo de CPU.

▪ Comando para Impedir / Permitir

▪ Um trigger: ALTER TRIGGER [nome_esquema.] nome_trigger { ENABLE | DISABLE } ;

▪ Todos os triggers sobre uma tabela específica

▪ ALTER TABLE nome_tabela { ENABLE | DISABLE } ALL TRIGGERS ;

Permitir/Impedir TriggersTriggers

invocação permitida

invocação impedida

Page 37: Oracle PL/SQL - Departamento de Engenharia Informáticanfreire/BDDAD - ORACLE - PL_SQL - Trig… · Uso de Triggers. Nelson Freire (ISEP–LEI-BDDAD 2017/18) 3/39 Introdução Oracle

Nelson Freire (ISEP–LEI-BDDAD 2017/18) 37/39

▪ Comando DROP TRIGGER

▪ Sintaxe

▪ Exemplo

Eliminar TriggerTriggers

Alternativa no SQL Developer

DROP TRIGGER nome_trigger;

Page 38: Oracle PL/SQL - Departamento de Engenharia Informáticanfreire/BDDAD - ORACLE - PL_SQL - Trig… · Uso de Triggers. Nelson Freire (ISEP–LEI-BDDAD 2017/18) 3/39 Introdução Oracle

Nelson Freire (ISEP–LEI-BDDAD 2017/18) 38/39

▪ Tamanho Máximo de um Trigger

▪ 32K bytes

▪ Recomendação Oracle

▪ Para lógica com mais de 60 linhas de código PL/SQL:

▪ Criar subprogramas (funções e procedimentos).

▪ Invocar esses subprogramas.

Limitação do Tamanho de um TriggerTriggers

Page 39: Oracle PL/SQL - Departamento de Engenharia Informáticanfreire/BDDAD - ORACLE - PL_SQL - Trig… · Uso de Triggers. Nelson Freire (ISEP–LEI-BDDAD 2017/18) 3/39 Introdução Oracle

Nelson Freire (ISEP–LEI-BDDAD 2017/18) 39/39

▪ Muito Cuidadoso

▪ Apenas:

▪ Quando necessário.

▪ Uso excessivo:

▪ Pode resultar em interdependências complexas. -- triggers em cascata.

▪ Dificulta a manutenção de grandes aplicações.

Uso de TriggersTriggers