Pular para o conteúdo
Visualizando 13 posts - 1 até 13 (de 13 do total)
  • Autor
    Posts
  • #95644
    Niggaz
    Participante

      Boa tarde galera,

      estou criando um trigger para armazenar o momento que determinado schema se logou no banco
      Porém eu gostaria de armazenar tbm o OSUSER e PROGRAM que o usuario se conectou…mas não rola do jeito que estou tentando.


      CREATE OR REPLACE
      TRIGGER TAL AFTER LOGON ON SCHEMA
      DECLARE
      v_usuario VARCHAR2(30):=null;
      BEGIN
      SELECT osuser INTO v_usuario FROM V$SESSION WHERE AUDSID = USERENV('sessionid') AND ROWNUM <=1; INSERT INTO LOGON VALUES ('O usuário '||USER||' se conectou as '||TO_CHAR(sysdate,'DD-MM-YYYY HH24:MI:SS')||v_usuario); END;

      Pelo oq eu percebi, ele não está aceitando o SELECT osuser...fala que a tabela não existe. 8O

      Oq poderia resolver isso??

      Abs

      #95645
      Ishii
      Participante

        Olá

        Qual o owner dessa trigger? Se não for um com grant DBA ele não tem privilégio na v$session mesmo…se for o caso conceda o privilégio necessário. (Como se trata de uma trigger de auditoria eu normalmente coloco no Sys mesmo, mas isso é uma decisão individual)


        select machine, osuser
        into vMachine, vOsUser
        from v_$session
        where sid = SYS_CONTEXT ('USERENV', 'SID') ;

        Nesse caso eu uso a v_$session e a máquina também do login (ai eu sei se foi remoto ou não…) Outro ponto é o SYS_CONTEXT pois evita o rownum que você utiliza…

        []s Ishii

        #95646
        Niggaz
        Participante

          Opa, eae Ishii blz?

          Então, o usuário tem permissões de DBA sim.
          Eu consigo fazer select na session normalmente.

          Só para ter certeza, eu fui no system(base de teste) e tentei criar a TRIGGER…não funcionou, retornando o mesmo erro.

          🙁

          #95647
          Ishii
          Participante

            Olá,

            Mude a query que alimenta a sua variável osuser para o modelo que eu te passei e teste novamente. Se não der, coloque o erro que aparece aqui.

            []s Ishii

            #95648
            Niggaz
            Participante

              CREATE OR REPLACE TRIGGER TAL AFTER LOGON ON SCHEMA
              DECLARE
              vMachine VARCHAR2(30);
              vOsUser VARCHAR2(30);
              BEGIN
              select machine, osuser into vMachine, vOsUser from v$session where sid = SYS_CONTEXT ('USERENV', 'SID');
              INSERT INTO LOGON2 VALUES
              ('O usuário '||USER||' se conectou as '||TO_CHAR(sysdate,'DD-MM-YYYY HH24:MI:SS')||vOsUser);
              END;
              /

              Erros:

              5/56 PL/SQL: ORA-00942: a tabela ou view não existe
              5/5 PL/SQL: SQL Statement ignored

              OBS: Ele aponta o erro no SCHEMA.

              Abs

              #95649
              Ishii
              Participante

                Olá,

                Agora que eu vi na parte do schema deve estar informando qual o owner/schema você quer auditar…

                Seria algo assim: scott.SCHEMA ou SYSTEM.SCHEMA .SCHEMA

                Tente novamente.

                []s Ishii

                #95653
                Niggaz
                Participante

                  Não funcionou tbm…

                  Nesse banco q eu quero fazer a auditoria, existem vários schemas…
                  eu quero auditar todos eles.

                  #95654
                  Ishii
                  Participante

                    Olá

                    Testei numa Base Oracle 10g no usuário SYS o seguinte código:

                    create or replace trigger traudit after logon on database
                    declare
                    v_usuario varchar2(30):=null;
                    begin
                    select osuser into v_usuario from v$session where sid = SYS_CONTEXT ('USERENV', 'SID')
                    and username is not null;
                    insert into audit_logon values
                    ('o usuário '||v_usuario||' se conectou as '||to_char(sysdate,'dd-mm-yyyy hh24:mi:ss')||v_usuario);
                    end;
                    /

                    E funcionou, nesse caso você tem que usar o after logon on DATABASE.

                    []s Ishii
                    ps: mande a msg de Erro Oracle que retorna…

                    #95655
                    Niggaz
                    Participante

                      Ishii,

                      eu consegui utilizando os parametros do USERENV , veja:


                      CREATE OR REPLACE TRIGGER TAL AFTER LOGON ON DATABASE
                      BEGIN
                      IF (USER NOT IN ('SYSMAN', 'SYSTEM', 'DBSNMP'))THEN
                      INSERT INTO LOGON VALUES
                      (SYS_CONTEXT('USERENV', 'OS_USER')||' conectou na '||USER||' as '||
                      TO_CHAR(SYSDATE,'DD-MM-YYYY HH24:MI:SS'));
                      END IF;
                      END;
                      /

                      Funcionou exatamente como eu queria…porém ele insere duas linhas na tabela…com uma diferença de 2/3 segundos. Como faço pra inserir apenas uma linha?

                      OBS.Da outra forma que vc passou com o select, eu não consegui…deu o mesmo erro.

                      Abs 😆

                      #95656
                      Niggaz
                      Participante

                        ACHO que consegui resolver…

                        Eu estava testando pelo TOAD, ele deve fazer duas requisições de conexão. Pois executando pelo sqlplus ele insere normalmente! 😀

                        Vou fazer mais alguns testes e aviso sobre qualquer coisa!

                        Obrigado ishii!

                        #95658
                        Niggaz
                        Participante

                          Alguém saberia me explicar, pq o TOAD faz duas conexões?

                          Pelo sqlplus, a trigger grava somente uma linha na tabela(que é oq eu preciso), mas pelo TOAD, ou pelo programa utilizado aqui na empresa(Delphi) a trigger grava duas…oq acontece?

                          #95660
                          diegomello
                          Participante

                            Opa..
                            No PL/SQL Developer, tu pode escolher a maneira de fazer a conexão com o banco:
                            ~> Multi Session
                            ~> Dual Session
                            ~> Single Session

                            No TOAD, deve ter algo parecido.

                            #95663
                            Niggaz
                            Participante

                              Então diegomello,

                              eu procurei mas não achei nada a respeito disso. 😥

                              Eu criei um outro trigger de LOGOFF, para poder mapear o momento que o usuario saiu do banco. Só por curiosidade eu deletei todos os registros da tabela que armazena essas informações e fiz uma conexão com um usuario qualquer, fiz uma consulta na tabela e para minha alegria (:evil:), foram gravadas 3 linhas 😕 .

                              LOGON : 24-08-2010 10:39:33
                              LOGOFF: 24-08-2010 10:39:35
                              e outro LOGON: 24-08-2010 10:39:35 (mesmo momento do LOGOFF).

                              Se eu entendi bem, ele conecta, desconecta e conecta novamente!!!

                              Aff…coisa de louco! rs

                              Isso pelo TOAD!
                              pelo sqlplus? Tudo normal!

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