我的编程空间,编程开发者的网络收藏夹
学习永远不晚

ORACLE如何查看当前账号的相关信息总结

短信预约 信息系统项目管理师 报名、考试、查分时间动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

ORACLE如何查看当前账号的相关信息总结

ORACLE如何查看当前账号的相关信息总结

关于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_Rclass="lazy" data-src_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_Rclass="lazy" data-src_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> 

 

clip_image001

 

其中get_user_info.sql的脚本如下

 

$ 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了。

 

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的值就清零了。如下截图所示:

 

$ 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.

 

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/

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

ORACLE如何查看当前账号的相关信息总结

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

ORACLE如何查看当前账号的相关信息总结

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

MySQL如何优雅的备份账号相关信息

前言: 最近遇到实例迁移的问题,数据迁完后还需要将数据库用户及权限迁移过去。进行逻辑备份时,我一般习惯将MySQL系统库排除掉,这样备份里面就不包含数据库用户相关信息了。这时候如果想迁移用户相关信息 可以采用以下三种方案,类似的 我们也可以
2022-05-27

微信小程序如何同步获取当前storage的相关信息

这篇文章主要为大家展示了微信小程序如何同步获取当前storage的相关信息,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带大家一起来研究并学习一下“微信小程序如何同步获取当前storage的相关信息”这篇文章吧。同步获取当前
2023-06-26

微信小程序如何异步获取当前storage的相关信息

这篇“微信小程序如何异步获取当前storage的相关信息”除了程序员外大部分人都不太理解,今天小编为了让大家更加理解“微信小程序如何异步获取当前storage的相关信息”,给大家总结了以下内容,具有一定借鉴价值,内容详细步骤清晰,细节处理妥
2023-06-26

编程热搜

目录