以v_$mystat和v$mystat具體說明
grant語句中使用的v_$mystat和test用戶訪問的v$mystat不一樣
這里說一下 v$mystat 和 v_$mystat 的區別
初始狀態下
SQL> conn test/test Connected. SQL> select sid from v$mystat where rownum=1; select sid from v$mystat where rownum=1 * ERROR at line 1: ORA-00942: table or view does not exist
沒有賦權限的情況下, 提示訪問的表或者視圖不存在,當sys用戶給test用戶授權后
SQL> conn / as sysdba Connected. SQL> grant select on v_$mystat to test; Grant succeeded. SQL> conn test/test Connected. SQL> select sid from v$mystat where rownum=1; SID ---------- 15
test用戶就可以訪問了,大家注意到上面兩個語句中執行的對象並不一樣,要訪問的是v$mystat,而授權的是v_$mystat,如果我們直接給v$mystat授權
SQL> grant select on v$mystat to test; grant select on v$mystat to test * ERROR at line 1: ORA-02030: can only select from fixed tables/views
說明這里授權的v$mystat不是固有視圖,不能直接授權,實際這里test訪問的v$mystat是一個同義詞,sys不能給同義詞授權,只能授權給固定的表或視圖,同義詞在Oracle中可以理解為一個對象的別名,有私有和共用之分,每個用戶都可以給自己的對象創建自己的同義詞,這樣創建的同義詞只能自己使用。
查詢V$MYSTAT的說明
SQL> select * from dict where table_name='V$MYSTAT'; TABLE_NAME COMMENTS ------------------------------ ------------------------------ V$MYSTAT Synonym for V_$MYSTAT
V$MYSTAT是一個同義詞是V_$MYSTAT的同義詞,再在庫中的同義詞數據字典中查找這個同義詞
SQL> select * from dba_synonyms where SYNONYM_NAME='V$MYSTAT'; OWNER SYNONYM_NAME TABLE_OWNER TABLE_NAME DB_LINK -------------------------------------------------------------------------------------------------------------- ------------------------------------------------------------ ----------------- PUBLIC V$MYSTAT SYS V_$MYSTAT
說明V$MYSTAT是SYS用戶的V_$MYSTAT視圖的共用同義詞,查詢V_$MYSTAT視圖的定義
SQL> select OWNER,VIEW_NAME,TEXT from dba_views where view_name = 'V_$MYSTAT'; OWNER VIEW_NAME TEXT ------------------------------ ------------------------------ SYS V_$MYSTAT select "SID","STATISTIC#","VALUE" from v$mystat
也可以通過dbms_metadata.get_ddl查詢V_$MYSTAT視圖的定義,dbms_metadata.get_ddl返回的是long類型的結果,long型數據為可變長字符串,最大長度限制是2GB,sqlplus處理long型數據非常困難,因為里面存的數據一般都很長,sqlplus顯示時一般只能顯示出來一部分,所以想顯示完整的long型數據,要先給sqlplus環境設置LONG參數
SQL> SET LONG 9999 SQL> select dbms_metadata.get_ddl('VIEW','V_$MYSTAT') from dual; DBMS_METADATA.GET_DDL('VIEW','V_$MYSTAT') -------------------------------------------------------------------------------- CREATE OR REPLACE FORCE VIEW "SYS"."V_$MYSTAT" ("SID", "STATISTIC#", "VALUE") AS select "SID","STATISTIC#","VALUE" from v$mystat
查詢V$MYSTAT的定義
SQL> select * from v$fixed_view_definition where VIEW_NAME = 'V$MYSTAT'; VIEW_NAME VIEW_DEFINITION ------------------------------ ------------------------------------------------------------------------------------------ V$MYSTAT select SID , STATISTIC# , VALUE from GV$MYSTAT where inst_id = USERENV('Instance')
說明有一個固定視圖也叫V$MYSTAT它來源於GV$MYSTAT,經過查找和分析,GV$MYSTAT同樣有一個同名的PUBLIC同義詞和一個固定視圖,而且也有一個關聯的GV_$MYSTAT視圖PUBLIC同義詞,V$MYSTAT來自於GV_$MYSTAT,而GV_$MYSTAT又產生自固定視圖GV$MYSTAT
再看一下固定視圖GV$MYSTAT的定義
SQL> select * from v$fixed_view_definition where VIEW_NAME = 'GV$MYSTAT'; VIEW_NAME VIEW_DEFINITION ------------------------------ ------------------------------------------------------------------------------------------ GV$MYSTAT select inst_id,ksusenum,ksusestn,ksusestv from x$ksumysta where bitand(ksspaflg,1)!=0 and bitand(ksuseflg,1)!=0 and ksusestn<(select ksusgstl from x$ksusgif)
說明固定視圖GV$MYSTAT來自於x$ksumysta,這里x$ksumysta表中的信息是Oracle實例當前會話的狀態信息,可以從v$fixed_table繼續查到x$ksumysta和結果中出現的x$ksusgif的信息
SQL> SELECT * FROM v$fixed_table WHERE NAME in ('X$KSUMYSTA','X$KSUSGIF'); NAME OBJECT_ID TYPE TABLE_NUM ------------------------------ ---------- ----- ---------- X$KSUSGIF 4294951930 TABLE 42 X$KSUMYSTA 4294951106 TABLE 44
這是固定表,不用再繼續找了,一般用戶使用的V$MYSTAT是一個共用同義詞,它的來源渠道追溯過程是:V$MYSTAT共用同義詞,來自於V_$MYSTAT視圖、V$MYSTAT固定視圖、GV$MYSTAT、固定表X$KSUMYSTA,所以V$MYSTAT最終來自於固定表X$KSUMYSTA。
前面查詢中用到的dict實際也是個共用同義詞,SYS用戶的DICTIONARY視圖有兩個共用同義詞DICT和DICTIONARY,我們使用了DICT同義詞,DICTIONARY是一個數據字典,官方描述是:DICTIONARY contains descriptions of data dictionary tables and views. 就是DICTIONARY是個數據字典,內容中包含Oracle系統中所有數據字典,包括所有數據字典表和數據字典視圖的名稱和說明