zoukankan      html  css  js  c++  java
  • 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系统中所有数据字典,包括所有数据字典表和数据字典视图的名称和说明
  • 相关阅读:
    jQuery1.9(辅助函数)学习之—— jQuery.param( obj ); 编辑
    jQuery1.9(辅助函数)学习之——.serialize();
    jQuery1.9(辅助函数)学习之——.serializeArray();
    聊聊 getClientRects 和 getBoundingClientRect 方法
    聊一聊数组的map、reduce、foreach等方法
    Typescript 接口(interface)
    配置 tsconfig.json
    Chrome 插件推荐
    Typescript 基础知识
    package.json
  • 原文地址:https://www.cnblogs.com/bicewow/p/11725773.html
Copyright © 2011-2022 走看看