O que é Trigger no PL / SQL?
TRIGGERS são programas armazenados que são acionados pelo mecanismo Oracle automaticamente quando instruções DML como inserir, atualizar, excluir são executadas na tabela ou alguns eventos ocorrem. O código a ser executado em caso de disparo pode ser definido conforme o requisito. Você pode escolher o evento em que o gatilho deve ser disparado e o momento da execução. O objetivo do gatilho é manter a integridade das informações no banco de dados.
Neste tutorial, você aprenderá-
- Benefícios dos gatilhos
- Tipos de gatilhos no Oracle
- Como criar gatilho
- : NOVA e: Cláusula ANTIGA
- EM VEZ DE Gatilho
- Gatilho Composto
Benefícios dos gatilhos
A seguir estão os benefícios dos gatilhos.
- Gerando alguns valores de coluna derivados automaticamente
- Impondo integridade referencial
- Registro de eventos e armazenamento de informações sobre o acesso à mesa
- Auditoria
- Replicação síncrona de tabelas
- Impondo autorizações de segurança
- Prevenir transações inválidas
Tipos de gatilhos no Oracle
Os gatilhos podem ser classificados com base nos parâmetros a seguir.
- Classificação com base no tempo
- BEFORE Trigger: dispara antes da ocorrência do evento especificado.
- AFTER Trigger: dispara após a ocorrência do evento especificado.
- EM VEZ DE Trigger: um tipo especial. Você aprenderá mais sobre os outros tópicos. (apenas para DML)
- Classificação baseada no nível
- Acionador de nível STATEMENT: dispara uma vez para a instrução de evento especificada.
- Acionador de nível ROW: dispara para cada registro afetado no evento especificado. (apenas para DML)
- Classificação com base no evento
- DML Trigger: dispara quando o evento DML é especificado (INSERT / UPDATE / DELETE)
- DDL Trigger: dispara quando o evento DDL é especificado (CREATE / ALTER)
- DATABASE Trigger: dispara quando o evento do banco de dados é especificado (LOGON / LOGOFF / STARTUP / SHUTDOWN)
Portanto, cada gatilho é a combinação dos parâmetros acima.
Como criar gatilho
Abaixo está a sintaxe para criar um gatilho.
CREATE [ OR REPLACE ] TRIGGER[BEFORE | AFTER | INSTEAD OF ][INSERT | UPDATE | DELETE… ]ON [FOR EACH ROW][WHEN ]DECLARE BEGIN EXCEPTION END;
Explicação da sintaxe:
- A sintaxe acima mostra as diferentes instruções opcionais que estão presentes na criação do gatilho.
- BEFORE / AFTER irá especificar as temporizações do evento.
- INSERT / UPDATE / LOGON / CREATE / etc. irá especificar o evento para o qual o gatilho precisa ser disparado.
- A cláusula ON irá especificar em qual objeto o evento acima mencionado é válido. Por exemplo, este será o nome da tabela na qual o evento DML pode ocorrer no caso de DML Trigger.
- O comando "PARA CADA LINHA" especificará o acionador do nível ROW.
- A cláusula WHEN especificará a condição adicional na qual o gatilho precisa ser disparado.
- A parte da declaração, a parte da execução e a parte do tratamento de exceções são as mesmas dos outros blocos PL / SQL. A parte da declaração e a parte do tratamento de exceções são opcionais.
: NOVA e: Cláusula ANTIGA
Em um gatilho de nível de linha, o gatilho dispara para cada linha relacionada. E às vezes é necessário saber o valor antes e depois da instrução DML.
A Oracle forneceu duas cláusulas no gatilho de nível RECORD para conter esses valores. Podemos usar essas cláusulas para nos referir aos valores antigos e novos dentro do corpo do gatilho.
- : NOVO - contém um novo valor para as colunas da tabela / visão base durante a execução do gatilho
- : OLD - Retém o valor antigo das colunas da tabela / visão base durante a execução do gatilho
Esta cláusula deve ser usada com base no evento DML. A tabela abaixo irá especificar qual cláusula é válida para qual instrução DML (INSERT / UPDATE / DELETE).
INSERIR | ATUALIZAR | EXCLUIR | |
:NOVO | VÁLIDO | VÁLIDO | INVÁLIDO. Não há nenhum novo valor no caso de exclusão. |
:VELHO | INVÁLIDO. Não há nenhum valor antigo no caso de inserção | VÁLIDO | VÁLIDO |
EM VEZ DE Gatilho
"INSTEAD OF trigger" é o tipo especial de gatilho. Ele é usado apenas em gatilhos DML. É usado quando qualquer evento DML vai ocorrer na visão complexa.
Considere um exemplo em que uma visão é feita a partir de 3 tabelas básicas. Quando qualquer evento DML é emitido sobre esta visualização, ele se torna inválido porque os dados são obtidos de 3 tabelas diferentes. Portanto, neste gatilho INSTEAD OF é usado. O gatilho INSTEAD OF é usado para modificar as tabelas de base diretamente, em vez de modificar a visualização para o evento fornecido.
Exemplo 1 : Neste exemplo, vamos criar uma visão complexa a partir de duas tabelas de base.
- Tabela_1 é uma tabela emp e
- Table_2 é a tabela de departamentos.
Em seguida, veremos como o gatilho INSTEAD OF é usado para emitir UPDATE a instrução de detalhe da localização nesta visão complexa. Também veremos como: NEW e: OLD são úteis em triggers.
- Etapa 1: Criação da tabela 'emp' e 'dept' com colunas apropriadas
- Etapa 2: preencher a tabela com valores de amostra
- Etapa 3: Criando visualização para a tabela criada acima
- Etapa 4: atualização da visão antes do gatilho em vez de
- Etapa 5: Criação do gatilho em vez de
- Etapa 6: atualização da visualização após em vez do acionador
Etapa 1) Criação da tabela 'emp' e 'dept' com colunas apropriadas
CREATE TABLE emp(emp_no NUMBER,emp_name VARCHAR2(50),salary NUMBER,manager VARCHAR2(50),dept_no NUMBER);/CREATE TABLE dept(Dept_no NUMBER,Dept_name VARCHAR2(50),LOCATION VARCHAR2(50));/
Explicação do código
- Linha de código 1-7 : Criação da tabela 'emp'.
- Linha de código 8-12 : Criação de 'departamento' da tabela.
Resultado
Mesa Criada
Etapa 2) Agora, uma vez que criamos a tabela, iremos preencher esta tabela com valores de amostra e Criação de Visualizações para as tabelas acima.
BEGININSERT INTO DEPT VALUES(10,‘HR’,‘USA’);INSERT INTO DEPT VALUES(20,'SALES','UK’);INSERT INTO DEPT VALUES(30,‘FINANCIAL',‘JAPAN');COMMIT;END;/BEGININSERT INTO EMP VALUES(1000,'XXX5,15000,'AAA',30);INSERT INTO EMP VALUES(1001,‘YYY5,18000,‘AAA’,20) ;INSERT INTO EMP VALUES(1002,‘ZZZ5,20000,‘AAA',10);COMMIT;END;/
Explicação do código
- Linha de código 13-19 : Inserindo dados na tabela 'dept'.
- Linha de código 20-26: Inserindo dados na tabela 'emp'.
Resultado
Procedimento PL / SQL concluído
Etapa 3) Criação de uma visão para a tabela criada acima.
CREATE VIEW guru99_emp_view(Employee_name:dept_name,location) ASSELECT emp.emp_name,dept.dept_name,dept.locationFROM emp,deptWHERE emp.dept_no=dept.dept_no;/
SELECT * FROM guru99_emp_view;
Explicação do código
- Linha de código 27-32: Criação da visualização 'guru99_emp_view'.
- Linha de código 33: Consultando guru99_emp_view.
Resultado
Ver criado
NOME DO EMPREGADO | DEPT_NAME | LOCALIZAÇÃO |
ZZZ | RH | EUA |
AAA | VENDAS | Reino Unido |
Xxx | FINANCEIRO | JAPÃO |
Etapa 4) Atualização da visão antes, em vez de disparar
BEGINUPDATE guru99_emp_view SET location='FRANCE' WHERE employee_name=:'XXX’;COMMIT;END;/
Explicação do código
- Linha de código 34-38: Atualize a localização de "XXX" para 'FRANÇA'. Ele levantou a exceção porque as instruções DML não são permitidas na visão complexa.
Resultado
ORA-01779: não é possível modificar uma coluna que mapeia para uma tabela sem chave preservada
ORA-06512: na linha 2
Etapa 5) Para evitar o erro encontrado durante a atualização da visualização na etapa anterior, nesta etapa usaremos "em vez de disparar".
CREATE TRIGGER guru99_view_modify_trgINSTEAD OF UPDATEON guru99_emp_viewFOR EACH ROWBEGINUPDATE deptSET location=:new.locationWHERE dept_name=:old.dept_name;END;/
Explicação do código
- Linha de código 39: Criação do gatilho INSTEAD OF para o evento 'UPDATE' na visualização 'guru99_emp_view' no nível ROW. Ele contém a instrução de atualização para atualizar a localização na tabela base 'dept'.
- Linha de código 44: A instrução de atualização usa ': NEW' e ': OLD' para encontrar o valor das colunas antes e depois da atualização.
Resultado
Gatilho criado
Etapa 6) Atualização da visão após o gatilho. Agora, o erro não virá, pois o "em vez do gatilho" tratará da operação de atualização dessa visão complexa. E quando o código for executado, a localização do funcionário XXX será atualizada para "França" de "Japão".
BEGINUPDATE guru99_emp_view SET location='FRANCE' WHERE employee_name='XXX';COMMIT;END;/
SELECT * FROM guru99_emp_view;
Explicação do código:
- Linha de código 49-53: Atualização da localização de "XXX" para 'FRANÇA'. É bem-sucedido porque o gatilho 'INSTEAD OF' interrompeu a instrução de atualização real na exibição e executou a atualização da tabela base.
- Linha de código 55: Verificando o registro atualizado.
Resultado:
Procedimento PL / SQL concluído com sucesso
NOME DO EMPREGADO | DEPT_NAME | LOCALIZAÇÃO |
ZZZ | RH | EUA |
AAA | VENDAS | Reino Unido |
Xxx | FINANCEIRO | FRANÇA |
Gatilho Composto
O gatilho composto é um gatilho que permite especificar ações para cada um dos quatro pontos de controle no corpo único do gatilho. Os quatro pontos de controle diferentes que ele suporta são os abaixo.
- ANTES DE DECLARAÇÃO - nível
- ANTES DA LINHA - nível
- APÓS LINHA - nível
- APÓS DECLARAÇÃO - nível
Ele fornece a facilidade de combinar as ações para diferentes tempos no mesmo gatilho.
CREATE [ OR REPLACE ] TRIGGERFOR[INSERT | UPDATE | DELET… .]ON BEFORE STATEMENT ISBEGIN ;END BEFORE STATEMENT;BEFORE EACH ROW ISBEGIN ;END EACH ROW;AFTER EACH ROW ISBEGIN ;END AFTER EACH ROW;AFTER STATEMENT ISBEGIN ;END AFTER STATEMENT;END;
Explicação da sintaxe:
- A sintaxe acima mostra a criação do gatilho 'COMPOUND'.
- A seção declarativa é comum para todos os blocos de execução no corpo do gatilho.
- Esses 4 blocos de temporização podem estar em qualquer sequência. Não é obrigatório ter todos esses 4 blocos de temporização. Podemos criar um acionador COMPOSTO apenas para os tempos que forem necessários.
Exemplo 1 : Neste exemplo, vamos criar um gatilho para preencher automaticamente a coluna de salário com o valor padrão 5000.
CREATE TRIGGER emp_trigFOR INSERTON empCOMPOUND TRIGGERBEFORE EACH ROW ISBEGIN:new.salary:=5000;END BEFORE EACH ROW;END emp_trig;/
BEGININSERT INTO EMP VALUES(1004,‘CCC’,15000,‘AAA’,30);COMMIT;END;/
SELECT * FROM emp WHERE emp_no=1004;
Explicação do código:
- Linha de código 2-10 : Criação de gatilho composto. Ele é criado para cronometrar BEFORE ROW- nível para preencher o salário com o valor padrão 5000. Isso mudará o salário para o valor padrão '5000' antes de inserir o registro na tabela.
- Linha de código 11-14 : Insira o registro na tabela 'emp'.
- Linha de código 16 : Verificando o registro inserido.
Resultado:
Gatilho criado
Procedimento PL / SQL concluído com sucesso.
EMP_NAME | EMP_NO | SALÁRIO | GERENTE | DEPT_NO |
CCC | 1004 | 5000 | AAA | 30 |
Ativando e desativando gatilhos
Os gatilhos podem ser ativados ou desativados. Para habilitar ou desabilitar o gatilho, uma instrução ALTER (DDL) precisa ser fornecida para o gatilho que o desativa ou habilita.
Abaixo está a sintaxe para habilitar / desabilitar os gatilhos.
ALTER TRIGGER[ENABLE|DISABLE];ALTER TABLE [ENABLE|DISABLE] ALL TRIGGERS;
Explicação da sintaxe:
- A primeira sintaxe mostra como habilitar / desabilitar o gatilho único.
- A segunda instrução mostra como habilitar / desabilitar todos os gatilhos em uma determinada tabela.
Resumo
Neste capítulo, aprendemos sobre os gatilhos PL / SQL e suas vantagens. Também aprendemos as diferentes classificações e discutimos o gatilho INSTEAD OF e o gatilho COMPOUND.