Páginas

29 de nov. de 2010

Recuperando dados da sessão de usuário

Pessoal,
 
     No artigo de hoje irei demonstrar o uso da função SYS_CONTEXT, uma função muito simples e útil do Oracle Database, que pode ser utilizada, por exemplo, para recuperar dados de uma sessão de usuário e e permitir auditoria de acesso. Como parte das minhas atividades de administração e segurança de BD, eu já utilizei essa função várias vezes dentro de triggers de logon para permitir verificar quem está se conectando no BD, horário, aplicação etc.

    A função SYS_CONTEXT pode ser utilizada tanto em instruções SQL quanto em blocos PL/SQL. No Oracle 10g/11g ela retorna um valor do tipo VARCHAR2 e aceita 2 parâmetros de entrada, também do tipo VARCHAR2: namespace e parâmetro. Esta função permite retornar dados de diversos tipos de contexto (conjunto de atributos ou variáveis predefinidas que são utilizadas por uma aplicação), dentre eles, o contexto USERENV, que é criado automaticamente pelo Oracle quando um usuário inicializa uma sessão de Banco de Dados, e que contém dados que descrevem a atual sessão do usuário.

     Segue abaixo um exemplo de instrução SQL utilizada para retornar dados do contexto USERENV relacionados à sessão de usuário atual (sessão que irá executar a instrução SQL):

         SELECT SYS_CONTEXT('USERENV', 'SERVER_HOST')   "Nome SERVIDOR",
                        SYS_CONTEXT('
USERENV', 'INSTANCE_NAME') "Instância",
                        SYS_CONTEXT('
USERENV', 'HOST')          "CLIENTE",
                        SYS_CONTEXT('
USERENV', 'IP_ADDRESS')    "IP Cliente",
                        SYS_CONTEXT('
USERENV', 'OS_USER')       "Usuário SO",
                        SYS_CONTEXT('
USERENV', 'SESSION_USER')  "Usuário BD"
          FROM    DUAL;



Obs.: Se a instrução acima fosse executada em uma máquina cliente com o nome ws01 e IP 10.1.1.2, com o usuário de nome administrador logado no SO, conectado no BD bd1 do servidor server01, com o usuário de BD fabio, o resultado seria:
          Nome SERVIDOR  | Instância | CLIENTE | IP Cliente |  Usuário SO    | Usuário BD
          server01                     bd1          ws01          10.1.1.2      administrador   fabio 


   

     Para mais informações, consulte os links das referências.


Referências:
     http://download.oracle.com/docs/cd/B14117_01/server.101/b10759/functions150.htm#g1513460
     http://psoug.org/reference/sys_context.html

6 comentários:

  1. Este comando me auxiliou a pegar os dados do usuários, sendo que o da v$session é muito curto para gravar todos os dados informados pelo sistema.

    Muito Obrigado.

    ResponderExcluir
  2. Ajudou bastante a diminuir alguns trabalhos aqui. Obrigado!

    ResponderExcluir
  3. Alguém sabe o porque no ambiente WEB do Forms 11g, não retorna dados do terminal? tando usando o userenv quanto sys_context. Somente rodando via PL/SQL developer ou via CTRL+R me retorna o valor.

    ResponderExcluir
    Respostas
    1. Nunca mexi com Forms, portanto não sei lhe responder... talvez algum dia se alguém ler essa msg e puder lhe ajudar, a pessoa irá lhe responder, mas sugiro que ao invés de esperar essa resposta, que você faça pesquisas no google.
      []s

      Excluir