Pular para o conteúdo
Visualizando 7 posts - 1 até 7 (de 7 do total)
  • Autor
    Posts
  • #82287
    Samuka
    Participante

      Pessoas tranqüiles?

      Estou tentando fazer uma trigger que me mostre quem fez algum DDL na database, mas estou com um problema na hora de trazer o sql.. segue a trigger

      CREATE OR REPLACE TRIGGER xxxxxxxxxx

      AFTER DDL ON DATABASE

      BEGIN
      INSERT INTO audit_sql(user_name, object_type, object_name,
      object_owner, sql_usado, creation_date)
      VALUES (USER, SYS.DICTIONARY_OBJ_TYPE, SYS.DICTIONARY_OBJ_NAME,
      SYS.DICITIONARY_OBJ_OWNER, SYS.SQL_TXT, SYSDATE);

      END xxxxxxxxxxxxx;

      Ele dá um erro na função SQL_TXT.. se eu executar tirando o campo do sql ele faz certinho..

      Já indiquei a auditoria do FGA mas querem uma trigger.. bem preciso de ajuada.

      Abraços a todos

      Samuka
      DBA Oracle Jr (Primeira semana.. será que irei durar..rs)

      #82291
      Avatar photoRegis Araujo
      Participante

        Samuka, boa noite!

        Só uma dúvida, o nome correto não é Sql_text ?? E você colocaria como parametro sys.sql_text ???

        Abraços..!!

        Pois esta informação ele busca da tabela v$sql correto?

        #82294
        Samuka
        Participante

          Tentei fazer de outro jeito e .. deu erro..

          CREATE OR REPLACE TRIGGER audita_objetos
          AFTER DDL ON DATABASE
          DECLARE
          V_textosql VARCHAR2(2000);
          BEGIN
          SELECT v$sql.sql_text
          INTO V_textosql
          FROM v$sql, v$session
          WHERE v$session.audsid = userenv (‘sessionid’)
          AND v$session.prev_sql_addr = v$sql.address;

              INSERT INTO audita_ddl (usuario, 
                                      tipo_objeto,
                                      nome_objeto,
                                      owner_objeto,
                                      ddl_usado,
                                      texto_sql,
                                      alterado_em)  
          

          VALUES (USER, SYS.DICTIONARY_OBJ_TYPE, SYS.DICTIONARY_OBJ_NAME,
          SYS.DICTIONARY_OBJ_OWNER, ORA_SYSEVENT, V_textosql, SYSDATE);
          END audita_objetos;

          Mensagem de erro:

          LINE/COL ERROR


          4/4 PL/SQL: SQL Statement ignored
          6/17 PL/SQL: ORA-00942: a tabela ou view não existe

          alguém tem uma solução..

          Abraços

          #82295
          Marcio68Almeida
          Participante

            Se não existe é por que o usuário não tem permissão de ver essa tabela…
            Mas…
            Por que mesmo você quer o comando de manipulação de dados ???

            #82296
            Samuka
            Participante

              Cara estou com o usuário system..

              NA verdade estou tentando de várias maneiras.. como não sei quase nada de PL tô meio perdido.. mas se existir um jeito mais facil de se obter estes dados eu agradeceria a informação…

              Abraços,

              Samuka

              #82298
              Marcio68Almeida
              Participante

                Você pode começar olhando a DBA_OBJECTS, que tem a data de criação e da última manipulação…
                Eu tinha feito em uma empresa uma tabela cópia diária da DBA_TAB_COLUMNS, para saber quando alguma estrutura de tabela foi alterada…
                Se você quer saber quem alterou, aí é outra coisa…

                #82324
                Samuka
                Participante

                  O meu maior problema é só capturar o sql usada no ddl.. o objeto, tipo do ddl, owner, log_os, ip, usuario isso eu consegui.. só estou com um problema para identificar o sql.. eu tentei usar as views v$open_cursor e v$sqltext mas o campo do sql é pequeno Varchar2(64), as outras são tudo CLOB.. tem como eu consultar essas CLOB e inserir em uma varchar?

                  Abraços,

                  Samuka

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