本文整理自网络,侵删。
关于Oracle数据库的账号,我们在维护数据库的时候,偶尔可能需要获取一些特殊信息。例如,账号的创建时间、账号的状态、账号的锁定时间.....。正常情况下,我们可以通过DBA_USERS获取大部分相关信息。但是有一些特殊信息,还必须通过不常用底层基表sys.user$来获取。
SQL> DESC DBA_USERS; Name Null? Type ----------------------------------------- -------- ---------------------------- USERNAME NOT NULL VARCHAR2(30) USER_ID NOT NULL NUMBER PASSWORD VARCHAR2(30) ACCOUNT_STATUS NOT NULL VARCHAR2(32) LOCK_DATE DATE EXPIRY_DATE DATE DEFAULT_TABLESPACE NOT NULL VARCHAR2(30) TEMPORARY_TABLESPACE NOT NULL VARCHAR2(30) CREATED NOT NULL DATE PROFILE NOT NULL VARCHAR2(30) INITIAL_RSRC_CONSUMER_GROUP VARCHAR2(30) EXTERNAL_NAME VARCHAR2(4000)
其实我们经常使用的DBA_USERS是同义词,对应SYS.DBA_USERS这个视图。如果你想查看SYS.DBA_USERS的定义,可以通过下面方式:
--ORACLE 10g SQL>SELECT DBMS_METADATA.GET_DDL('VIEW', 'DBA_USERS', 'SYS') FROM DUAL; CREATE OR REPLACE FORCE VIEW "SYS"."DBA_USERS" ( "USERNAME" , "USER_ID" , "PASSWORD" , "ACCOUNT_STATUS" , "LOCK_DATE" , "EXPIRY_DATE" , "DEFAULT_TABLESPACE" , "TEMPORARY_TABLESPACE" , "CREATED" , "PROFILE" , "INITIAL_RSRC_CONSUMER_GROUP" , "EXTERNAL_NAME") AS select u.name, u.user#, u.password, m.status, decode(u.astatus, 4, u.ltime, 5, u.ltime, 6, u.ltime, 8, u.ltime, 9, u.ltime, 10, u.ltime, to_date(NULL)), decode(u.astatus, 1, u.exptime, 2, u.exptime, 5, u.exptime, 6, u.exptime, 9, u.exptime, 10, u.exptime, decode(u.ptime, '', to_date(NULL), decode(pr.limit#, 2147483647, to_date(NULL), decode(pr.limit#, 0, decode(dp.limit#, 2147483647, to_date(NULL), u.ptime + dp.limit#/86400), u.ptime + pr.limit#/86400)))), dts.name, tts.name, u.ctime, p.name, nvl(cgm.consumer_group, 'DEFAULT_CONSUMER_GROUP'), u.ext_username from sys.user$ u left outer join sys.resource_group_mapping$ cgm on (cgm.attribute = 'ORACLE_USER' and cgm.status = 'ACTIVE' and cgm.value = u.name), sys.ts$ dts, sys.ts$ tts, sys.profname$ p, sys.user_astatus_map m, sys.profile$ pr, sys.profile$ dp where u.datats# = dts.ts# and u.resource$ = p.profile# and u.tempts# = tts.ts# and u.astatus = m.status# and u.type# = 1 and u.resource$ = pr.profile# and dp.profile# = 0 and dp.type#=1 and dp.resource#=1 and pr.type# = 1 and pr.resource# = 1
通过上面的视图定义,我们可以知道,大部分数据来自于底层基表sys.user$。关于表sys.user$的结构如下,我们可以从sql.bsq中可以看到sys.user$的定义。
SQL> DESC sys.user$ Name Null? Type ----------------------------------------- -------- ---------------------------- 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
其中,我们可以获取一下关键字段信息,具体如下
NAME 用户(User)或角色(Role)的名字 TYPE# 0表示Role,1表示User CTIME 用户的创建时间 PTIME 密码最后一次修改时间 EXPTIME 密码过期的时间 LTIME 账号最后一次锁定的时间 LCOUNT 用户登录失败次数。
下面我们简单测试验证一下,
SQL> CREATE USER TEST IDENTIFIED BY "Test#1232134$#3" DEFAULT TABLESPACE TBS_TEST_DATA TEMPORARY TABLESPACE TEMP; User created. SQL> GRANT CONNECT TO TEST; SQL> @get_user_info.sql Session altered. Enter value for user_name: TEST old 9: WHERE NAME=('&USER_NAME') new 9: WHERE NAME=('TEST') NAME TYPE# CTIME PTIME EXPTIME LTIME LCOUNT ------------------------------ ---------- ------------------- ------------------- ------------------- ------------------- ---------- TEST 1 2021-06-10 14:10:01 2021-06-10 14:10:01 0 SQL> ALTER USER TEST IDENTIFIED BY "kER124"; User altered. SQL> @get_user_info.sql Session altered. Enter value for user_name: TEST old 9: WHERE NAME=('&USER_NAME') new 9: WHERE NAME=('TEST') NAME TYPE# CTIME PTIME EXPTIME LTIME LCOUNT ------------------------------ ---------- ------------------- ------------------- ------------------- ------------------- ---------- TEST 1 2021-06-10 14:10:01 2021-06-10 14:10:50 0 SQL> ALTER USER TEST ACCOUNT LOCK; User altered. SQL> @get_user_info.sql Session altered. Enter value for user_name: TEST old 9: WHERE NAME=('&USER_NAME') new 9: WHERE NAME=('TEST') NAME TYPE# CTIME PTIME EXPTIME LTIME LCOUNT ------------------------------ ---------- ------------------- ------------------- ------------------- ------------------- ---------- TEST 1 2021-06-10 14:10:01 2021-06-10 14:10:50 2021-06-10 14:11:27 0 SQL>
相关阅读 >>
oracle通过正则表达式分割字符串 regexp_substr的代码详解
windows10 x64安装、配置oracle 11g过程记录(图文教程)
更多相关阅读请进入《oracle》频道 >>
数据库系统概念 第6版
本书主要讲述了数据模型、基于对象的数据库和XML、数据存储和查询、事务管理、体系结构等方面的内容。