首页数据库ORACLE查看当前账号的相关信息

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

时间2024-02-28 16:12:02发布访客分类数据库浏览661
导读:收集整理的这篇文章主要介绍了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_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表示UserCTIME        用户的创建时间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: TESTold   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: TESTold   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: TESTold   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>
     

其中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      , LCOUNTFROM user$WHERE NAME=('&
    USER_NAME');
    

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

SQL>
     @get_user_info.sql Session altered. Enter value for user_name: TESTold   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 TESTEnter password: Connected.

也就是说,只要你在锁定之前,一旦成功登录之后,该计数会被清零。在有些版本中,由于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查询sql错误信息的控制和定位
  • Oracle 11g收集多列统计信息详解
  • Oracle cloud control 12c的启动、关闭及获取安装信息的方法
  • Oracle 查询表信息获取表字段及字段注释
  • oracle获取当前用户表、字段等详细信息SQL
  • Oracle 11g自动诊断信息库(Automatic Diagnostic Repository,ADR)概述

声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!


若转载请注明出处: ORACLE查看当前账号的相关信息
本文地址: https://pptw.com/jishu/631649.html
DBCA命令行搭建Oracle ADG的流程 ORACLE数据库应用开发的三十个注意事项

游客 回复需填写必要信息