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系统中所有数据字典,包括所有数据字典表和数据字典视图的名称和说明
原文地址:https://www.cnblogs.com/bicewow/p/11725773.html