Pular para o conteúdo
Visualizando 4 posts - 1 até 4 (de 4 do total)
  • Autor
    Posts
  • #84840
    nathanael
    Participante

      Pessoal ,

      Sou iniciante no PL-SQL, e estou tentando criar uma trigger de auditoria onde me retorna alguns erro:

      Table:
      desc logauditoria
      Name Null Type
      —————————— ——– ———————————————————————————————————————————————————————————————
      CODIGO NOT NULL NUMBER
      DADOS_ANTES NOT NULL VARCHAR2(300)
      DADOS_DEPOIS NOT NULL VARCHAR2(300)
      USUARIO VARCHAR2(300)
      DATAALTERADO DATE
      TABELA VARCHAR2(60)
      OPERACAO VARCHAR2(60)

      codigo trigger :
      create or replace trigger tr_cidade
      before insert or update or delete on cidade
      for each row
      declare
      usuario varchar2(60);
      begin
      select user into usuario from dual;
      —-inserção
      if(:old.codigo_cidade is null ) then

      insert into logauditoria (codigo,dados_antes,dados_depois,usuario,dataalterado,tabela,operacao)
      values(seqauditoria.nextval,’Novo registro’,to_char(:new.codigo_cidade)||’, ‘||:new.nome_cidade ||’, ‘||:new.uf ||’, ‘||to_char(:new.taxa),usuario,sysdate,’cidade’,’Inserção’);

      else
      if (updating) then

      insert into logauditoria (codigo,dados_antes,dados_depois,usuario,dataalterado,tabela,operacao) values(seqauditoria.nextval,to_char(old.codigo_cidade)||’, ‘||:old.nome_cidade ||’, ‘||:old.uf ||’, ‘||to_char(:old.taxa),to_char(new.codigo_cidade)||’, ‘||:new.nome_cidade ||’, ‘||:new.uf ||’, ‘||to_char(:new.taxa),usuario,sysdate,’cidade’,’Alteração’);

      else
      if (deleting) then

      insert into logauditoria (codigo,dados_antes,dados_depois,usuario,dataalterado,tabela,operacao)
      values(seqauditoria.nextval,to_char(old.codigo_cidade)||’, ‘||:old.nome_cidade ||’, ‘||:old.uf ||’, ‘||to_char(:old.taxa),to_char(new.codigo_cidade)||’, ‘||:new.nome_cidade ||’, ‘||:new.uf ||’, ‘||to_char(:new.taxa),usuario,sysdate,’cidade’,’Exclusão’);

      end if;
      end if;
      end if;
      end tr_cidade;

      erros:

      Error(19,9): PL/SQL: SQL Statement ignored
      Error(19,186): PL/SQL: ORA-00984: coluna não permitida aqui
      Error(24,9): PL/SQL: SQL Statement ignored
      Error(25,161): PL/SQL: ORA-00984: coluna não permitida aqui

      #84847
      Ishii
      Participante

        Nathanael,

        Acho que faltou o : em algumas declarações de colunas…

        to_char(new.codigo_cidade)||', deveria ser
        to_char(:new.codigo_cidade)||'

        Reveja se há mais casos que estejam faltando e complete…e como sugestão não precisa criar uma variável usuário, pode usar o USER direto no insert…

        []s Ishii

        #84853
        Avatar photoLeonardo Litz
        Participante

          Olá Nathanael.

          Estava dando uma olhada em seu código e vi que é possível melhora-lo.
          Alterei sua trigger para que ela fique mais consisa e de mais fácil manutenção.

          A trigger:

          create or replace trigger tr_cidade
          before insert or update or delete on cidade
          for each row
          declare

          —procedure de inserção
          procedure insere_log(p_modo in varchar2)
          is
          v_dados_antes varchar2(400);
          v_dados_depois varchar2(400);
          begin

          if(p_modo = ‘Inserção’)then
          v_dados_antes := ‘Novo registro’;
          else
          v_dados_antes := to_char(:old.codigo_cidade) || ‘, ‘ || 😮 ld.nome_cidade || ‘, ‘ ||:old.uf || ‘, ‘ || to_char(:old.taxa);
          end if;

          if(p_modo = ‘Exclusão’)then
          v_dados_depois := ‘Execusão do Registro’;
          else
          v_dados_depois := to_char(:new.codigo_cidade) || ‘, ‘ || :new.nome_cidade || ‘, ‘ ||:new.uf || ‘, ‘ || to_char(:new.taxa);
          end if;

          insert into logauditoria
          (codigo,
          dados_antes,
          dados_depois,
          usuario,
          dataalterado,
          tabela,
          operacao)
          values
          (seqauditoria.nextval,
          v_dados_antes,
          v_dados_depois,
          user,
          sysdate,
          ‘cidade’,
          p_modo);

          end insere_log;

          begin
          —-inserção
          if (inserting) then

              insere_log(p_modo => 'Inserção');
          

          –alteracao
          elsif (updating) then

             insere_log(p_modo => 'Alteração');
          

          —exclusao
          elsif (deleting) then

             insere_log(p_modo => 'Exclusão');
          

          end if;
          end tr_cidade;

          As alterações:
          1º Criei uma procedure privada dentro de sua trigger que fica responsável em inserir os dados na tabela de log.
          2º Retirei o select from dual, e utilizei a função user diretamente no insert.
          3º Ainda havia um erro que ao se inserir os dados no ato da exclusão não existe valores na variavel :new, substitui pela mensagem fixa.
          4º Substitui seus ifs encadeados pelos elsif.

          Vlw Leonardo Litz

          #84872
          nathanael
          Participante

            [quote=”Ishii”:1lyqal62]Nathanael,

            Acho que faltou o : em algumas declarações de colunas…

            to_char(new.codigo_cidade)||', deveria ser
            to_char(:new.codigo_cidade)||'

            Reveja se há mais casos que estejam faltando e complete…e como sugestão não precisa criar uma variável usuário, pode usar o USER direto no insert…

            []s Ishii[/quote]

            Obrigado amigo ,

            Era exatamente o que estava causando o erro.

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