Pular para o conteúdo
  • Este tópico contém 1 resposta, 2 vozes e foi atualizado pela última vez 5 anos, 1 mês atrás por Avatar de José Laurindo ChiappaJosé Laurindo Chiappa.
Visualizando 2 posts - 1 até 2 (de 2 do total)
  • Autor
    Posts
  • #139607
    Avatar de Claudio ReisClaudio Reis
    Participante

      Boa noite pessoal,
      Sou iniciante e gostaria de uma ajuda numa questão
      tenho uma coluna salario e criei uma nova coluna old_salario na tabela emp
      quero quando der um aumento para certo funcionario o salario antigo va para este campo old_salario.
      eu criei esta trigger mas esta dando erro, outra duvida como eu coloco na clausula para ele saber que é tudo do mesmo funcionario?
      tenho o seguinte codigo:

      CREATE OR REPLACE TRIGGER old_salario_emp
      BEFORE UPDATE
      ON emp
      FOR EACH ROW
      WHEN (NEW.SAL > 0)

      DECLARE
      salario number;
      BEGIN
      salario := :OLD.sal;
      update emp set old_salario = salario;
      END;

      #139719
      Avatar de José Laurindo ChiappaJosé Laurindo Chiappa
      Moderador

        Blz ? Então, o conceito que te falta é o seguinte : quando vc declara uma trigger como FOR EACH ROW, se ela for do tipo BEFORE o que ocorrer ** automagicamente ** para CADA registro/linha da tabela que for afetado pelo INSERT ou UPDATE ou DELETE os valores TODOS que vão ser aplicados no registro vão pra uma variável do tipo RECORD na memória chamada NEW e os valores que estão atualmente no registro vão pra uma variável chamada OLD… O pulo do gato é que essa variável NEW é ALTERÁVEL, e se vc a alterar , é ESSE VALOR ALTERADO que vai pra tabela….
        Sendo assim, teu trigger vai ficar (supondo que na tabela emp vc tem uma coluna SAL que é o salário a alterar e uma outra coluna OLD_SALARIO que vc quer botar o valor que estava ANTES do DML, e Aproveitando pra especificar que a trigger só dispara se o UPDATE estiver ocorrendo na coluna SAL) :

        CREATE OR REPLACE TRIGGER old_salario_emp BEFORE UPDATE OF sal ON emp FOR EACH ROW
        WHEN (NEW.SAL > 0)
        BEGIN
           :NEW.old_salario := :OLD.sal;
        END;
        

        => PRONTO !! Como a trigger é BEFORE e FOR EACH ROW , como eu disse AUTOMAGICAMENTE os valores das colunas da tabela VÂO ir pra uma variável NEW, E se vc alterar o conteúdo dela esse valor alterado VAI ser usado… NÃO FAZ SENTIDO (e nem é permitido, sob pena de erro MUTATING TRIGGER) vc querer fazer INSERT, UPDATE ou DELETE na tabela à qual a trigger está amarrada…
        Exemplo :

        scott@DESENV:SQL>desc emp
         Name                            Null?    Type
        
        <hr />
        
        EMPNO                           NOT NULL NUMBER(4)
         ENAME                                    VARCHAR2(10)
         JOB                                      VARCHAR2(9)
         MGR                                      NUMBER(4)
         HIREDATE                                 DATE
         SAL                                      NUMBER(7,2)
         COMM                                     NUMBER(7,2)
         DEPTNO                                   NUMBER(2)
        
        scott@DESENV:SQL>alter table EMP add OLD_SALARIO number(7,2);
        
        Tabela alterada.
        
        scott@DESENV:SQL>CREATE OR REPLACE TRIGGER old_salario_emp BEFORE UPDATE OF sal ON emp FOR EACH ROW
          2  WHEN (NEW.SAL > 0)
          3  BEGIN
          4     :NEW.old_salario := :OLD.sal;
          5  END;
          6  /
        
        Gatilho criado.
        
        scott@DESENV:SQL>select deptno, empno, ename, sal, old_salario from emp order by 1,4;
        
        DEPTNO     EMPNO ENAME            SAL OLD_SALARIO
        
        <hr />
        
        

        10 7934 MILLER 1300
        10 7782 CLARK 2450
        10 7839 KING 5000
        20 7369 SMITH 800
        20 7876 ADAMS 1100
        20 7566 JONES 2975
        20 7788 SCOTT 3000
        20 7902 FORD 3000
        30 7900 JAMES 950
        30 7654 MARTIN 1250
        30 7521 WARD 1250
        30 7844 TURNER 1500
        30 7499 ALLEN 1600
        30 7698 BLAKE 2850

        
        
        14 linhas selecionadas.
        
        scott@DESENV:SQL>update emp set SAL = SAL + 10 where sal = 1250;
        
        2 linhas atualizadas.
        
        scott@DESENV:SQL>select deptno, empno, ename, sal, old_salario from emp order by 1,4;
        
        DEPTNO     EMPNO ENAME            SAL OLD_SALARIO
        
        <hr />
        
        

        10 7934 MILLER 1300
        10 7782 CLARK 2450
        10 7839 KING 5000
        20 7369 SMITH 800
        20 7876 ADAMS 1100
        20 7566 JONES 2975
        20 7788 SCOTT 3000
        20 7902 FORD 3000
        30 7900 JAMES 950
        30 7654 MARTIN 1260 1250
        30 7521 WARD 1260 1250
        30 7844 TURNER 1500
        30 7499 ALLEN 1600
        30 7698 BLAKE 2850

        
        
        14 linhas selecionadas.

        ===> Não tem segredo, blz ??

        []s

        Chiappa

      Visualizando 2 posts - 1 até 2 (de 2 do total)
      • Você deve fazer login para responder a este tópico.
      plugins premium WordPress