首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

深入解析 Oracle 資料字典:字典表、視圖與同義詞的層級關係

     編輯:Oracle 資料庫基礎

引言:從字符集查詢差異說起

查詢資料庫字符集時,V$NLS_PARAMETERS 與 NLS_DATABASE_PARAMETERS 結果不一致 (如地區顯示 CHINA vs AMERICA),引發對資料字典內部結構的探索。

一、 核心資料字典物件的四大類別與關係

1. 基礎字典表 (SYS 擁有,名稱以 $ 結尾)

  • 如:OBJ$, USER$, TAB$, IND$, SEG$, TS$
  • 資料庫啟動時動態建立/載入,為所有上層視圖的最終資料來源
  • 一般用戶不可直接存取

2. 固定視圖 (V$ / GV$ 開頭)

  • 建立於 X$ 固定表之上 (如 X$KVIS)
  • 查詢定義:SELECT view_definition FROM v$fixed_view_definition WHERE view_name='V$INSTANCE'
  • 特性:不可授權給其他用戶 (GRANT SELECT ON V$SESSION TO USER1 會失敗)
  • GV$ 包含所有實例資料 (RAC 環境),V$ 經過 INST_ID = USERENV('INSTANCE') 過濾

3. 公開視圖 (V_$ / GV_$ 開頭)

  • 定義於 $ORACLE_HOME/rdbms/admin/catalog.sql:
CREATE OR REPLACE VIEW V_$SESSION AS SELECT * FROM V$SESSION;
CREATE PUBLIC SYNONYM V$SESSION FOR V_$SESSION;
  • 關鍵差異:V_$ 視圖可授權給一般用戶,作為安全隔離層
  • 實際查詢時使用 V$SESSION (Public Synonym) 會解析至 V_$SESSION
  • 4. 公共同義詞 (PUBLIC SYNONYM,名稱同 V$)

    • SELECT object_name, object_type, owner FROM dba_objects WHERE object_name='V$SGA' 可見兩筆:
      V$SGA VIEW SYS (實為 V_$SGA)
      V$SGA SYNONYM PUBLIC (指向 V_$SGA)
    • 同義詞與視圖同名但屬不同物件類型,不衝突

    二、 使用者層級視圖三層架構 (USER_* / ALL_* / DBA_*)

    • 基礎表:單一實體表 (如 OBJ$)
    • 三層視圖:透過 WHERE 過濾條件產生
      • USER_TABLES:WHERE OWNER = USER
      • ALL_TABLES:WHERE OWNER = USER OR 有權限
      • DBA_TABLES:無過濾 (需 DBA 權限)
    • 同樣適用於 VIEWS, SYNONYMS, USERS, ROLE_PRIVS, TAB_PRIVS, SYS_PRIVS 等

    常用查詢入口

    -- 所有用戶
    SELECT * FROM DBA_USERS;      -- 需 DBA
    SELECT * FROM ALL_USERS;      -- 可見用戶
    SELECT * FROM USER_USERS;     -- 當前用戶
    
    -- 系統權限
    SELECT * FROM DBA_SYS_PRIVS;
    SELECT * FROM USER_SYS_PRIVS;
    
    -- 物件權限
    SELECT * FROM DBA_TAB_PRIVS;
    SELECT * FROM USER_TAB_PRIVS;
    
    -- 角色
    SELECT * FROM DBA_ROLES;
    SELECT * FROM DBA_ROLE_PRIVS;
    SELECT * FROM USER_ROLE_PRIVS;

    三、 研究資料字典的三大核心視圖

    視圖用途特殊能力
    DBA_OBJECTS查詢所有物件類型、擁有者、狀態涵蓋表、視圖、同義詞、索引、套件等所有物件
    V$FIXED_TABLE查詢 X$/V$/GV$ 固定表/視圖定義可見 X$ 內部表結構
    V$FIXED_VIEW_DEFINITION查詢 V$/GV$ 視圖的 SQL 定義唯一能看到 V$ 視圖底層 SQL 的地方

    查詢視圖定義的限制

    -- 查看 DBA_SYNONYMS 定義 (會截斷)
    SELECT text FROM DBA_VIEWS WHERE VIEW_NAME='DBA_SYNONYMS';
    -- 結果僅顯示前段,提示依賴 SYS.USER$, SYS.SYN$ 等基礎表

    四、 實驗驗證:V$SGA 的雙重身分

    SQL> SELECT name, type FROM v$fixed_table WHERE name='V$SGA';
    NAME      TYPE
    V$SGA     VIEW
    
    SQL> SELECT object_name, object_type, owner FROM dba_objects WHERE object_name='V$SGA';
    OBJECT_NAME  OBJECT_TYPE  OWNER
    V$SGA        SYNONYM      PUBLIC
    V$SGA        VIEW         SYS   -- 實為 V_$SGA

    證明同名視圖與同義詞共存,屬不同物件。

    五、 總結與心得

    1. 資料字典採 基礎表 → 固定視圖 → 公開視圖 → 同義詞 四層架構,兼顧效能、安全與相容性
    2. V_$ 視圖的存在是為了可授權,解決 V$ 不可授權的限制
    3. USER/ALL/DBA 三層視圖源自同一基礎表,以權限過濾區分
    4. 自建 V$ 或 X$ 風格物件不影響字典,但極易混淆,強烈不建議

    遺留疑問:V_$ 視圖完全複製 V$ 結構卻可授權,其設計意義是否僅為權限隔離?歡迎高手指點。

    1. 上一篇文章:
    2. 下一篇文章:
    Copyright © 程式碼之家 All Rights Reserved