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 BDserver01 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
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.
ResponderExcluirMuito Obrigado.
Que bom que o artigo foi útil!
Excluir[]s
Ajudou bastante a diminuir alguns trabalhos aqui. Obrigado!
ResponderExcluirObrigado pelo feedback Cesar
ExcluirAlgué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.
ResponderExcluirNunca 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.
Excluir[]s