oracle pl/sql - departamento de engenharia informáticanfreire/bddad - oracle - pl_sql - trig… ·...
TRANSCRIPT
![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](https://reader034.vdocuments.pub/reader034/viewer/2022042712/5f9ec3d55780de46ff4e8b1c/html5/thumbnails/1.jpg)
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](https://reader034.vdocuments.pub/reader034/viewer/2022042712/5f9ec3d55780de46ff4e8b1c/html5/thumbnails/2.jpg)
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](https://reader034.vdocuments.pub/reader034/viewer/2022042712/5f9ec3d55780de46ff4e8b1c/html5/thumbnails/3.jpg)
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](https://reader034.vdocuments.pub/reader034/viewer/2022042712/5f9ec3d55780de46ff4e8b1c/html5/thumbnails/4.jpg)
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](https://reader034.vdocuments.pub/reader034/viewer/2022042712/5f9ec3d55780de46ff4e8b1c/html5/thumbnails/5.jpg)
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](https://reader034.vdocuments.pub/reader034/viewer/2022042712/5f9ec3d55780de46ff4e8b1c/html5/thumbnails/6.jpg)
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](https://reader034.vdocuments.pub/reader034/viewer/2022042712/5f9ec3d55780de46ff4e8b1c/html5/thumbnails/7.jpg)
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](https://reader034.vdocuments.pub/reader034/viewer/2022042712/5f9ec3d55780de46ff4e8b1c/html5/thumbnails/8.jpg)
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](https://reader034.vdocuments.pub/reader034/viewer/2022042712/5f9ec3d55780de46ff4e8b1c/html5/thumbnails/9.jpg)
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](https://reader034.vdocuments.pub/reader034/viewer/2022042712/5f9ec3d55780de46ff4e8b1c/html5/thumbnails/10.jpg)
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](https://reader034.vdocuments.pub/reader034/viewer/2022042712/5f9ec3d55780de46ff4e8b1c/html5/thumbnails/11.jpg)
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](https://reader034.vdocuments.pub/reader034/viewer/2022042712/5f9ec3d55780de46ff4e8b1c/html5/thumbnails/12.jpg)
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](https://reader034.vdocuments.pub/reader034/viewer/2022042712/5f9ec3d55780de46ff4e8b1c/html5/thumbnails/13.jpg)
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](https://reader034.vdocuments.pub/reader034/viewer/2022042712/5f9ec3d55780de46ff4e8b1c/html5/thumbnails/14.jpg)
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](https://reader034.vdocuments.pub/reader034/viewer/2022042712/5f9ec3d55780de46ff4e8b1c/html5/thumbnails/15.jpg)
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](https://reader034.vdocuments.pub/reader034/viewer/2022042712/5f9ec3d55780de46ff4e8b1c/html5/thumbnails/16.jpg)
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](https://reader034.vdocuments.pub/reader034/viewer/2022042712/5f9ec3d55780de46ff4e8b1c/html5/thumbnails/17.jpg)
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](https://reader034.vdocuments.pub/reader034/viewer/2022042712/5f9ec3d55780de46ff4e8b1c/html5/thumbnails/18.jpg)
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](https://reader034.vdocuments.pub/reader034/viewer/2022042712/5f9ec3d55780de46ff4e8b1c/html5/thumbnails/19.jpg)
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](https://reader034.vdocuments.pub/reader034/viewer/2022042712/5f9ec3d55780de46ff4e8b1c/html5/thumbnails/20.jpg)
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](https://reader034.vdocuments.pub/reader034/viewer/2022042712/5f9ec3d55780de46ff4e8b1c/html5/thumbnails/21.jpg)
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](https://reader034.vdocuments.pub/reader034/viewer/2022042712/5f9ec3d55780de46ff4e8b1c/html5/thumbnails/22.jpg)
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](https://reader034.vdocuments.pub/reader034/viewer/2022042712/5f9ec3d55780de46ff4e8b1c/html5/thumbnails/23.jpg)
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](https://reader034.vdocuments.pub/reader034/viewer/2022042712/5f9ec3d55780de46ff4e8b1c/html5/thumbnails/24.jpg)
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](https://reader034.vdocuments.pub/reader034/viewer/2022042712/5f9ec3d55780de46ff4e8b1c/html5/thumbnails/25.jpg)
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](https://reader034.vdocuments.pub/reader034/viewer/2022042712/5f9ec3d55780de46ff4e8b1c/html5/thumbnails/26.jpg)
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](https://reader034.vdocuments.pub/reader034/viewer/2022042712/5f9ec3d55780de46ff4e8b1c/html5/thumbnails/27.jpg)
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](https://reader034.vdocuments.pub/reader034/viewer/2022042712/5f9ec3d55780de46ff4e8b1c/html5/thumbnails/28.jpg)
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](https://reader034.vdocuments.pub/reader034/viewer/2022042712/5f9ec3d55780de46ff4e8b1c/html5/thumbnails/29.jpg)
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](https://reader034.vdocuments.pub/reader034/viewer/2022042712/5f9ec3d55780de46ff4e8b1c/html5/thumbnails/30.jpg)
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](https://reader034.vdocuments.pub/reader034/viewer/2022042712/5f9ec3d55780de46ff4e8b1c/html5/thumbnails/31.jpg)
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](https://reader034.vdocuments.pub/reader034/viewer/2022042712/5f9ec3d55780de46ff4e8b1c/html5/thumbnails/32.jpg)
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](https://reader034.vdocuments.pub/reader034/viewer/2022042712/5f9ec3d55780de46ff4e8b1c/html5/thumbnails/33.jpg)
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](https://reader034.vdocuments.pub/reader034/viewer/2022042712/5f9ec3d55780de46ff4e8b1c/html5/thumbnails/34.jpg)
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](https://reader034.vdocuments.pub/reader034/viewer/2022042712/5f9ec3d55780de46ff4e8b1c/html5/thumbnails/35.jpg)
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](https://reader034.vdocuments.pub/reader034/viewer/2022042712/5f9ec3d55780de46ff4e8b1c/html5/thumbnails/36.jpg)
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](https://reader034.vdocuments.pub/reader034/viewer/2022042712/5f9ec3d55780de46ff4e8b1c/html5/thumbnails/37.jpg)
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](https://reader034.vdocuments.pub/reader034/viewer/2022042712/5f9ec3d55780de46ff4e8b1c/html5/thumbnails/38.jpg)
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](https://reader034.vdocuments.pub/reader034/viewer/2022042712/5f9ec3d55780de46ff4e8b1c/html5/thumbnails/39.jpg)
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