Para melhor visualização, recomendo resolução de no mínimo 1280 x 800 e navegador Mozilla Firefox


segunda-feira, 19 de maio de 2008

É possível saber a data de criação de uma ROLE no Oracle?

Por Eduardo Legatti

Olá,

Esta pergunta foi postada recentemente por um membro do Oracle OTN forums na qual o mesmo desejava obter a data de criação de uma role. Em um primeiro momento, poderíamos pensar em consultar a view DBA_ROLES mas a mesma não disponibiliza esta informação. Uma outra view que poderíamos pensar em consultar seria a DBA_OBJECTS, mas esta view não possui nenhuma informação relacionada a roles de banco de dados. Embora o Oracle não possua nenhuma view de dicionário de dados que se possa consultar para obter esta informação, ainda sim poderemos obte-la consultando a tabela base do dicionário de dados chamada USER$. Esta tabela base é utilizada pela view de dicionário de dados DBA_USERS normalmente consultada para obtenção de informações de usuários existentes no banco de dados. Na verdade, a tabela base USER$ possui uma coluna TYPE$ na qual armazena um valor de tipo. O valor [1] está associado para usuários de banco de dados e o tipo [2] para roles de banco de dados. Neste caso, como sabemos que a view DBA_USERS possui uma coluna chamada CREATED (baseada na coluna CTIME da USER$) utilizada para armazenar a data de criação de um usuário, poderemos também verificar a data de criação de uma role, acessando diretamente a tabela base USER$ como demonstrado no exemplo abaixo:
-- Criando uma role de teste
SQL> create role myrole;

Função criada.

-- Obtendo informação de data de criação da role
SQL> select name,to_char(ctime,'dd/mm/yyyy hh24:mi:ss') ctime
 2  from user$ where name='MYROLE';

NAME                            CTIME
------------------------------- -------------------
MYROLE                          19/05/2008 13:45:42

-- verificando que a tabela base user$ é de propriedade do usuário SYS
SQL> select owner,object_name,object_type from dba_objects
 2  where object_name="USER$"

OWNER               OBJECT_NAME                         OBJECT_TYPE
------------------- ----------------------------------- -------------------
SYS                 USER$                               TABLE

-- Listando as colunas da tabela USER$
SQL> desc USER$
Nome                                      Nulo?    Tipo
----------------------------------------- -------- ----------------------------
USER#                                     NOT NULL NUMBER
NAME                                      NOT NULL VARCHAR2(30)
TYPE#                                     NOT NULL NUMBER
PASSWORD                                           VARCHAR2(30)
DATATS#                                   NOT NULL NUMBER
TEMPTS#                                   NOT NULL NUMBER
CTIME                                     NOT NULL DATE
PTIME                                              DATE
EXPTIME                                            DATE
LTIME                                              DATE
RESOURCE$                                 NOT NULL NUMBER
AUDIT$                                             VARCHAR2(38)
DEFROLE                                   NOT NULL NUMBER
DEFGRP#                                            NUMBER
DEFGRP_SEQ#                                        NUMBER
ASTATUS                                   NOT NULL NUMBER
LCOUNT                                    NOT NULL NUMBER
DEFSCHCLASS                                        VARCHAR2(30)
EXT_USERNAME                                       VARCHAR2(4000)
SPARE1                                             NUMBER
SPARE2                                             NUMBER
SPARE3                                             NUMBER
SPARE4                                             VARCHAR2(1000)
SPARE5                                             VARCHAR2(1000)
SPARE6                                             DATE

De acordo com a estrutura da tabela USER$ listada acima, podemos notar também a existência de uma coluna chamada PTIME. Esta coluna tem como objetivo armazenar a data de alteração de senha de um usuário de banco de dados. Normalmente esta informação é útil quando um perfil é criado e atribuído para os usuários de banco de dados. Caso os parâmetros PASSWORD_REUSE_TIME e/ou PASSWORD_REUSE_MAX sejam setados neste perfil, então será possível consultar a tabela de dicionário de dados USER_HISTORY$ para verificar, caso necessário, o histórico de modificações de senha de um usuário.

-- Criando um usuário para teste
SQL> create user myuser identified by myuser;

Usuário criado.

SQL> select
 2    name,
 3    to_char(ctime,'dd/mm/yyyy hh24:mi:ss') ctime,
 4    to_char(ptime,'dd/mm/yyyy hh24:mi:ss') ptime
 5  from
 6    user$
 7  where name='MYUSER';

NAME            CTIME               PTIME
--------------- ------------------- -------------------
MYUSER          19/05/2008 13:50:25 19/05/2008 13:50:25


-- Aguardando um tempo ...

-- Alterando a senha do usuárioSQL> alter user myuser identified by legatti;

Usuário alterado.

SQL> select
 2    name,
 3    to_char(ctime,'dd/mm/yyyy hh24:mi:ss') ctime,
 4    to_char(ptime,'dd/mm/yyyy hh24:mi:ss') ptime
 5  from
 6    user$
 7  where name='MYUSER';

NAME            CTIME               PTIME
--------------- ------------------- -------------------
MYUSER          19/05/2008 13:50:25 19/05/2008 13:53:08



Um comentário:

Marcos disse...

excelente. mais uma vaez, excelente.

Postagens populares