Duvidas para recuperar o IP!!!

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
ccguedes
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 13
Registrado em: Qua, 12 Ago 2009 1:42 pm
Localização: SP

Pessoal, bom dia.
é o seguinte, estou em um trabalho de auditoria na empresa cliente. Por exemplo, eu tenho a tabela endereço e e tenho uma tabela de log "auditoria", nela vou ter os dados anterior e os dados novos (dados atualizados), porem quero também o IP da maquina de quem fez essa alteração, teria como ?


eu estou o usando o objeto SYS_CONTEXT('USERENV','IP_ADDRESS'), mas pelo que eu vi ele pega o IP da maquina local e não a que esta atualizando.

Essa tabela da auditoria, vai ser alimentada atraves de uma trigger que vou desenvolver, Se essa trigger estiver rodando no servidor o Ip sempre sera o mesmo, isso sai da regra. Teria como eu pegar o IP de quem está atualizando a tabela pelo Oracle?

desde já agradeço!!!

absssss
gfkauer
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 389
Registrado em: Ter, 27 Jul 2010 1:34 pm
Localização: Sapiranga - RS
Contato:
Quem falou que programar era fácil??

Quanto mais dificil for a implementação mais valorizado seu trabalho será!

Acessem: www.gfkauer.com.br

Pergunta, algum motivo especial para o uso do IP na sua auditoria?
Imaginando que cada usuário fisico tenha conta user, não bastaria dizer quem foi o User que efetuou a alteração?

"há mas o fulano sabe minha senha, não fui eu que fez a alteração...", Bom na empresa onde eu trabalho cada um é responsabilizado pelo seu usuário. Caso alguém sabe sua senha o problema é seu!
diegolenhardt
Moderador
Moderador
Mensagens: 1177
Registrado em: Qui, 15 Out 2009 10:28 am
Localização: Recife

veja na v$session, tem o nome da maquina lá
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Veja que legal:

Selecionar tudo


SQL>SQL> select
  2    SYS_CONTEXT('USERENV','IP_ADDRESS')                         MEU_IP
  3  , SYS_CONTEXT('USERENV','TERMINAL')                           NOME_DA_MINHA_MAQUINA
  4  , SYS_CONTEXT('USERENV','HOST')                               HOST_COMPLETO_MINHA_MAQUINA
  5  , SYS_CONTEXT('USERENV','SERVER_HOST')                        HOST_DO_SERVIDOR
  6  --
  7  , UTL_INADDR.get_host_address('pcjoao') IP_DO_HOST_INFORMADO
  8  , UTL_INADDR.get_host_name                                    HOST_DO_SERVIDOR
  9  , UTL_INADDR.get_host_name('172.16.2.81')                     HOST_DO_IP_INFORMADO
 10  from dual
 11  /
 
MEU_IP          NOME_DA_MINHA_MAQUINA  HOST_COMPLETO_MINHA_MAQUINA   HOST_DO_SERVIDOR   IP_DO_HOST_INFORMADO  HOST_DO_SERVIDOR   HOST_DO_IP_INFORMADO
--------------- ---------------------- ----------------------------- ------------------ --------------------- ------------------ ----------------------
10.2.1.126      ESTACAO19              GRUPO\ESTACAO19               oraserver01        172.16.2.81           pcjoao             pcjoao
 
SQL> 
diegolenhardt
Moderador
Moderador
Mensagens: 1177
Registrado em: Qui, 15 Out 2009 10:28 am
Localização: Recife

legal essa hein, pratiacmente um DNS, rsrs

mas a duvida dele, é se dentro da trigger o userenv vai retornar o IP do client...

acho que não não é?...
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Então, eu não testei pra ver.

Mas uma coisa que eu li:
http://download.oracle.com/docs/cd/B283 ... htm#i18574
Using Invoker's Rights or Definer's Rights (AUTHID Clause)

A unit whose AUTHID value is CURRENT_USER is called an invoker's rights unit, or IR unit.
A unit whose AUTHID value is DEFINER is called a definer's rights unit, or DR unit.

