ORACLE查看当前账号的相关信息


Posted in Oracle onJune 18, 2021

关于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查看当前账号的相关信息

其中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.

ORACLE查看当前账号的相关信息

也就是说,只要你在锁定之前,一旦成功登录之后,该计数会被清零。在有些版本中,由于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查看当前账号信息的资料请关注三水点靠木其它相关文章!

Oracle 相关文章推荐
使用Oracle跟踪文件的问题详解
Jun 28 Oracle
RPM包方式安装Oracle21c的方法详解
Aug 23 Oracle
C#连接ORACLE出现乱码问题的解决方法
Oct 05 Oracle
详解Oracle块修改跟踪功能
Nov 07 Oracle
Oracle中update和select 关联操作
Jan 18 Oracle
Lakehouse数据湖并发控制陷阱分析
Mar 31 Oracle
Oracle 多表查询基本语法实例
Apr 18 Oracle
Oracle锁表解决方法的详细记录
Jun 05 Oracle
在Oracle表中进行关键词搜索的过程
Jun 10 Oracle
Oracle中日期的使用方法实例
Jul 07 Oracle
DBCA命令行搭建Oracle ADG的流程
ORACLE数据库应用开发的三十个注意事项
Jun 07 #Oracle
Oracle创建只读账号的详细步骤
Oracle11g R2 安装教程完整版
Oracle11g r2 卸载干净重装的详细教程(亲测有效已重装过)
使用Navicat Premium工具将oracle数据库迁移到MySQL
Oracle更换为MySQL遇到的问题及解决
May 21 #Oracle
You might like
新浪新闻小偷
2006/10/09 PHP
打造超酷的PHP数据饼图效果实现代码
2011/11/23 PHP
PHP大转盘中奖概率算法实例
2014/10/21 PHP
PHP命令空间namespace及use的用法小结
2017/11/27 PHP
PHP使用SOAP调用API操作示例
2018/12/25 PHP
javascript 获取url参数和script标签中获取url参数函数代码
2010/01/22 Javascript
js parseInt("08")未指定进位制问题
2010/06/19 Javascript
在js(jquery)中获得文本框焦点和失去焦点的方法
2012/12/04 Javascript
JQuery EasyUI 日期控件如何控制日期选择区间
2014/05/05 Javascript
基于jQuery实现二级下拉菜单效果
2016/02/01 Javascript
javascript实现滚动效果的数字时钟实例
2016/07/21 Javascript
JS数组排序方法实例分析
2016/12/16 Javascript
es6的数字处理的方法(5个)
2017/03/16 Javascript
打造通用的匀速运动框架(实例讲解)
2017/10/17 Javascript
AngularJS中scope的绑定策略实例分析
2017/10/30 Javascript
vue 子组件向父组件传值方法
2018/02/26 Javascript
postman自定义函数实现 时间函数的思路详解
2019/04/17 Javascript
如何在Vue.JS中使用图标组件
2020/08/04 Javascript
[44:26]DOTA2上海特级锦标赛主赛事日 - 2 胜者组第一轮#4EG VS Fnatic第二局
2016/03/03 DOTA
python操作MySQL数据库具体方法
2013/10/28 Python
tensorflow学习笔记之mnist的卷积神经网络实例
2018/04/15 Python
numpy.ndarray 交换多维数组(矩阵)的行/列方法
2018/08/02 Python
python  创建一个保留重复值的列表的补码
2018/10/15 Python
python路径的写法及目录的获取方式
2019/12/26 Python
Python @property及getter setter原理详解
2020/03/31 Python
澳大利亚最大的在线美发和美容零售商之一:My Hair Care & Beauty
2019/08/24 全球购物
英国豪华装饰照明品牌的在线零售商:Inspyer Lighting
2019/12/10 全球购物
如何删除一个表里面的重复行
2013/07/13 面试题
食堂员工工作职责
2013/12/18 职场文书
《在家里》教后反思
2014/03/01 职场文书
委托书的写法
2014/08/30 职场文书
2015年师德师风承诺书
2015/01/22 职场文书
党支部考察意见范文
2015/06/02 职场文书
女性健康讲座主持词
2015/07/04 职场文书
2016年国庆节宣传标语
2015/11/25 职场文书
Redis Cluster 字段模糊匹配及删除
2021/05/27 Redis