经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » Oracle » 查看文章
ORACLE如何查看当前账号的相关信息总结
来源:cnblogs  作者:潇湘隐者  时间:2021/6/15 9:07:32  对本文有异议

关于Oracle数据库的账号,我们在维护数据库的时候,偶尔可能需要获取一些特殊信息。例如,账号的创建时间、账号的状态、账号的锁定时间.....。正常情况下,我们可以通过DBA_USERS获取大部分相关信息。但是有一些特殊信息,还必须通过不常用底层基表sys.user$来获取。

 

  1. SQL> DESC DBA_USERS;
  1. Name                                      Null?    Type
  1. ----------------------------------------- -------- ----------------------------
  1. USERNAME                                  NOT NULL VARCHAR2(30)
  1. USER_ID                                   NOT NULL NUMBER
  1. PASSWORD                                           VARCHAR2(30)
  1. ACCOUNT_STATUS                            NOT NULL VARCHAR2(32)
  1. LOCK_DATE                                          DATE
  1. EXPIRY_DATE                                        DATE
  1. DEFAULT_TABLESPACE                        NOT NULL VARCHAR2(30)
  1. TEMPORARY_TABLESPACE                      NOT NULL VARCHAR2(30)
  1. CREATED                                   NOT NULL DATE
  1. PROFILE                                   NOT NULL VARCHAR2(30)
  1. INITIAL_RSRC_CONSUMER_GROUP                        VARCHAR2(30)
  1. EXTERNAL_NAME                                      VARCHAR2(4000)

 