An anonymous block always behaves like an IR unit.
A trigger or view always behaves like a DR unit.
Eu acho que isso é valido só pra PERMISSOES de banco. Creio que o IP sempre vai ser o do cliente, mesmo se for rodado via trigger.

SÓ TESTANDO pra saber o que acontece :-/

1. Crie um função que retorna o IP com SYS_CONTEXT('USERENV','IP_ADDRESS')
2. Crie uma trigger que executa essa função e salva na tabela o resultado.

Veja qual IP sai.

Depois, tenta mudar a função de AUTHID CURRENT_USER pra AUTHID CURRENT_USER DEFINER... Só pra ver se muda algo. DUVIDO que vai mudar :-/
ishii
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 82
Registrado em: Ter, 28 Dez 2010 7:41 pm
Localização: São Paulo - SP

Olá,

Sim, o userenv vai retornar o IP do cliente, se o cliente for uma app web ai vai retornar o IP do servidor da app e não do usuario mesmo...

Tenho uma tabela e uma trigger que pega todas as alterações de um determinado user:

Selecionar tudo

CREATE TABLE audit_objects 
    ( 
     id_audit_objects NUMBER  NOT NULL , 
     dt_audit DATE , 
     owner_audit VARCHAR2 (30)  NOT NULL , 
     user_audit VARCHAR2 (30) , 
     os_user_audit VARCHAR2 (30) , 
     machine_audit VARCHAR2 (64) , 
     event_ora_audit VARCHAR2 (30) , 
     ip_address_audit VARCHAR2 (20) , 
     object_type_audit VARCHAR2 (20) , 
     object_name_audit VARCHAR2 (128) , 
     obs_audit VARCHAR2 (4000) 
    ) 
;
Tabela... que pode ser criada em qualquer user...

Selecionar tudo


create or replace trigger traud_objects
  before DDL on schema.<owner a ser auditado>
declare
--
vOsUser           v$session.osuser%type;
vMachineUser      v$session.machine%type;
vIdAuditObjects   number;
vSqlTxt           dbms_standard.ora_name_list_t;
vNum              pls_integer;
vStmt             varchar2(2000);
vObs              varchar2(2000);
--
begin
    select scvs_audit_objects.nextval
    into   vIdAuditObjects
    from   dual;  
  --
    select machine , osuser
    into   vMachineUser, vOsUser
    from   v$session 
    where  audsid = sys_context ('USERENV','SESSIONID');
  -- 
    if ora_sysevent = 'GRANT' then
    --
    -- Lista dos grantees
    --
      begin
      --
        vNum := ora_grantee (vSqlTxt);
        vObs := 'Users: ';
      --
        for i in 1..vNum loop
        --
          vObs := vObs || '-' || vSqlTxt(i);
        --
        end loop;
      --
      end;
    --
    elsif ora_with_grant_option = TRUE then
    --
      vObs := vObs || ' with grant option';
    --
    end if;
  --
    insert into audit_objects
    (id_audit_objects, dt_audit, owner_audit, user_audit, os_user_audit, machine_audit, event_ora_audit, ip_address_audit, object_type_audit, object_name_audit, obs_audit )
    values
    (vIdAuditObjects, sysdate, ora_dict_obj_owner, ora_login_user, vOsUser, vMachineUser, ora_sysevent, ora_client_ip_address, ora_dict_obj_type, ora_dict_obj_name, vObs );
--
end ;
/
Trigger que pode ser criada no mesmo user da tabela acima...

Mas o user tem que ter os seguintes grants no minimo

Selecionar tudo

grant administer database trigger to <user da trigger>;
grant create sequence to <user da trigger>;
grant select,references on v_$session to <user da trigger>;
grant select on dba_source to <user da trigger>;
grant select on dba_triggers to <user da trigger>;
grant select on dba_views to <user da trigger>;
Funciona desde a versão 9i até a 11g...

[]s Ishii
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 24 visitantes