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:
excelente. mais uma vaez, excelente.
Postar um comentário