• 售前

  • 售后

热门帖子
入门百科

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

[复制链接]
白刃玄衣及 显示全部楼层 发表于 2021-8-14 14:52:29 |阅读模式 打印 上一主题 下一主题
关于Oracle数据库的账号,我们在维护数据库的时候,偶然可能需要获取一些特别信息。比方,账号的创建时间、账号的状态、账号的锁定时间.....。正常情况下,我们可以通过DBA_USERS获取大部分相关信息。但是有一些特别信息,还必须通过不常用底层基表sys.user$来获取。
  1. SQL> DESC DBA_USERS;
  2. Name                                      Null?    Type
  3. ----------------------------------------- -------- ----------------------------
  4. USERNAME                                  NOT NULL VARCHAR2(30)
  5. USER_ID                                   NOT NULL NUMBER
  6. PASSWORD                                           VARCHAR2(30)
  7. ACCOUNT_STATUS                            NOT NULL VARCHAR2(32)
  8. LOCK_DATE                                          DATE
  9. EXPIRY_DATE                                        DATE
  10. DEFAULT_TABLESPACE                        NOT NULL VARCHAR2(30)
  11. TEMPORARY_TABLESPACE                      NOT NULL VARCHAR2(30)
  12. CREATED                                   NOT NULL DATE
  13. PROFILE                                   NOT NULL VARCHAR2(30)
  14. INITIAL_RSRC_CONSUMER_GROUP                        VARCHAR2(30)
  15. EXTERNAL_NAME                                      VARCHAR2(4000)
