sys用戶在sys.user$中的一些特殊現象淺析

来源:https://www.cnblogs.com/kerrycode/archive/2023/10/17/17768828.html
-Advertisement-
Play Games

在Oracle資料庫中,一般我們使用sys.user或dba_users去監控/檢查用戶密碼是否快過期,另外,它還能監控新用戶的創建時間、賬號密碼過期、賬號修改時間等,dba_user其實是一個系統視圖,它的數據來源於sys.user$等基礎表。dba_user的定義如下所示: CREATE FOR ...


在Oracle資料庫中,一般我們使用sys.user或dba_users去監控/檢查用戶密碼是否快過期,另外,它還能監控新用戶的創建時間、賬號密碼過期、賬號修改時間等,dba_user其實是一個系統視圖,它的數據來源於sys.user$等基礎表。dba_user的定義如下所示:

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
  select u.name, u.user#,
     decode(u.password, 'GLOBAL', u.password,
                        'EXTERNAL', u.password,
                        NULL),
     m.status,
     decode(mod(u.astatus, 16), 4, u.ltime,
                                5, u.ltime,
                                6, u.ltime,
                                8, u.ltime,
                                9, u.ltime,
                                10, u.ltime, to_date(NULL)),
     decode(mod(u.astatus, 16),
            1, u.exptime,
            2, u.exptime,
            5, u.exptime,
            6, u.exptime,
            9, u.exptime,
            10, u.exptime,
            decode(u.password, 'GLOBAL'to_date(NULL),
                               'EXTERNAL'to_date(NULL),
              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, ltts.name,
     u.ctime, p.name,
     nvl(cgm.consumer_group, 'DEFAULT_CONSUMER_GROUP'),
     u.ext_username,
     decode(bitand(u.spare1, 65536), 65536NULLdecode(
       REGEXP_INSTR(
         NVL2(u.password, u.password, ' '),
         '^                $'
       ),
       0,
       decode(length(u.password), 16'10G 'NULL),
       ''
     ) ||
     decode(
       REGEXP_INSTR(
         REGEXP_REPLACE(
           NVL2(u.spare4, u.spare4, ' '),
           'S:000000000000000000000000000000000000000000000000000000000000',
           'not_a_verifier'
         ),
         'S:'
       ),
       0'''11G '
     ) ||
     decode(
       REGEXP_INSTR(
         NVL2(u.spare4, u.spare4, ' '),
         'T:'
       ),
       0'''12C '
     ) ||
     decode(
       REGEXP_INSTR(
         REGEXP_REPLACE(
           NVL2(u.spare4, u.spare4, ' '),
           'H:00000000000000000000000000000000',
           'not_a_verifier'
         ),
         'H:'
       ),
       0'''HTTP '
     )),
     decode(bitand(u.spare1, 16),
            16'Y',
                'N'),
     decode(bitand(u.spare1,65536), 65536'NONE',
                   decode(u.password, 'GLOBAL',   'GLOBAL',
                                      'EXTERNAL''EXTERNAL',
                                      'PASSWORD')),
     decode(bitand(u.spare1, 10272),
            32'Y'2048'Y',  2080'Y',
          8192'Y'8224'Y'10240'Y',
         10272'Y',
                'N'),
     decode(bitand(u.spare1, 128), 0'NO''YES'),
    from_tz(to_timestamp(to_char(u.spare6, 'DD-MON-YYYY HH24:MI:SS'),
                          'DD-MON-YYYY HH24:MI:SS'), '0:00')
     at time zone sessiontimezone,
     decode(bitand(u.spare1, 256), 256'Y''N'),
     decode(bitand(u.spare1, 4224),
            128decode(SYS_CONTEXT('USERENV''CON_ID'), 1'NO''YES'),
            4224decode(SYS_CONTEXT('USERENV''IS_APPLICATION_PDB'),
                         'YES''YES''NO'),
            'NO'),
     nls_collation_name(nvl(u.spare3, 16382)),
     -- IMPLICIT
     decode(bitand(u.spare1, 32768), 32768'YES''NO'),
     -- ALL_SHARD
     decode(bitand(u.spare1, 16384), 16384'YES''NO'),
     -- PASSWORD_CHANGE_DATE
     u.ptime
     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) left outer join sys.ts$ ltts
                                       on (u.spare9 = ltts.ts#),
          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#) or
          (u.astatus = (m.status# + 16 - BITAND(m.status#, 16))))
     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用戶非常特殊,下麵簡單介紹一下一些特殊現象(問題),希望你在遇到時有所幫助,下麵測試的版本為Oracle 19.16.0.0.0等好幾個版本測試環境

現象1:sys用戶的expiry_date不准確。

一般我們給用戶sys/system等用戶設置一個自定義profile,密碼60天過期,但是臨近密碼快過期,你監控或檢查密碼快過期時,你會發現sys用戶密碼過期時間不正確(system用戶正確)。

SQL> alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';

Session altered.

SQL> set pagesize 60 linesize 200
SQLcol username for a25
SQLcol account_status for a25
SQLcol profile for a30
SQLselect username,account_status,profile,expiry_date,password_versions from dba_users
  2  where username IN ('SYS','SYSTEM')
  3  order by 2,4,1
  4  /

USERNAME   ACCOUNT_STATUS   PROFILE           EXPIRY_DATE         PASSWORD_VERSIONS
---------- ---------------- ----------------- ------------------- ---------------------------------------------------
SYS        OPEN             C##DBA_PROFILE    2021-09-21 12:23:59 10G 11G 12C HTTP
SYSTEM     OPEN             C##DBA_PROFILE    2024-07-08 16:34:03 10G 11G 12C HTTP

SQL>

如上所示,sys用戶的EXPIRE_DATE似乎跟其它賬號不一樣,它一成不變,它的值不准確(原因稍後述說)。

現象2:sys用戶的用戶密碼修改後,ptime(用戶密碼修改時間)不會變化。

SQL> alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';
SQL> select name,ctime,ptime,exptime from sys.user$ where name='SYS';

NAME               CTIME               PTIME               EXPTIME
------------------ ------------------- ------------------- -------------------
SYS                2019-04-17 00:56:32 2019-04-17 00:56:32 2021-09-21 12:23:59
SQL> alter user sys identified by "KjdhuHd31837KJD";
SQL> select name,ctime,ptime,exptime from sys.user$ where name='SYS';

NAME               CTIME               PTIME               EXPTIME
------------------ ------------------- ------------------- -------------------
SYS                2019-04-17 00:56:32 2019-04-17 00:56:32 2021-09-21 12:23:59
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)

而有些則是因為隱藏參數設置問題。如下所示

SQL> set linesize 680;
SQL> col inst_id for 99999
SQL> col con_id for 99999
SQL> col name for a20;
SQL> col description for a18;
SQL> col value for a8;
SQL> select x.inst_id
  2       , y.con_id
  3       , x.ksppinm  name
  4       , x.ksppdesc description
  5       , y.ksppstvl  value
  6       , y.ksppstdf  isdefault
  7       , decode(bitand(y.ksppstvf,7),1,'MODIFIED',4,'SYSTEM_MOD','FALSE')  ismod
  8       , decode(bitand(y.ksppstvf,2),2,'TRUE','FALSE')  isadj 
  9  from sys.x$ksppi x, sys.x$ksppcv y 
 10  where 1=1 and x.inst_id = y.inst_id and x.indx = y.indx and x.ksppinm like '%_enable_ptime%';

INST_ID CON_ID NAME                 DESCRIPTION        VALUE    ISDEFAULT ISMOD      ISADJ
------- ------ -------------------- ------------------ -------- --------- ---------- -----
      1      1 _enable_ptime_update Enable/Disable upd FALSE    TRUE      FALSE      FALSE
               _for_sys             ate of user$ for s
                                    ys

SQL> 

我們修改隱藏參數_enable_ptime_update_for_sys的值,然後重啟資料庫資料庫。

alter system set "_enable_ptime_update_for_sys"=true scope=spfile;
SQL> alter system set "_enable_ptime_update_for_sys"=true scope=spfile;

註意:有些資料庫版本由於補丁緣故,可能不存在隱藏參數_enable_ptime_update_for_sys。

資料庫實例重啟過後,我們重新測試,你會發現修改sys密碼後,密碼修改時間(PTIME)會正確更新,如下所示:

SQL> alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';
SQL> select name,ctime,ptime,exptime from sys.user$ where name='SYS';

NAME                 CTIME               PTIME               EXPTIME
-------------------- ------------------- ------------------- -------------------
SYS                  2019-04-17 00:56:32 2019-04-17 00:56:32 2024-04-13 21:51:05
SQL> alter user sys identified by "KjdhuHd31837KJD1";
SQL> select name,ctime,ptime,exptime from sys.user$ where name='SYS';

NAME                 CTIME               PTIME               EXPTIME
-------------------- ------------------- ------------------- -------------------
SYS                  2019-04-17 00:56:32 2023-10-16 22:34:32 2024-04-13 22:34:32
SQL> 
掃描上面二維碼關註我 如果你真心覺得文章寫得不錯,而且對你有所幫助,那就不妨幫忙“推薦"一下,您的“推薦”和”打賞“將是我最大的寫作動力! 本文版權歸作者所有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接.
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 關於HelixToolkit-這個3D呈現的交互處理推薦使用,因為功能比較強大 一個開源3D庫,根據MIT許可證獲得許可。MIT許可證非常寬鬆,允許在專有軟體中使用。該庫基於 .NET,目前專註於 WPF 平臺。 HelixToolkit是.NET Framework的一個開源3D圖形庫,它主要用於 ...
  • 需求:格式為exp的文件,具有json結構,替換掉其中某些數據 解決方法:讀取excel,用npoi讀取指定內容,在exp中找到特定結構,然後替換 讀取excel文件 讀取其他格式的文件也是用此方法 public void OpenExcel() { Microsoft.Win32.OpenFile ...
  • 我們在調試Web頁面時,期望能使用80埠調試(比如本博客站點的每篇博客,我在發佈之前,均需要在我的Mac電腦進行博客內容和樣式的調試和校驗)。而Mac電腦的80埠預設被系統Apache服務占用,下麵分享我常用的2種使用80埠調試Web站點頁面的辦法…… ...
  • 【學習課程】:【【小白入門 通俗易懂】2021韓順平 一周學會Linux】 https://www.bilibili.com/video/BV1Sv411r7vd/?p=14&share_source=copy_web&vd_source=2c07d62293f5003c919b2df9b2e054 ...
  • 在Linux系統中,測試硬碟的性能一般使用fio工具實現,fio是Flexible I/O Tester的縮寫。是一個常受歡迎的、用於測試存儲性能的工具,而且還可以模擬多種不同的I/O模式和工作負載。 一般我們要測試一塊硬碟的性能,一般需要進行隨機寫入測試、隨機讀取測試、順序寫入測試、順序讀取測試和 ...
  • 本章介紹了MongoDB複製集的配置和使用方法,如何初始化和添加節點到複製集,驗證主節點的寫入和從節點的讀取功能。瞭解如何查詢複製集的狀態,包括成員的健康狀況、同步信息和角色等。最後,我們介紹瞭如何配置複製集的安全認證,包括創建用戶和生成keyFile文件,並演示了使用認證信息連接複製集的方式。通過... ...
  • 1 背景 在講述分散式事務的概念之前,我們先來回顧下事務相關的一些概念。 1.1 事務的基本概念 就是一個程式執行單元,裡面的操作要麼全部執行成功,要麼全部執行失敗,不允許只成功一半另外一半執行失敗的事情發生。例如一段事務代碼做了兩次資料庫更新操作,那麼這兩次資料庫操作要麼全部執行成功,要麼全部回滾 ...
  • GaussDB(DWS) 從8.2.1版本後支持三種形式的臨時表:本地臨時表、Volatile臨時表、全局臨時表。本地臨時表特點:表定義和數據都是會話相關,其他會話看不到本會話創建的本地臨時表。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...