Oracle v_$和v$的解釋


以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系統中所有數據字典,包括所有數據字典表和數據字典視圖的名稱和說明


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM