关于oracle数据库的账号,我们在维护数据库的时候,偶尔可能需要获取一些特殊信息。例如,账号的创建时间、账号的状态、账号的锁定时间.....。正常情况下,我们可以通过dba_users获取大部分相关信息。但是有一些特殊信息,还必须通过不常用底层基表sys.user$来获取。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
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的定义,可以通过下面方式:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
|
--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$的定义。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
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 |
其中,我们可以获取一下关键字段信息,具体如下
1
2
3
4
5
6
7
|
name 用户( user )或角色(role)的名字 type# 0表示role,1表示 user ctime 用户的创建时间 ptime 密码最后一次修改时间 exptime 密码过期的时间 ltime 账号最后一次锁定的时间 lcount 用户登录失败次数。 |
下面我们简单测试验证一下,
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
|
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> |
其中get_user_info.sql的脚本如下
1
2
3
4
5
6
7
8
9
10
11
|
$ more get_user_info.sql alter session set nls_date_format= 'yyyy-mm-dd hh24:mi:ss' ; select name , type# , ctime , ptime , exptime , ltime , lcount from user $ where name =( '&user_name' ); |
另外,我们来测试一下账号登录失败次数,在实验前先解锁账号,用错误的账号密码尝试登录数据库,你会发现lcount就变成1了。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
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 1 sql> |
那么这个lcount字段的值是一直累加到超过阈值锁定呢?还是中间会清零呢?什么情况下会清零呢? 如果你使用正确的密码成功登录数据库后,你会发现lcount的值就清零了。如下截图所示:
1
2
3
4
5
6
7
8
9
|
$ sqlplus /nolog sql*plus: release 10.2.0.4.0 - production on thu jun 10 14:30:41 2021 copyright (c) 1982, 2007, oracle. all rights reserved. sql> connect test enter password : connected. |
也就是说,只要你在锁定之前,一旦成功登录之后,该计数会被清零。在有些版本中,由于bug,也会出现lcount没有正确反映登录失败次数的情况,例如lcount neither reset on correct login nor incremented after incorrect login thru jdbc (doc id 2675398.1)中记录了这样的bug。另外,oracle 12c 后新增了一个功能,它会记录用户的最后一次登录时间:spare6字段记录用户的最后一次登录时间
参考资料:
https://www.eygle.com/archives/2009/07/profile_failed_login_attempts.html
https://dbaora.com/sys-user-table-in-oracle-last-password-change-time-last-locked-last-expired-creation-time-failed-logon/
lcount neither reset on correct login nor incremented after incorrect login thru jdbc (doc id 2675398.1)
https://bijoos.com/oraclenotes/2013/153/
以上就是oracle如何查看当前账号的相关信息总结的详细内容,更多关于oracle查看当前账号信息的资料请关注服务器之家其它相关文章!
原文链接:https://www.cnblogs.com/kerrycode/archive/2021/06/10/14871251.html