sys用户在sys.user$中的一些特殊现象浅析

[复制链接]
发表于 2023-11-4 22:27:00 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×
  1. CREATE FORCE VIEW "SYS"."DBA_USERS" ("USERNAME", "USER_ID", "PASSWORD", "ACCOUNT_STATUS", "LOCK_DATE", "EXPIRY_DATE", "DEFAULT_TABLESPACE", "TEMPORARY_TABLESPACE", "LOCAL_TEMP_TABLESPACE", "CREATED", "PROFILE", "INITIAL_RSRC_CONSUMER_GROUP", "EXTERNAL_NAME", "PASSWORD_VERSIONS", "EDITIONS_ENABLED", "AUTHENTICATION_TYPE", "PROXY_ONLY_CONNECT", "COMMON", "LAST_LOGIN", "ORACLE_MAINTAINED", "INHERITED", "DEFAULT_COLLATION", "IMPLICIT", "ALL_SHARD", "PASSWORD_CHANGE_DATE") AS
  2.   select u.name, u.user#,
  3.      decode(u.password, 'GLOBAL', u.password,
  4.                         'EXTERNAL', u.password,
  5.                         NULL),
  6.      m.status,
  7.      decode(mod(u.astatus, 16), 4, u.ltime,
  8.                                 5, u.ltime,
  9.                                 6, u.ltime,
  10.                                 8, u.ltime,
  11.                                 9, u.ltime,
  12.                                 10, u.ltime, to_date(NULL)),
  13.      decode(mod(u.astatus, 16),
  14.             1, u.exptime,
  15.             2, u.exptime,
  16.             5, u.exptime,
  17.             6, u.exptime,
  18.             9, u.exptime,
  19.             10, u.exptime,
  20.             decode(u.password, 'GLOBAL', to_date(NULL),
  21.                                'EXTERNAL', to_date(NULL),
  22.               decode(u.ptime, '', to_date(NULL),
  23.                 decode(pr.limit#, 2147483647, to_date(NULL),
  24.                  decode(pr.limit#, 0,
  25.                    decode(dp.limit#, 2147483647, to_date(NULL), u.ptime +
  26.                      dp.limit#/86400),
  27.                    u.ptime + pr.limit#/86400))))),
  28.      dts.name, tts.name, ltts.name,
  29.      u.ctime, p.name,
  30.      nvl(cgm.consumer_group, 'DEFAULT_CONSUMER_GROUP'),
  31.      u.ext_username,
  32.      decode(bitand(u.spare1, 65536), 65536, NULL, decode(
  33.        REGEXP_INSTR(
  34.          NVL2(u.password, u.password, ' '),
  35.          '^                $'
  36.        ),
  37.        0,
  38.        decode(length(u.password), 16, '10G ', NULL),
  39.        ''
  40.      ) ||
  41.      decode(
  42.        REGEXP_INSTR(
  43.          REGEXP_REPLACE(
  44.            NVL2(u.spare4, u.spare4, ' '),
  45.            'S:000000000000000000000000000000000000000000000000000000000000',
  46.            'not_a_verifier'
  47.          ),
  48.          'S:'
  49.        ),
  50.        0, '', '11G '
  51.      ) ||
  52.      decode(
  53.        REGEXP_INSTR(
  54.          NVL2(u.spare4, u.spare4, ' '),
  55.          'T:'
  56.        ),
  57.        0, '', '12C '
  58.      ) ||
  59.      decode(
  60.        REGEXP_INSTR(
  61.          REGEXP_REPLACE(
  62.            NVL2(u.spare4, u.spare4, ' '),
  63.            'H:00000000000000000000000000000000',
  64.            'not_a_verifier'
  65.          ),
  66.          'H:'
  67.        ),
  68.        0, '', 'HTTP '
  69.      )),
  70.      decode(bitand(u.spare1, 16),
  71.             16, 'Y',
  72.                 'N'),
  73.      decode(bitand(u.spare1,65536), 65536, 'NONE',
  74.                    decode(u.password, 'GLOBAL',   'GLOBAL',
  75.                                       'EXTERNAL', 'EXTERNAL',
  76.                                       'PASSWORD')),
  77.      decode(bitand(u.spare1, 10272),
  78.             32, 'Y', 2048, 'Y',  2080, 'Y',
  79.           8192, 'Y', 8224, 'Y', 10240, 'Y',
  80.          10272, 'Y',
  81.                 'N'),
  82.      decode(bitand(u.spare1, 128), 0, 'NO', 'YES'),
  83.     from_tz(to_timestamp(to_char(u.spare6, 'DD-MON-YYYY HH24:MI:SS'),
  84.                           'DD-MON-YYYY HH24:MI:SS'), '0:00')
  85.      at time zone sessiontimezone,
  86.      decode(bitand(u.spare1, 256), 256, 'Y', 'N'),
  87.      decode(bitand(u.spare1, 4224),
  88.             128, decode(SYS_CONTEXT('USERENV', 'CON_ID'), 1, 'NO', 'YES'),
  89.             4224, decode(SYS_CONTEXT('USERENV', 'IS_APPLICATION_PDB'),
  90.                          'YES', 'YES', 'NO'),
  91.             'NO'),
  92.      nls_collation_name(nvl(u.spare3, 16382)),
  93.      -- IMPLICIT
  94.      decode(bitand(u.spare1, 32768), 32768, 'YES', 'NO'),
  95.      -- ALL_SHARD
  96.      decode(bitand(u.spare1, 16384), 16384, 'YES', 'NO'),
  97.      -- PASSWORD_CHANGE_DATE
  98.      u.ptime
  99.      from sys.user$ u
  100.           left outer join sys.resource_group_mapping$ cgm
  101.           on (cgm.attribute = 'ORACLE_USER' and cgm.status = 'ACTIVE' and
  102.               cgm.value = u.name) left outer join sys.ts$ ltts
  103.                                        on (u.spare9 = ltts.ts#),
  104.           sys.ts$ dts, sys.ts$ tts, sys.profname$ p,
  105.           sys.user_astatus_map m, sys.profile$ pr, sys.profile$ dp
  106.     where u.datats# = dts.ts#
  107.      and u.resource$ = p.profile#
  108.      and u.tempts# = tts.ts#
  109.      and ((u.astatus = m.status#) or
  110.           (u.astatus = (m.status# + 16 - BITAND(m.status#, 16))))
  111.      and u.type# = 1
  112.      and u.resource$ = pr.profile#
  113.      and dp.profile# = 0
  114.      and dp.type#=1
  115.      and dp.resource#=1
  116.      and pr.type# = 1
  117.      and pr.resource# = 1;
复制代码
但是在sys.user$中,sys用户非常特殊,下面简单介绍一下一些特殊现象(问题),希望你在遇到时有所帮助,下面测试的版本为Oracle 19.16.0.0.0等好几个版本测试环境
现象1:sys用户的expiry_date不准确。

一般我们给用户sys/system等用户设置一个自定义profile,密码60天过期,但是临近密码快过期,你监控监控或检查密码快过期时,你会发现sys用户密码过期时间不正确(system用户正确)。
  1. SQL> alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';
  2. Session altered.
  3. SQL> set pagesize 60 linesize 200
  4. SQL> col username for a25
  5. SQL> col account_status for a25
  6. SQL> col profile for a30
  7. SQL> select username,account_status,profile,expiry_date,password_versions from dba_users
  8.   2  where username IN ('SYS','SYSTEM')
  9.   3  order by 2,4,1
  10.   4  /
  11. USERNAME   ACCOUNT_STATUS   PROFILE           EXPIRY_DATE         PASSWORD_VERSIONS
  12. ---------- ---------------- ----------------- ------------------- ---------------------------------------------------
  13. SYS        OPEN             C##DBA_PROFILE    2021-09-21 12:23:59 10G 11G 12C HTTP
  14. SYSTEM     OPEN             C##DBA_PROFILE    2024-07-08 16:34:03 10G 11G 12C HTTP
  15. SQL>
复制代码
如上所示,sys用户的EXPIRE_DATE似乎跟其它账号不一样,它一成不变,它的值不准确(原因稍后述说)。
现象2:sys用户的用户密码修改后,ptime(用户密码修改时间)不会变化。
  1. SQL> alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';
  2. SQL> select name,ctime,ptime,exptime from sys.user$ where name='SYS';
  3. NAME               CTIME               PTIME               EXPTIME
  4. ------------------ ------------------- ------------------- -------------------
  5. SYS                2019-04-17 00:56:32 2019-04-17 00:56:32 2021-09-21 12:23:59
  6. SQL> alter user sys identified by "KjdhuHd31837KJD";
  7. SQL> select name,ctime,ptime,exptime from sys.user$ where name='SYS';
  8. NAME               CTIME               PTIME               EXPTIME
  9. ------------------ ------------------- ------------------- -------------------
  10. SYS                2019-04-17 00:56:32 2019-04-17 00:56:32 2021-09-21 12:23:59
  11. SQL> 
复制代码
其实有些版本(例如Oracle 12.2.0.1)是因为Bug问题(Bug 28538439 ),例如Bug 28538439 - USER$.PTIME Is Not Updated for SYS User After Applying 12.2.0.1.180717 RU (Doc ID 28538439.8)
而有些则是因为隐藏参数设置问题。如下所示
  1. SQL> set linesize 680;
  2. SQL> col inst_id for 99999
  3. SQL> col con_id for 99999
  4. SQL> col name for a20;
  5. SQL> col description for a18;
  6. SQL> col value for a8;
  7. SQL> select x.inst_id
  8.   2       , y.con_id
  9.   3       , x.ksppinm  name
  10.   4       , x.ksppdesc description
  11.   5       , y.ksppstvl  value
  12.   6       , y.ksppstdf  isdefault
  13.   7       , decode(bitand(y.ksppstvf,7),1,'MODIFIED',4,'SYSTEM_MOD','FALSE')  ismod
  14.   8       , decode(bitand(y.ksppstvf,2),2,'TRUE','FALSE')  isadj 
  15.   9  from sys.x$ksppi x, sys.x$ksppcv y 
  16.  10  where 1=1 and x.inst_id = y.inst_id and x.indx = y.indx and x.ksppinm like '%_enable_ptime%';
  17. INST_ID CON_ID NAME                 DESCRIPTION        VALUE    ISDEFAULT ISMOD      ISADJ
  18. ------- ------ -------------------- ------------------ -------- --------- ---------- -----
  19.       1      1 _enable_ptime_update Enable/Disable upd FALSE    TRUE      FALSE      FALSE
  20.                _for_sys             ate of user$ for s
  21.                                     ys
  22. SQL> 
复制代码
我们修改隐藏参数_enable_ptime_update_for_sys的值,然后重启数据库数据库。
  1. alter system set "_enable_ptime_update_for_sys"=true scope=spfile;
  2. SQL> alter system set "_enable_ptime_update_for_sys"=true scope=spfile;
复制代码
注意:有些数据库版本由于补丁缘故,可能不存在隐藏参数_enable_ptime_update_for_sys。
数据库实例重启过后,我们重新测试,你会发现修改sys密码后,密码修改时间(PTIME)会正确更新,如下所示:
  1. SQL> alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';
  2. SQL> select name,ctime,ptime,exptime from sys.user$ where name='SYS';
  3. NAME                 CTIME               PTIME               EXPTIME
  4. -------------------- ------------------- ------------------- -------------------
  5. SYS                  2019-04-17 00:56:32 2019-04-17 00:56:32 2024-04-13 21:51:05
  6. SQL> alter user sys identified by "KjdhuHd31837KJD1";
  7. SQL> select name,ctime,ptime,exptime from sys.user$ where name='SYS';
  8. NAME                 CTIME               PTIME               EXPTIME
  9. -------------------- ------------------- ------------------- -------------------
  10. SYS                  2019-04-17 00:56:32 2023-10-16 22:34:32 2024-04-13 22:34:32
  11. SQL> 
复制代码
扫描上面二维码关注我如果你真心觉得文章写得不错,而且对你有所帮助,那就不妨帮忙“推荐"一下,您的“推荐”和”打赏“将是我最大的写作动力!本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接.
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表