oracle pl/sql - departamento de engenharia informáticanfreire/bddad - oracle - pl_sql - trig… ·...

Post on 08-Aug-2020

25 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

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

Oracle PL/SQLTriggers

Bases de DadosBDDAD

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

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

Introdução

Oracle PL/SQL - Triggers

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

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

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

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

Triggers DML

Oracle PL/SQL - Triggers

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

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

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

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

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) ] ]…

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) ] ]…

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

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

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

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

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

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

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

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

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

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

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

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

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

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.

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

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

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

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

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

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

Aspetos Gerais

Oracle PL/SQL - Triggers

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

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

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

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

▪ Comando DROP TRIGGER

▪ Sintaxe

▪ Exemplo

Eliminar TriggerTriggers

Alternativa no SQL Developer

DROP TRIGGER nome_trigger;

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

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

top related