查詢資料庫字符集時,V$NLS_PARAMETERS 與 NLS_DATABASE_PARAMETERS 結果不一致 (如地區顯示 CHINA vs AMERICA),引發對資料字典內部結構的探索。
$ 結尾)OBJ$, USER$, TAB$, IND$, SEG$, TS$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') 過濾$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_$SESSIONSELECT 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)OBJ$)WHERE 過濾條件產生
USER_TABLES:WHERE OWNER = USERALL_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$ 等基礎表
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
證明同名視圖與同義詞共存,屬不同物件。
V_$ 視圖的存在是為了可授權,解決 V$ 不可授權的限制USER/ALL/DBA 三層視圖源自同一基礎表,以權限過濾區分V$ 或 X$ 風格物件不影響字典,但極易混淆,強烈不建議遺留疑問:V_$ 視圖完全複製 V$ 結構卻可授權,其設計意義是否僅為權限隔離?歡迎高手指點。