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覆盖导入dmp文件的2种方法
May 21 Oracle
Oracle更换为MySQL遇到的问题及解决
May 21 Oracle
使用Navicat Premium工具将oracle数据库迁移到MySQL
May 27 Oracle
oracle连接ODBC sqlserver数据源的详细步骤
Jul 25 Oracle
详解Oracle块修改跟踪功能
Nov 07 Oracle
详解Oracle数据库中自带的所有表结构(sql代码)
Nov 20 Oracle
oracle删除超过N天数据脚本的方法
Feb 28 Oracle
排查并解决Oracle sysaux表空间异常增长
Apr 20 Oracle
分析SQL窗口函数之排名窗口函数
Apr 21 Oracle
清空 Oracle 安装记录并重新安装
Apr 26 Oracle
Oracle数据库事务的开启与结束详解
Jun 25 Oracle
oracle delete误删除表数据后如何恢复
Jun 28 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
无法在发生错误时创建会话,请检查 PHP 或网站服务器日志,并正确配置 PHP 安装最快的解决办法
2010/08/01 PHP
PHP图片验证码制作实现分享(全)
2012/05/10 PHP
php比较两个绝对时间的大小
2014/01/31 PHP
PHP自带ZIP压缩、解压缩类ZipArchiv使用指南
2015/03/03 PHP
PHP遍历目录文件的常用方法小结
2017/02/03 PHP
php表单习惯用的正则表达式
2017/10/11 PHP
在Z-Blog中运行代码[html][/html](纯JS版)
2007/03/25 Javascript
基于jquery的网页SELECT下拉框美化代码
2010/10/28 Javascript
javascript对JSON数据排序的3个例子
2014/04/12 Javascript
JavaScript中使用arguments获得函数传参个数实例
2014/08/27 Javascript
JS+CSS实现感应鼠标渐变显示DIV层的方法
2015/02/20 Javascript
jQuery实现Tab菜单滚动切换的方法
2015/09/21 Javascript
AngularJs Dependency Injection(DI,依赖注入)
2016/09/02 Javascript
深入理解JS中的Function.prototype.bind()方法
2016/10/11 Javascript
vue.js中指令Directives详解
2017/03/20 Javascript
详解vue2.0 资源文件assets和static的区别
2018/11/27 Javascript
详解webpack-dev-middleware 源码解读
2020/03/23 Javascript
Vue 的 v-model用法实例
2020/11/23 Vue.js
Python入门篇之字典
2014/10/17 Python
python删除列表中重复记录的方法
2015/04/28 Python
python判断给定的字符串是否是有效日期的方法
2015/05/13 Python
利用Python的Django框架生成PDF文件的教程
2015/07/22 Python
Pycharm设置去除显示的波浪线方法
2018/10/28 Python
Python+OpenCV+图片旋转并用原底色填充新四角的例子
2019/12/12 Python
解决pycharm编辑区显示yaml文件层级结构遇中文乱码问题
2020/04/27 Python
无需压缩软件,用python帮你操作压缩包
2020/08/17 Python
HTML5中indexedDB 数据库的使用实例
2017/05/11 HTML / CSS
小学生打架检讨书
2014/01/26 职场文书
干部现实表现材料
2014/02/13 职场文书
安全生产月活动总结
2014/05/04 职场文书
骨干教师申报材料
2014/12/17 职场文书
推普标语口号大全
2015/12/26 职场文书
幼儿园班级管理心得体会
2016/01/07 职场文书
MySQL下使用Inplace和Online方式创建索引的教程
2021/05/26 MySQL
Python中递归以及递归遍历目录详解
2021/10/24 Python
Django数据库(SQlite)基本入门使用教程
2022/07/07 Python