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表分区的概念及操作
Apr 24 Oracle
mybatis使用oracle进行添加数据的方法
Apr 27 Oracle
SQL模糊查询报:ORA-00909:参数个数无效问题的解决
Jun 21 Oracle
Oracle安装TNS_ADMIN环境变量设置参考
Nov 01 Oracle
Oracle 多表查询基本语法实例
Apr 18 Oracle
排查并解决Oracle sysaux表空间异常增长
Apr 20 Oracle
详解SQL的窗口函数
Apr 21 Oracle
分析SQL窗口函数之聚合窗口函数
Apr 21 Oracle
Oracle用户管理及赋权
Apr 24 Oracle
Oracle锁表解决方法的详细记录
Jun 05 Oracle
在Oracle表中进行关键词搜索的过程
Jun 10 Oracle
ORACLE中dbms_output.put_line输出问题的解决过程
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
成为好程序员必须避免的5个坏习惯
2014/07/04 PHP
Laravel 4 初级教程之Pages、表单验证
2014/10/30 PHP
PHP的Laravel框架中使用消息队列queue及异步队列的方法
2016/03/21 PHP
基于PHP微信红包的算法探讨
2016/07/21 PHP
php 反斜杠处理函数addslashes()和stripslashes()实例详解
2016/12/25 PHP
php编程实现简单的网页版计算器功能示例
2017/04/26 PHP
兼容FireFox 的 js 日历 支持时间的获取
2009/03/04 Javascript
JS 面向对象的5钟写法
2009/07/31 Javascript
javascript中的107个基础知识收集整理 推荐
2010/03/29 Javascript
javascript权威指南 学习笔记之null和undefined
2011/09/25 Javascript
javascript suggest效果 自动完成实现代码分享
2012/02/17 Javascript
javascript解决innerText浏览器兼容问题思路代码
2013/05/17 Javascript
JavaScript 基本概念
2015/01/20 Javascript
jQuery简单tab切换效果实现方法
2015/04/08 Javascript
Javascript之Number对象介绍
2016/06/07 Javascript
Angular ng-repeat 对象和数组遍历实例
2016/09/14 Javascript
JS实现标签页切换效果
2017/05/04 Javascript
angularjs下拉框空白的解决办法
2017/06/20 Javascript
nodejs爬虫初试superagent和cheerio
2018/03/05 NodeJs
页面内锚点定位及跳转方法总结(推荐)
2019/04/24 Javascript
微信小程序文章详情功能完整实例
2020/06/03 Javascript
基于VUE实现简单的学生信息管理系统
2021/01/13 Vue.js
测试、预发布后用python检测网页是否有日常链接
2014/06/03 Python
python pandas修改列属性的方法详解
2018/06/09 Python
pandas 转换成行列表进行读取与Nan处理的方法
2018/10/30 Python
python 爬取B站原视频的实例代码
2020/09/09 Python
HTML5本地数据库基础操作详解
2016/04/26 HTML / CSS
老师自我鉴定范文
2013/12/25 职场文书
法律六进活动方案
2014/03/13 职场文书
五四青年节优秀演讲稿范文
2014/05/28 职场文书
领导干部贪图享乐整改措施
2014/09/21 职场文书
2015年客房服务员工作总结
2015/05/15 职场文书
安全知识竞赛主持词
2015/06/30 职场文书
《搭石》教学反思
2016/02/18 职场文书
浅谈Redis在直播场景的实践方案
2021/04/27 Redis
Elasticsearch 索引操作和增删改查
2022/04/19 Python