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”.
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_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;
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.
Por hoje é só!
[]s
Referência: http://docs.oracle.com/cd/B19306_01/appdev.102/b14258/d_appinf.htm#CHEJCFGG
Publicado Originalmente em Blog Fabio Prado
1 Comentários
Boa tarde,
Muito bom procedimento, agora gostaria de saber , como faço para monitorar todos os usuários e não somente o “Fabio”, como foi no exemplo acima?
Abs:
Mário