quarta-feira, 13 de maio de 2009

Um pouco do pacote DBMS_APPLICATION_INFO ...

Olá,

Acredito que este artigo esteja mais direcionado para desenvolvedores de aplicações que fazem uso do banco de dados Oracle.

Problema:

Disponibilizar informações no Oracle, em tempo real, do que está sendo realizado por cada usuário de um sistema. Se um usuário acessar o banco de dado através de uma aplicação, deverá estar disponível para visualização, alguma informação que identifique o quê cada sessão está executando dentro da aplicação.

Solução:

Sabemos que a view dinâmica de desempenho V$SESSION nos oferece algumas informações das sessões que estão atualmente conectadas no banco de dados Oracle. Portanto, para resolver o problema acima, poderemos fazer o uso da view V$SESSION de forma a popular algumas colunas como MODULE, ACTION e CLIENT_INFO como demonstrarei mais abaixo.

Irei utilizar o pacote chamado DBMS_APPLICATION_INFO diponível no Oracle, na qual farei uso das procedures SET_MODULE e SET_CLIENT_INFO como demonstrado abaixo:

SQL> desc DBMS_APPLICATION_INFO;

PROCEDURE READ_CLIENT_INFO
Nome do Argumento Tipo In/Out Default?
------------------------------ ----------------------- ------ --------
CLIENT_INFO VARCHAR2 OUT
PROCEDURE READ_MODULE
Nome do Argumento Tipo In/Out Default?
------------------------------ ----------------------- ------ --------
MODULE_NAME VARCHAR2 OUT
ACTION_NAME VARCHAR2 OUT
PROCEDURE SET_ACTION
Nome do Argumento Tipo In/Out Default?
------------------------------ ----------------------- ------ --------
ACTION_NAME VARCHAR2 IN
PROCEDURE SET_CLIENT_INFO
Nome do Argumento Tipo In/Out Default?
------------------------------ ----------------------- ------ --------
CLIENT_INFO VARCHAR2 IN
PROCEDURE SET_MODULE
Nome do Argumento Tipo In/Out Default?
------------------------------ ----------------------- ------ --------
MODULE_NAME VARCHAR2 IN
ACTION_NAME VARCHAR2 IN
PROCEDURE SET_SESSION_LONGOPS
Nome do Argumento Tipo In/Out Default?
------------------------------ ----------------------- ------ --------
RINDEX BINARY_INTEGER IN/OUT
SLNO BINARY_INTEGER IN/OUT
OP_NAME VARCHAR2 IN DEFAULT
TARGET BINARY_INTEGER IN DEFAULT
CONTEXT BINARY_INTEGER IN DEFAULT
SOFAR NUMBER IN DEFAULT
TOTALWORK NUMBER IN DEFAULT
TARGET_DESC VARCHAR2 IN DEFAULT
UNITS VARCHAR2 IN DEFAULT

Imagine que estamos desenvolvendo um sistema de Controle de Estoque. Agora imagine um relatório fornecido pelo sistema que consolida as entradas e saídas de todos os materiais de um almoxarifado e que esse relatório possa ou não levar um tempo considerável para ser executado. Se quisermos visualizar no banco de dados através da view V$SESSION as sessões que estão executando este relatório, precisaríamos então incluir no fonte do sistema (antes do usuário submeter a execução do relatório), o comando abaixo:

Irei realizar uma simulação como se o sistema em uso fosse o próprio SQL*PLUS, utilizando o usuário SCOTT para realizar a conexão com o banco de dados:

SQL> exec dbms_application_info.set_module(
module_name => 'Controle de Estoque',
action_name => 'Executando Relatório de Materiais');

Procedimento PL/SQL concluído com sucesso.

Ao executar o procedimento acima, poderemos então obter tais informações selecionando as mesmas da view dinâmica de desempenho V$SESSION:

SQL> select osuser,machine,program,module,action from 
2 v$session where username='SCOTT';

OSUSER MACHINE PROGRAM MODULE ACTION
---------- ----------- ------------ ------------------- ---------------------------------
legatti MICRO_001 sqlplus.exe Controle de Estoque Executando Relatório de Materiais

Como demonstrado acima, podemos perceber que as colunas MODULE e ACTION foram populadas. Em resumo, poderemos então utilizar o pacote DBMS_APPLICATION_INFO em nossas aplicações de forma a disponibilizar ao administrador do sistema ou até mesmo ao DBA, uma opção para visualizar em tempo real "quem" está fazendo "o quê" dentro do sistema em questão.

