Páginas

16 de abr. de 2013

Identificando usuários de aplicações WEB com a package DBMS_APPLICATION_INFO

Olá pessoal,

     No artigo de hoje vou mostrar como identificar usuários de aplicações WEB em sessões de BD, através da package DBMS_APPLICATION_INFO. Essa package, ao ser corretamente utilizada (pelos Desenvolvedores), pode ajudar os DBAs (ou usuários de BD com este papel) a identificar através das visões V$SESSION e/ou V$SQLAREA, quem está usando um determinado sistema que se conecta ao Banco de Dados com uma só conta de usuário de BD, mas cujo sistema possui diversos usuários que são gerenciados no nível da aplicação. Este monitoramento pode ajudar a detectar problemas e até mesmo possibilitar no BD uma auditoria mais fina, no nível de usuário da aplicação!
 
      É muito comum vermos aplicações web que se conectam no BD com uma única conta de BD e que possuem gerenciamento de usuários implementado no nível da aplicação. É importante, neste momento, distinguir a diferença entre contas de usuários de BD e contas de usuários da aplicação. Pegando como exemplo um sistema web de comércio eletrônico chamado ECOMMERCE, podemos dizer que contas de usuários da aplicação são as contas das pessoas que desejam comprar produtos no site deste sistema. No sistema ECOMMERCE, cada pessoa (possíveis compradores) tem uma senha e login, que ficam armazenados em uma tabela do Banco de Dados. Conta de usuário de BD, é a conta utilizada pela aplicação para se conectar no BD toda vez que ela tiver que buscar informações no BD, como por exemplo, para validar o login de um usuário ou pesquisar informações de um produto. Para entender melhor esse ambiente, na Figura 1 podemos ver que existem vários usuários de sistema (Fábio, Ana, José etc.) e uma única conta de usuário de BD (ECOMMERCE), que se conecta no BD "PRD".

Figura 1: Relação entre usuários do sistema de comércio eletrônico e o usuário de Banco de Dados

     Na aplicação acima, sem o uso da package DBMS_APPLICATION_INFO, não dá para identificar ou monitorar qual usuário da aplicação executou determinada operação no BD, pois todos os usuários da aplicação se conectam através de uma única conta (ECOMMERCE). Uma solução, neste caso, para identificar ou monitorar dentro do BD Oracle, usuários específicos da aplicação, é usar a stored procedure SET_CLIENT_INFO da package DBMS_APPLICATION_INFO. Seguem abaixo os passos necessários para implementar e monitorar esta solução:

     1- No código da aplicação, após logon do usuário, chame a stored procedure DBMS_APPLICATION_INFO.SET_CLIENT_INFOpassando como valor para o parâmetro CLIENT_INFO, o nome do usuário da aplicação. Exemplo:

          begin
           DBMS_APPLICATION_INFO.SET_CLIENT_INFO (CLIENT_INFO => 'FABIO');
          end;


     2- Execute a consulta abaixo na V$SESSION para verificar quais usuários da aplicação estão conectados no BD. A coluna CLIENT_INFO informará o nome do usuário que foi configurado no passo anterior:

          select   USERNAME, CLIENT_INFO, 
                   TO_CHAR(LOGON_TIME, 'DD/MM/YYYY HH24:MI:SS') AS LOGON_TIME
          from     v$session 
          where    username = 'ECOMMERCE';

         Resultado:
              USERNAME      CLIENT_INFO   LOGON_TIME
              -------------     ----------------  -----------------------
              ECOMMERCE   FABIO                14/04/2013 22:06:52 


           Obs.: É possível também, rastrear as instruções SQL do usuário consultando a visão V$SQLAREA.

   
    Pronto! Vimos que a implantação e monitoramento do procedimento é muito simples e rápida! A package DBMS_APPLICATION_INFO possui ainda, outras procedures que podem ser utilizadas, por exemplo, para permitir o mapeamento do uso de recursos do BD, por módulo de uma aplicação. Para que aqueles que buscam mais informações sobre o assunto, sugiro a leitura do artigo
Rastreando SQL com DBMS_APPLICATION_INFO no Oracle 11g R2.
   

Por hoje é só!

7 comentários:

  1. Olá Fabio, ótimo artigo. Gostaria de saber se este procedimento pode ser utilizado no caso de ter no código uma variável que recebe o login digitado e depois retorna como parâmetro para a package.
    Fui clara? Não trabalho com desenvolvimento.
    Grata, Camilla.

    ResponderExcluir
    Respostas
    1. Oi Camilla, obrigado pelo comentário!
      Não entendi, por favor explique com mais detalhes o q vc quis perguntar! :-(

      Excluir
  2. No artigo diz:

    1- No código da aplicação, após logon do usuário, chame a stored procedure DBMS_APPLICATION_INFO.SET_CLIENT_INFO, passando como valor para o parâmetro CLIENT_INFO, o nome do usuário da aplicação. Exemplo:

    begin
    DBMS_APPLICATION_INFO.SET_CLIENT_INFO (CLIENT_INFO => 'FABIO');
    end;

    Neste exemplo, vc utilizou o usuário 'FABIO'. Eu poderia ter uma variável qualquer no lugar da string 'FABIO'?

    ResponderExcluir
  3. Fabio bom dia, estou precisando testar todos os modulos de uma procedure em um cliente porem na v$session apaga o histórico . Saberia me informar se consigo guarda o historico de todas as ações criada com o DBMS_APPLICATION_INFO, para que eu consiga analisar o consumo de memoria de cada processo?

    ResponderExcluir
    Respostas
    1. Carlos, vc não consegue ver o histórico. Se neste caso você precisa do histórico você terá que criá-lo. Talvez você possa criá-lo através de uma trigger de logon que grava dados em uma tabela criada por você, ok?
      []s

      Excluir