Trigger no Oracle: mudanças entre as edições

De Wiki do Ouro Minas Palace Hotel
Ir para navegação Ir para pesquisar
2532252>Jefferson
Sem resumo de edição
 
imported>Admin
m uma edição
 
(Sem diferença)

Edição atual tal como às 03h12min de 8 de agosto de 2020

Informação retirada de

https://terminaldeinformacao.com/2014/04/01/criando-triggers-no-oracle/


CRIANDO TRIGGERS NO ORACLE

Abril 1, 2014  Dan_Atilio Comments  2 Comments

Olá pessoal…

Hoje irei falar um pouco sobre Triggers (Gatilhos) em Oracle, qual a sua funcionalidade e como criar.



Mas o que seria Triggers? Simplesmente são Gatilhos acionados por ações de usuários, por exemplo, ao criar algum registro, atualize tais dados, ou ao excluir, atualize outra tabela. Enfim, basicamente é uma ação disparada por uma outra ação (ex.: ao incluir, faça algo).

Um bom exemplo seria, ao aumentar o salário de uma pessoa, gravar um log com o salário antigo. Esse exemplo que será demonstrado abaixo, primeiramente iremos criar uma tabela de logs, onde qualquer alteração em salários (da tabela padrão EMPLOYEES), irá gerar um registro de Log. Abaixo, o script para criação da tabela de Logs.

Criando tabela de logs:

CREATE TABLE Y_LOG (

 ID_LOG          NUMBER(08)   NOT NULL   PRIMARY KEY,
 DATA_LOG        DATE         NOT NULL,
 SALARIO_ANT     NUMBER(08,2) NOT NULL,
 SALARIO_NOV     NUMBER(08,2) NOT NULL,  
 ID_FUNC         NUMBER(06)   NOT NULL

); Criando sequência de incremento (dúvidas, leia Criando Sequences no Oracle):

CREATE SEQUENCE SEQ_LOG

 START WITH 1
 INCREMENT BY 1
 MAXVALUE 999999999
 MINVALUE 1
 NOCACHE
 NOCYCLE;

Criando Gatilho (que define antes ou depois de qual ação – BEFORE ou AFTER, de qual campo – OF, em qual tabela – ON, e para cada linha – FOR EACH ROW):

CREATE OR REPLACE TRIGGER VERIF_SALARIO

 BEFORE UPDATE
 OF SALARY
 ON EMPLOYEES
 FOR EACH ROW
 BEGIN
 insert into Y_LOG values (    SEQ_LOG.NEXTVAL,
               SYSDATE,
               :old.SALARY,
               :new.SALARY,
               :old.EMPLOYEE_ID);

END; Não esqueça de salvar os dados.

COMMIT; Atualizando tabela para criação de Gatilho:

UPDATE EMPLOYEES SET SALARY=24000 WHERE EMPLOYEE_ID=100; Resultado:

Resultado Resultado É possível até fazer tratamentos, como no exemplo abaixo, onde é criado uma trigger para tabela de notas, e gravando se é exclusão ou alteração:

--Trigger CREATE OR REPLACE TRIGGER A_TRIG_NOTA

 BEFORE DELETE OR UPDATE 
 OF VALOR_NOTA ON A_NOTA
 FOR EACH ROW

DECLARE

   cTipo VARCHAR(6);

BEGIN

   --Update  
   IF updating THEN
     cTipo:='UPDATE';
   END IF;
   --Delete
   IF deleting THEN
     cTipo:='DELETE';
   END IF;
   --Inserindo dados
   insert into A_NOTA_LOG values ( A_SEQ_LOG.NEXTVAL,
                                   :old.RA,
                                   :old.COD_CURSO,
                                   :old.COD_DISC,
                                   :old.SEMESTRE_ANO,
                                   :old.SEQ_NOTA,
                                   :old.VALOR_NOTA,
                                   :new.VALOR_NOTA,
                                   SYSDATE,
                                   cTipo);

END;