Caso seja necessário disponibilizar mais informações, poderemos também fazer uso da coluna CLIENT_INFO como demonstrado abaixo:

SQL> exec dbms_application_info.set_client_info('data, hora, meu IP, etc...');

Procedimento PL/SQL concluído com sucesso.

SQL> select client_info from v$session where sid=(select sid from v$mystat where rownum=1);

CLIENT_INFO
--------------------------------
data, hora, meu IP, etc...

Como eu citei acima a informação de endereço IP, poderemos também fazer uso da função SYS_CONTEXT de forma a acessar esta e outras informações da sessão em questão:

SQL> select SYS_CONTEXT('USERENV', 'TERMINAL') micro,
2 SYS_CONTEXT('USERENV', 'IP_ADDRESS') ip,
3 SYS_CONTEXT('USERENV', 'OS_USER') usuario_rede from dual;

MICRO IP USUARIO_REDE
-------------- -------------- --------------
MICRO_001 192.168.1.10 legatti

No mais, restaria ao desenvolvedor encontrar a forma mais apropriada de implementar tal solução na linguagem de programação ou framework em uso (Java, PHP, Delphi, etc...).

sábado, 2 de maio de 2009

Arquivos dump de exportação armazenam as senhas dos usuários SYS e SYSTEM?

Olá,

Sabemos que o conteúdo de todo o banco de dados Oracle pode ser exportado para um arquivo dump de exportação usando a opção FULL=Y, seja usando o utilitário de exportação tradicional (exp) disponível em todas as versões do banco de dados Oracle ou usando o utilitário Export Data Pump (expdp) disponível apenas à partir do Oracle 10g. Vale a pena salientar que somente os usuários com a role EXP_FULL_DATABASE podem fazer isso, mas geralmente isso é realizado usando o usuário padrão SYSTEM.

Este artigo tem apenas o propósito de responder uma dúvida comum para aqueles (iniciantes ou não), que realizam uma exportação completa do banco de dados usando o utilitário de exportação tradicional (exp) através da cláusula FULL=Y.

Vamos às questões:

1) O arquivo dump de exportação armazena as senhas dos usuários de banco de dados de origem SYS e SYSTEM? Sim.

2) Quando for realizado a importação para um outro banco de dados, as senhas dos usuários SYS e SYSTEM do banco de dados de destino serão alteradas de acordo com as senhas dos usuário SYS e SYSTEM armazenadas no arquivo dump de exportação? Sim.

Abaixo, nada melhor do que provar esta afirmação ...

C:\>exp system/***** file=fullexport full=y

Export: Release 11.1.0.6.0 - Production on Sáb Mai 2 15:10:25 2009

Copyright (c) 1982, 2007, Oracle.  All rights reserved.

Conectado a: Oracle Database 11g Enterprise Edition Release 11.1.0.7.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
Exportação executada no conjunto de caracteres de WE8PC850  e no conjunto de caracteres
de AL16UTF16 NCHAR o servidor usa WE8MSWIN1252 conjunto de caracteres (conversão de
conjunto de caracteres possível)

Sobre exportar o banco de dados inteiro ...
. exportando definições de tablespace
. exportando perfis
. exportando definições de usuário
. exportando funções
. exportando custos de recurso
. exportando definições de segmento de rollback
. exportando vínculos de banco de dados
. exportando números de seqüência
. exportando nomes alternativos de diretórios
. exportando namespaces de contexto
. exportando nomes da biblioteca de função externa
. exportando sinônimos do tipo PÚBLICO
. exportando sinônimos do tipo privado
. exportando definições de tipos de objeto^C [CTRL+C]

C:\>findstr /C:"ALTER USER \"SYS" fullexport.dmp
ALTER USER "SYS" IDENTIFIED BY VALUES 'CA077AA8495E3C7C' TEMPORARY TABLESPACE "TEMP"
ALTER USER "SYSTEM" IDENTIFIED BY VALUES '6CAB666F511E3E36' TEMPORARY TABLESPACE "TEMP"
ALTER USER "SYSMAN" DEFAULT ROLE ALL
ALTER USER "SYSTEM" DEFAULT ROLE ALL
ALTER USER "SYSMAN" QUOTA UNLIMITED ON "SYSAUX"