Pular para o conteúdo
  • Este tópico contém 9 respostas, 4 vozes e foi atualizado pela última vez 13 anos atrás por Avatar de rmanrman.
Visualizando 10 posts - 1 até 10 (de 10 do total)
  • Autor
    Posts
  • #99804
    Avatar de airoospairoosp
    Participante

      Boa tarde,

      Pesquisa na internet sobre triggers de auditoria encontrei o script abaixo. A trigger foi criada assim como a tabela mas ao fazer testes com o usuário scott nada foi gravado na planilha. (banco 9i)

      Login com usuário sys para criar a tabela e a trigger.

      CREATE TABLE user_login_audit (
      login_time DATE,
      username VARCHAR2(30),
      machine VARCHAR2(30),
      command VARCHAR2(128)
      );

      create or replace trigger user_login_trig
      after logon on scott.schema
      declare
      v_username sys.v_$session.username%type;
      v_machine sys.v_$session.machine%type;
      v_command sys.v_$session.command%type;
      begin

      select username, machine, command
      into v_username, v_machine, v_command
      from sys.v_$session

      where audsid = userenv(‘sessionid’)
      and audsid != 0 — don’t check sys connections
      and rownum = 1; — parallel processes will have the same audsid’s
      insert into sys.user_login_audit
      values (sysdate, v_username, v_machine, v_command);
      if upper(v_machine) like ‘%pc1%’ then
      — start sql trace for users from pc1
      dbms_session.set_sql_trace(true);

      end if;
      end;

      Depois login com usuário scott, executada uma consulta em uma tabela.

      Novamente login com usuário sys e executada a query abaixo.

      select * from sys.user_login_audit (sem registros)

      Há alguma coisa errada na criação da trigger?

      Obrigado.

      Airton

      #99807
      Avatar de rmanrman
      Participante

        [quote=”airoosp”:3lsawgse]Boa tarde,

        Pesquisa na internet sobre triggers de auditoria encontrei o script abaixo. A trigger foi criada assim como a tabela mas ao fazer testes com o usuário scott nada foi gravado na planilha. (banco 9i)

        Login com usuário sys para criar a tabela e a trigger.

        CREATE TABLE user_login_audit (
        login_time DATE,
        username VARCHAR2(30),
        machine VARCHAR2(30),
        command VARCHAR2(128)
        );

        create or replace trigger user_login_trig
        after logon on scott.schema
        declare
        v_username sys.v_$session.username%type;
        v_machine sys.v_$session.machine%type;
        v_command sys.v_$session.command%type;
        begin

        select username, machine, command
        into v_username, v_machine, v_command
        from sys.v_$session

        where audsid = userenv(‘sessionid’)
        and audsid != 0 — don’t check sys connections
        and rownum = 1; — parallel processes will have the same audsid’s
        insert into sys.user_login_audit
        values (sysdate, v_username, v_machine, v_command);
        if upper(v_machine) like ‘%pc1%’ then
        — start sql trace for users from pc1
        dbms_session.set_sql_trace(true);

        end if;
        end;

        Depois login com usuário scott, executada uma consulta em uma tabela.

        Novamente login com usuário sys e executada a query abaixo.

        select * from sys.user_login_audit (sem registros)

        Há alguma coisa errada na criação da trigger?

        Obrigado.

        Airton[/quote]

        Analisando a trigger, vi é que feito um INSERT, mas não tem nenhum COMMIT.

        Creio que unica forma de dar COMMIT dentro de uma trigger é fazendo uma transação autonoma.

        Tente da seguinte forma:


        create or replace trigger user_login_trig
        after logon on scott.schema
        declare
        v_username sys.v_$session.username%type;
        v_machine sys.v_$session.machine%type;
        v_command sys.v_$session.command%type;
        PRAGMA AUTONOMOUS_TRANSACTION;
        begin

        select username, machine, command
        into v_username, v_machine, v_command
        from sys.v_$session
        where audsid = userenv('sessionid')
        and audsid != 0 -- don't check sys connections
        and rownum = 1; -- parallel processes will have the same audsid's

        insert into sys.user_login_audit
        values (sysdate, v_username, v_machine, v_command);

        COMMIT;

        if upper(v_machine) like '%pc1%' then
        -- start sql trace for users from pc1
        dbms_session.set_sql_trace(true);

        end if;
        end;

        O uso de transação autonoma geralmente deve ser usado em ultimo recurso. Então fica a pergunta, é possível resolver isso sem o uso da transação autonoma? Pra mim é o unico jeito…

        #99810
        Avatar de lordmacalordmaca
        Participante

          Totalmente correto RMAN, somente com autonomous transaction.

          #99818
          Avatar de airoospairoosp
          Participante

            Boa tarde,

            Fiz a alteração que você comentou e mesmo assim não foi gravado nenhum registro na tabela.

            Será que tem que habilitar algum parâmetro do banco?

            Obrigado.

            Airton

            #99823
            Avatar de rmanrman
            Participante

              Ue…

              Realmente foi declarado PRAGMA AUTONOMOUS_TRANSACTION ?


              if upper(v_machine) like '%pc1%' then
              -- start sql trace for users from pc1
              dbms_session.set_sql_trace(true);

              Nesta forma nunca vai entrar neste IF. Aplique UPPER() dos dois lados, ou %pc1% em maiusculo


              if upper(v_machine) like '%PC1%' then
              -- start sql trace for users from pc1
              dbms_session.set_sql_trace(true);

              Mas creio que o problema de não gravar não é esse IF…

              #99827
              Avatar de airoospairoosp
              Participante

                Acho que a trigger não esta sendo executada.

                #99829
                Avatar de IshiiIshii
                Participante

                  Olá,

                  Olhando com mais calma, acho que essa parte do código

                  where audsid = userenv('sessionid')

                  Deveria ser:

                  where sid = userenv('sessionid')

                  Teste e nos responda…

                  []s Ishii

                  #99834
                  Avatar de airoospairoosp
                  Participante

                    Ishii,

                    Fiz a alteração que você falou e não funcionou.

                    Airton

                    #99835
                    Avatar de airoospairoosp
                    Participante

                      Habilitei o parâmetro _SYSTEM_TRIG_ENABLED e a trigger funcionou, o estranho foi que a cada sessão a trigger grava duas linhas para o mesmo usuário.

                      Airton

                      #99836
                      Avatar de rmanrman
                      Participante

                        _SYSTEM_TRIG_ENABLED
                        Defaults to true and Oracle recommends setting it to false only during database upgrade.

                        If this parameter is set to false, then system triggers won’t be executed.

                        O padrão é true, alguém deve ter setado false em algum momento, não conhecia o parametro…

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