ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 浅谈oracle数据字典的字典表、视图、同义词关系

浅谈oracle数据字典的字典表、视图、同义词关系

原创 Linux操作系统 作者:icer_repls 时间:2011-04-18 19:19:21 0 删除 编辑
    我研究这个问题是从设置字符集开始的,当时发现oracle服务器端报错时的提示有时候显示乱码(显示‘?’),而有时候有比较正常。于是在网上发现好几种查看数据库字符集的方式
            1>select * from v$nls_parameters;
             2>select * from nls_database_parameters;
网上都说是查看当前数据库的字符集(现在看来不准确,原因这里不谈),为什么查询后的结果集不一样呢?尤其是那个地区一个中国,一个美国,还有其他几个字段不同,这就激起了我研究各种视图之间联系的兴趣。
    先说明一下,我写这篇日志之前参考了eygle那篇文档的相关内容(http://www.eygle.com/pdf/A.Dive.Into.Oracle.Dictionary.pdf)
                 
                           (一)数据库内置的表和视图,用户一般不能改变内容
==============================================================
    orale数据字典里面字典表和视图、同义词有三类
        1>s$,--以这种开头的这是数据字典表
        2>v$和gv$--这种开头的是视图
        3>v_$和gv_$--这种开头的也是视图
        4>v$和gv$--请注意!!这里不是视图,是同义词,等下解释这里为什么可以和2同             名


    现在来说上面这四种之间的关系,第一种是s$表这些表是内置在数据库中的,数据库运行的基础,随着数据库启动而动态的创建(这是从eygle文档中得知的)。


    第二种v$/gv$。这种是在x$上创建的视图,这种视图不能被授权给任何其他的用户,如果要亲自证明的话,
其一证明是在x$上创建的可以用select view_definition from v$fixed_view_defintion where view_name=upper('这里写一个以v$或是gv$开头的系统内置视图名称');  
 其二证明这种类型的视图不能被授权给其他用户,可以用grant select on 视图名 to 用户名;
顺便说明一下v$和gv$的区别,v$一定是从gv$中通过了实例号的限制条件过滤出来的,因为我们的一个实例一次只能加载一个数据库,但是一个数据库可以被多个实例加载,那么我们为了得到所有实例里面的信息,就可以使用gv$这种视图了。


    第三种就是v_s$或是gv_s$了,oracle安装目录里面有个文件catalog.sql 这样一些脚本:
create or replace view v_$fixed_table as select * from v$fixed_table;
create or replace public synonym v$fixed_table for v_s$fixed_table;
从这里我们可以看出,第三种就是一个完完全全的第二种的一个copy一样,但是eygle说通过v_s$视图把v$视图和普通用户隔离起来了,因为v_$视图的权限可以授予给用户,但我不明白的是既然v_$是完全的从v$视图而来,连字段都一样,那么这做的意义何在呢?如果哪位读者知道恳请指点一下。


    第四种就是同义词,虽然名称表面上和第二种一模一样,举个例子:

  1  select name, type from v$fixed_table
  2* where name=upper('v$sga')
SQL> /

NAME                           TYPE
------------------------------ -----
V$SGA                          VIEW

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

SQL> col object_name for a25;
SQL> col object_type for a25;
SQL> col owner for a25;
SQL> select object_name, object_type, owner
  2  from dba_objects
  3  where object_name=upper('v$sga');

OBJECT_NAME               OBJECT_TYPE               OWNER
------------------------- ------------------------- -------------------------
V$SGA                     SYNONYM                   PUBLIC

我们仔细观察就知道一个是同义词一个是视图,而且视图是公有的,而视图是属于sys的,自然而然这两者就不是同一个对象了,例如你试着创建一个a视图,然后创建一个非公有的同义词a(名称相同),就会报错。但是我又遇到了一个问题,就是同义词和视图在dba_objects或是v$fixed_table一个视图里面不能一次查出来,而是分别存在连个视图里面(我之前做实践时,印象中曾经这样做到过,在一个视图中就同时查出了同义词和视图,以后发现了方法再贴出来),不管怎样现在我们大致明白了2和4的区别。

                                         (二)其他的视图、表,受用户影响
=============================================================
     以上是关于数据库字典表或是视图同义词的内容,但里面有个特点就是每个视图里面查出来得内容不会随用户自己创建表、视图、同义词而变化,也就是不建议我们去修改。接下来就谈谈一些表、视图,这些对象内容,也就是里面的记录受我们用户的影响。
    这里又大致可以分三类user_*,all_*,dba_*这后面可以接一些具体的信息,比如说tables, users, views, synonyms...
             1.查看所有用户:
                select * from dba_user;
                select * from all_users;
                select * from user_users;
             2.查看用户系统权限:
               select * from dba_sys_privs;
               select * from all_sys_privs;
               select * from user_sys_privs;
             3.查看用户对象权限:
               select * from dba_tab_privs;
               select * from all_tab_privs;
               select * from user_tab_privs;
             4.查看所有角色:
               select * from dba_roles;
             5.查看用户所拥有的角色:
               select * from dba_role_privs;
               select * from user_role_privs;
user代表当前用户权限内可以查看到的信息,all表示在user的权限基础上加上其他对象的,但是自己可以访问的信息,而dba的信息就一定包含前面user_*  all_*的所有信息,我猜想oracle的内部实现是一张实际的基表,然后通过视图过滤三个级别的三个视图出来。
三个研究其他表、视图、同义词对象入口的视图:
            dba_objects,
            v$fixed_table
            v$fixed_view_definition
 这三个最大的特点就是可以查出对象的类型,所有者之类的信息,并可以查出创建视图的定义语句(要看表的字段信息desc 表名)
  
                     最后详细说说dba_objects,v$fixed_table,v$fixed_view_definition
==============================================================

    1>dba_objects可以查看对象的类型,所有者,然后如果你要查看这些对象的详细信息,就可以根据他的类型了,如果是v$ gv$在v$fixed_view_definition中可以查到(凡是这种开头的只能这样查)。否则的话(非v$ gv$)在dba_views里面可以查到,是同义词就查dba_synonyms。
    2>v$fixed_table,这个表查的也是那些不受用户而影响的表、视图信息,我看eygle的推导里面 这个视图查询的总记录数=x$开头的记录数 + v$开头的记录数 +  gv$开头的记录数;在oracle 10 R2中发生了改变,新增了个:GO$SQL_BIND_CAPTURE     和 O$SQL_BIND_CAPTURE
 
   3>v$fixed_view_definition在1>里面已经说了,只能查v$ gv$开头的视图的信息


最后有的读者可能会想,我自己创建v$或是x$这种与数据字典表相似风格的表或其他类型的对象,当然没关系,丝毫不会影响到那些数据字典表,这些表的信息只会影响到dba_*这些对象的信息(记录增加),但是不建议这么做,容易混淆。


还有我有一个问题没有解决:当我查看dba_objects,dba_views,dba_synonyms这些视图的定义信息时,显示不完全,其中显示的一部分告诉我它依赖的表

SQL> select text from dba_views
  2  where view_name=upper('dba_synonyms');

TEXT
--------------------------------------------------------------------------------
select u.name, o.name, s.owner, s.name, s.node
from sys.user$ u, sys.syn$ s, sys

sys.ysn$ 和sys.user$这种类型的表


总结:通过研究数据字典,对oracle的认识更深了,但感觉自己的理解还是不很深刻,刚开始学oracle应该都是这样的吧,一次写这么多,写得不好的地方见谅,请指出我的错误(这点很重要,这是进步的捷径)我会继续努力的,跟大家分享更多的自己的观点。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/25701553/viewspace-692794/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2011-04-16

  • 博文量
    20
  • 访问量
    65188