Pular para o conteúdo
  • Este tópico contém 4 respostas, 3 vozes e foi atualizado pela última vez 9 anos, 11 meses atrás por Avatar de alef pires de oliveiraalef pires de oliveira.
Visualizando 5 posts - 1 até 5 (de 5 do total)
  • Autor
    Posts
  • #107252
    Avatar de alef pires de oliveiraalef pires de oliveira
    Participante

      Pessoal,

      Preciso de ajuda em uma trigger de auditoria,essa trigger tem a função de inserir na tabela log a execução de comandos ddl em banco. O problema é que ela não dispara em todos os schemas somente em um deles.

      Abaixo segue a Trigger:

      CREATE OR REPLACE TRIGGER QUALIDADE.tr_log_ddl
      AFTER DDL
      ON QUALIDADE.SCHEMA
      — DISABLE
      DECLARE
      tmpVar NUMBER;

      vsql_text ora_name_list_t;
      vcomando_sql CLOB;
      n NUMBER;
      V_UsuarioAtualizacao CHAR (255);
      V_OSUSER VARCHAR2 (255);
      V_MAQUINA VARCHAR2 (255);
      BEGIN
      SELECT DISTINCT OSUSER, MACHINE
      INTO V_OSUSER, V_MAQUINA
      FROM V$SESSION
      WHERE AUDSID = USERENV (‘SESSIONID’)
      AND STATUS IN (‘ACTIVE’, ‘INACTIVE’)
      AND ROWNUM = 1;

      V_UsuarioAtualizacao := USER;

      IF PKG_AUDIT.COD_USUARIO IS NOT NULL
      THEN
      V_UsuarioAtualizacao := PKG_AUDIT.COD_USUARIO;
      END IF;

      n := ora_sql_txt (vsql_text);

      if vsql_text (1) like ‘ALTER %COMPILE%’ then
      return;
      end if;

      <>
      FOR i IN 1 .. n
      LOOP
      — exit busca_comando when length(vcomando_sql || vsql_text (i)) > 4000;
      vcomando_sql := vcomando_sql || vsql_text (i);
      END LOOP busca_comando;

      IF vcomando_sql not like ‘ALTER %COMPILE%’ THEN

      INSERT INTO qualidade.log_ddl (operacao,
      object_owner,
      object_name,
      object_type,
      sql_text,
      usuario_oracle,
      dthora,
      usuario_atualizacao,
      osuser,
      maquina)
      VALUES (ora_sysevent,
      ora_dict_obj_owner,
      ora_dict_obj_name,
      ora_dict_obj_type,
      vcomando_sql,
      USER,
      SYSDATE,
      V_UsuarioAtualizacao,
      V_OSUSER,
      V_MAQUINA);
      end if;
      END tr_log_ddl;
      /

      #107254
      Avatar de caadecarvalhocaadecarvalho
      Participante

        Olá, alef pires de oliveira,

        Você pode habilitar DDL para toda a base de dados alterando o código para AFTER DDL ON DATABASE. Caso queira modificar o código, utilize da função SYS_CONTEXT para retornar os dados necessários para fazer o INSERT ao invés de SELECTs em GV$s . A

        Abraços.

        #107264
        Avatar de alef pires de oliveiraalef pires de oliveira
        Participante

          Carlos,

          Eu alterei o codigo para after ddl on database e deu o seguinte erro ORA-01031: privilégios insuficientes ?

          att
          Alef Pires

          #107267
          Avatar de rmanrman
          Participante

            @alef pires de oliveira

            Para utilizar a cláusula ON DATABASE é necessário o privilegio de ADMINISTER DATABASE TRIGGER.

            Com um usuário DBA conceda o privilegio:


            GRANT ADMINISTER DATABASE TRIGGER TO QUALIDADE

            #107268
            Avatar de alef pires de oliveiraalef pires de oliveira
            Participante

              rman,
              Deu certo, muito obrigado pela ajuda

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