其实我们经常使用的DBA_USERS是同义词,对应SYS.DBA_USERS这个视图。如果你想查看SYS.DBA_USERS的定义,可以通过下面方式:

 

  1. --ORACLE 10g
  1.  
  1. SQL>SELECT DBMS_METADATA.GET_DDL('VIEW', 'DBA_USERS', 'SYS') FROM DUAL;
  1.  
  1.  
  1.  CREATE OR REPLACE FORCE VIEW "SYS"."DBA_USERS" (
  1.   "USERNAME"
  1. , "USER_ID"
  1. , "PASSWORD"
  1. , "ACCOUNT_STATUS"
  1. , "LOCK_DATE"
  1. , "EXPIRY_DATE"
  1. , "DEFAULT_TABLESPACE"
  1. , "TEMPORARY_TABLESPACE"
  1. , "CREATED"
  1. , "PROFILE"
  1. , "INITIAL_RSRC_CONSUMER_GROUP"
  1. , "EXTERNAL_NAME") AS 
  1.   select u.name, u.user#, u.password,
  1.        m.status,
  1.        decode(u.astatus, 4, u.ltime,
  1.                          5, u.ltime,
  1.                          6, u.ltime,
  1.                          8, u.ltime,
  1.                          9, u.ltime,
  1.                          10, u.ltime, to_date(NULL)),
  1.        decode(u.astatus,
  1.               1, u.exptime,
  1.               2, u.exptime,
  1.               5, u.exptime,
  1.               6, u.exptime,
  1.               9, u.exptime,
  1.               10, u.exptime,
  1.               decode(u.ptime, '', to_date(NULL),
  1.                 decode(pr.limit#, 2147483647, to_date(NULL),
  1.                  decode(pr.limit#, 0,
  1.                    decode(dp.limit#, 2147483647, to_date(NULL), u.ptime +
  1.                      dp.limit#/86400),
  1.                    u.ptime + pr.limit#/86400)))),
  1.        dts.name, tts.name, u.ctime, p.name,
  1.        nvl(cgm.consumer_group, 'DEFAULT_CONSUMER_GROUP'),
  1.        u.ext_username
  1.        from sys.user$ u left outer join sys.resource_group_mapping$ cgm
  1.             on (cgm.attribute = 'ORACLE_USER' and cgm.status = 'ACTIVE' and
  1.                 cgm.value = u.name),
  1.             sys.ts$ dts, sys.ts$ tts, sys.profname$ p,
  1.             sys.user_astatus_map m, sys.profile$ pr, sys.profile$ dp
  1.        where u.datats# = dts.ts#
  1.        and u.resource$ = p.profile#
  1.        and u.tempts# = tts.ts#
  1.        and u.astatus = m.status#
  1.        and u.type# = 1
  1.        and u.resource$ = pr.profile#
  1.        and dp.profile# = 0
  1.        and dp.type#=1
  1.        and dp.resource#=1
  1.        and pr.type# = 1
  1.        and pr.resource# = 1

 

通过上面的视图定义,我们可以知道,大部分数据来自于底层基表sys.user$。关于表sys.user$的结构如下,我们可以从sql.bsq中可以看到sys.user$的定义。

 

 

  1. SQL> DESC sys.user$
  1. Name                                      Null?    Type
  1. ----------------------------------------- -------- ----------------------------
  1. USER#                                     NOT NULL NUMBER
  1. NAME                                      NOT NULL VARCHAR2(30)   
  1. TYPE#                                     NOT NULL NUMBER
  1. PASSWORD                                           VARCHAR2(30)
  1. DATATS#                                   NOT NULL NUMBER
  1. TEMPTS#                                   NOT NULL NUMBER
  1. CTIME                                     NOT NULL DATE
  1. PTIME                                              DATE
  1. EXPTIME                                            DATE
  1. LTIME                                              DATE
  1. RESOURCE$                                 NOT NULL NUMBER
  1. AUDIT$                                             VARCHAR2(38)
  1. DEFROLE                                   NOT NULL NUMBER
  1. DEFGRP#                                            NUMBER
  1. DEFGRP_SEQ#                                        NUMBER
  1. ASTATUS                                   NOT NULL NUMBER
  1. LCOUNT                                    NOT NULL NUMBER
  1. DEFSCHCLASS                                        VARCHAR2(30)
  1. EXT_USERNAME                                       VARCHAR2(4000)
  1. SPARE1                                             NUMBER
  1. SPARE2                                             NUMBER
  1. SPARE3                                             NUMBER
  1. SPARE4                                             VARCHAR2(1000)
  1. SPARE5                                             VARCHAR2(1000)
  1. SPARE6                                             DATE

 

其中,我们可以获取一下关键字段信息,具体如下

 

  1. NAME         用户(User)或角色(Role)的名字
  1. TYPE#        0表示Role,1表示User
  1. CTIME        用户的创建时间
  1. PTIME        密码最后一次修改时间
  1. EXPTIME      密码过期的时间
  1. LTIME        账号最后一次锁定的时间
  1. LCOUNT       用户登录失败次数。

 

下面我们简单测试验证一下,

 

  1. SQL> CREATE USER TEST IDENTIFIED BY "Test#1232134$#3" DEFAULT TABLESPACE TBS_TEST_DATA TEMPORARY TABLESPACE  TEMP;
  1.  
  1. User created.
  1. SQL> GRANT CONNECT TO TEST;
  1. SQL> @get_user_info.sql
  1.  
  1. Session altered.
  1.  
  1. Enter value for user_name: TEST
  1. old   9: WHERE NAME=('&USER_NAME')
  1. new   9: WHERE NAME=('TEST')
  1.  
  1. NAME                                TYPE# CTIME               PTIME               EXPTIME             LTIME                   LCOUNT
  1. ------------------------------ ---------- ------------------- ------------------- ------------------- ------------------- ----------
  1. TEST                                    1 2021-06-10 14:10:01 2021-06-10 14:10:01                                                  0
  1.  
  1. SQL> ALTER USER TEST IDENTIFIED BY "kER124";
  1.  
  1. User altered.
  1.  
  1. SQL> @get_user_info.sql
  1.  
  1. Session altered.
  1.  
  1. Enter value for user_name: TEST
  1. old   9: WHERE NAME=('&USER_NAME')
  1. new   9: WHERE NAME=('TEST')
  1.  
  1. NAME                                TYPE# CTIME               PTIME               EXPTIME             LTIME                   LCOUNT
  1. ------------------------------ ---------- ------------------- ------------------- ------------------- ------------------- ----------
  1. TEST                                    1 2021-06-10 14:10:01 2021-06-10 14:10:50                                                  0
  1.  
  1. SQL> ALTER USER TEST ACCOUNT LOCK;
  1.  
  1. User altered.
  1.  
  1. SQL> @get_user_info.sql
  1.  
  1. Session altered.
  1.  
  1. Enter value for user_name: TEST
  1. old   9: WHERE NAME=('&USER_NAME')
  1. new   9: WHERE NAME=('TEST')
  1.  
  1. NAME                                TYPE# CTIME               PTIME               EXPTIME             LTIME                   LCOUNT
  1. ------------------------------ ---------- ------------------- ------------------- ------------------- ------------------- ----------
  1. TEST                                    1 2021-06-10 14:10:01 2021-06-10 14:10:50                     2021-06-10 14:11:27          0
  1.  
  1. SQL>

 

clip_image001

 

其中get_user_info.sql的脚本如下

 

  1. $ more get_user_info.sql 
  1. ALTER SESSION SET NLS_DATE_FORMAT='YYYY-MM-DD HH24:MI:SS';
  1. SELECT  NAME
  1.       , TYPE#
  1.       , CTIME
  1.       , PTIME
  1.       , EXPTIME
  1.       , LTIME
  1.       , LCOUNT
  1. FROM user$
  1. WHERE NAME=('&USER_NAME');

 

另外,我们来测试一下账号登录失败次数,在实验前先解锁账号,用错误的账号密码尝试登录数据库,你会发现LCOUNT就变成1了。

 

  1. SQL> @get_user_info.sql
  1.  
  1. Session altered.
  1.  
  1. Enter value for user_name: TEST
  1. old   9: WHERE NAME=('&USER_NAME')
  1. new   9: WHERE NAME=('TEST')
  1.  
  1. NAME                                TYPE# CTIME               PTIME               EXPTIME             LTIME                   LCOUNT
  1. ------------------------------ ---------- ------------------- ------------------- ------------------- ------------------- ----------
  1. TEST                                    1 2021-06-10 14:10:01 2021-06-10 14:10:50                     2021-06-10 14:11:27          1
  1.  
  1. SQL>

 

那么这个LCOUNT字段的值是一直累加到超过阈值锁定呢?还是中间会清零呢?什么情况下会清零呢? 如果你使用正确的密码成功登录数据库后,你会发现LCOUNT的值就清零了。如下截图所示:

 

  1. $ sqlplus /nolog
  1.  
  1. SQL*Plus: Release 10.2.0.4.0 - Production on Thu Jun 10 14:30:41 2021
  1.  
  1. Copyright (c) 1982, 2007, Oracle.  All Rights Reserved.
  1.  
  1. SQL> connect TEST
  1. Enter password:
  1. Connected.

 

clip_image002

 

也就是说,只要你在锁定之前,一旦成功登录之后,该计数会被清零。在有些版本中,由于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/

原文链接:http://www.cnblogs.com/kerrycode/p/14871251.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号