复制代码
实在我们常常利用的DBA_USERS是同义词,对应SYS.DBA_USERS这个视图。假如你想检察SYS.DBA_USERS的界说,可以通过下面方式:
  1. --ORACLE 10g
  2. SQL>SELECT DBMS_METADATA.GET_DDL('VIEW', 'DBA_USERS', 'SYS') FROM DUAL;
  3. CREATE OR REPLACE FORCE VIEW "SYS"."DBA_USERS" (
  4.   "USERNAME"
  5. , "USER_ID"
  6. , "PASSWORD"
  7. , "ACCOUNT_STATUS"
  8. , "LOCK_DATE"
  9. , "EXPIRY_DATE"
  10. , "DEFAULT_TABLESPACE"
  11. , "TEMPORARY_TABLESPACE"
  12. , "CREATED"
  13. , "PROFILE"
  14. , "INITIAL_RSRC_CONSUMER_GROUP"
  15. , "EXTERNAL_NAME") AS
  16.   select u.name, u.user#, u.password,
  17.        m.status,
  18.        decode(u.astatus, 4, u.ltime,
  19.                          5, u.ltime,
  20.                          6, u.ltime,
  21.                          8, u.ltime,
  22.                          9, u.ltime,
  23.                          10, u.ltime, to_date(NULL)),
  24.        decode(u.astatus,
  25.               1, u.exptime,
  26.               2, u.exptime,
  27.               5, u.exptime,
  28.               6, u.exptime,
  29.               9, u.exptime,
  30.               10, u.exptime,
  31.               decode(u.ptime, '', to_date(NULL),
  32.                 decode(pr.limit#, 2147483647, to_date(NULL),
  33.                  decode(pr.limit#, 0,
  34.                    decode(dp.limit#, 2147483647, to_date(NULL), u.ptime +
  35.                      dp.limit#/86400),
  36.                    u.ptime + pr.limit#/86400)))),
  37.        dts.name, tts.name, u.ctime, p.name,
  38.        nvl(cgm.consumer_group, 'DEFAULT_CONSUMER_GROUP'),
  39.        u.ext_username
  40.        from sys.user$ u left outer join sys.resource_group_mapping$ cgm
  41.             on (cgm.attribute = 'ORACLE_USER' and cgm.status = 'ACTIVE' and
  42.                 cgm.value = u.name),
  43.             sys.ts$ dts, sys.ts$ tts, sys.profname$ p,
  44.             sys.user_astatus_map m, sys.profile$ pr, sys.profile$ dp
  45.        where u.datats# = dts.ts#
  46.        and u.resource$ = p.profile#
  47.        and u.tempts# = tts.ts#
  48.        and u.astatus = m.status#
  49.        and u.type# = 1
  50.        and u.resource$ = pr.profile#
  51.        and dp.profile# = 0
  52.        and dp.type#=1
  53.        and dp.resource#=1
  54.        and pr.type# = 1
  55.        and pr.resource# = 1
复制代码
通过上面的视图界说,我们可以知道,大部分数据来自于底层基表sys.user$。关于表sys.user$的结构如下,我们可以从sql.bsq中可以看到sys.user$的界说。
  1. SQL> DESC sys.user$
  2. Name                                      Null?    Type
  3. ----------------------------------------- -------- ----------------------------
  4. USER#                                     NOT NULL NUMBER
  5. NAME                                      NOT NULL VARCHAR2(30)   
  6. TYPE#                                     NOT NULL NUMBER
  7. PASSWORD                                           VARCHAR2(30)
  8. DATATS#                                   NOT NULL NUMBER
  9. TEMPTS#                                   NOT NULL NUMBER
  10. CTIME                                     NOT NULL DATE
  11. PTIME                                              DATE
  12. EXPTIME                                            DATE
  13. LTIME                                              DATE
  14. RESOURCE$                                 NOT NULL NUMBER
  15. AUDIT$                                             VARCHAR2(38)
  16. DEFROLE                                   NOT NULL NUMBER
  17. DEFGRP#                                            NUMBER
  18. DEFGRP_SEQ#                                        NUMBER
  19. ASTATUS                                   NOT NULL NUMBER
  20. LCOUNT                                    NOT NULL NUMBER
  21. DEFSCHCLASS                                        VARCHAR2(30)
  22. EXT_USERNAME                                       VARCHAR2(4000)
  23. SPARE1                                             NUMBER
  24. SPARE2                                             NUMBER
  25. SPARE3                                             NUMBER
  26. SPARE4                                             VARCHAR2(1000)
  27. SPARE5                                             VARCHAR2(1000)
  28. SPARE6                                             DATE
复制代码
此中,我们可以获取一下关键字段信息,具体如下
  1. NAME         用户(User)或角色(Role)的名字
  2. TYPE#        0表示Role,1表示User
  3. CTIME        用户的创建时间
  4. PTIME        密码最后一次修改时间
  5. EXPTIME      密码过期的时间
  6. LTIME        账号最后一次锁定的时间
  7. LCOUNT       用户登录失败次数。
复制代码
下面我们简朴测试验证一下,
  1. SQL> CREATE USER TEST IDENTIFIED BY "Test#1232134$#3" DEFAULT TABLESPACE TBS_TEST_DATA TEMPORARY TABLESPACE  TEMP;
  2. User created.
  3. SQL> GRANT CONNECT TO TEST;
  4. SQL> @get_user_info.sql
  5. Session altered.
  6. Enter value for user_name: TEST
  7. old   9: WHERE NAME=('&USER_NAME')
  8. new   9: WHERE NAME=('TEST')
  9. NAME                                TYPE# CTIME               PTIME               EXPTIME             LTIME                   LCOUNT
  10. ------------------------------ ---------- ------------------- ------------------- ------------------- ------------------- ----------
  11. TEST                                    1 2021-06-10 14:10:01 2021-06-10 14:10:01                                                  0
  12. SQL> ALTER USER TEST IDENTIFIED BY "kER124";
  13. User altered.
  14. SQL> @get_user_info.sql
  15. Session altered.
  16. Enter value for user_name: TEST
  17. old   9: WHERE NAME=('&USER_NAME')
  18. new   9: WHERE NAME=('TEST')
  19. NAME                                TYPE# CTIME               PTIME               EXPTIME             LTIME                   LCOUNT
  20. ------------------------------ ---------- ------------------- ------------------- ------------------- ------------------- ----------
  21. TEST                                    1 2021-06-10 14:10:01 2021-06-10 14:10:50                                                  0
  22. SQL> ALTER USER TEST ACCOUNT LOCK;
  23. User altered.
  24. SQL> @get_user_info.sql
  25. Session altered.
  26. Enter value for user_name: TEST
  27. old   9: WHERE NAME=('&USER_NAME')
  28. new   9: WHERE NAME=('TEST')
  29. NAME                                TYPE# CTIME               PTIME               EXPTIME             LTIME                   LCOUNT
  30. ------------------------------ ---------- ------------------- ------------------- ------------------- ------------------- ----------
  31. TEST                                    1 2021-06-10 14:10:01 2021-06-10 14:10:50                     2021-06-10 14:11:27          0
  32. SQL>
复制代码

此中get_user_info.sql的脚本如下
  1. $ more get_user_info.sql
  2. ALTER SESSION SET NLS_DATE_FORMAT='YYYY-MM-DD HH24:MI:SS';
  3. SELECT  NAME
  4.       , TYPE#
  5.       , CTIME
  6.       , PTIME
  7.       , EXPTIME
  8.       , LTIME
  9.       , LCOUNT
  10. FROM user$
  11. WHERE NAME=('&USER_NAME');
复制代码
别的,我们来测试一下账号登录失败次数,在实验前先解锁账号,用错误的账号暗码实验登录数据库,你会发现LCOUNT就酿成1了。
  1. SQL> @get_user_info.sql
  2. Session altered.
  3. Enter value for user_name: TEST
  4. old   9: WHERE NAME=('&USER_NAME')
  5. new   9: WHERE NAME=('TEST')
  6. NAME                                TYPE# CTIME               PTIME               EXPTIME             LTIME                   LCOUNT
  7. ------------------------------ ---------- ------------------- ------------------- ------------------- ------------------- ----------
  8. TEST                                    1 2021-06-10 14:10:01 2021-06-10 14:10:50                     2021-06-10 14:11:27          1
  9. SQL>
复制代码
那么这个LCOUNT字段的值是一直累加到凌驾阈值锁定呢?还是中间会清零呢?什么情况下会清零呢? 假如你利用正确的暗码成功登录数据库后,你会发现LCOUNT的值就清零了。如下截图所示:
  1. $ sqlplus /nolog
  2. SQL*Plus: Release 10.2.0.4.0 - Production on Thu Jun 10 14:30:41 2021
  3. Copyright (c) 1982, 2007, Oracle.  All Rights Reserved.
  4. SQL> connect TEST
  5. Enter password:
  6. 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检察当前账号信息的资料请关注草根技术分享其它相关文章!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作