《深入解析Oracle》学习笔记(5)---Oracle数据字典

[声明:本文是学习著名ORACLE DBA盖国强先生的大作《深入解析ORACLE--DBA 入门 进阶与诊断案例》的学习笔记与心得体会。在此声明,文中摘录了书中部分内容,非是出于抄袭目的,而是有感于盖国强先生所写确实经典。在此声明对原作者的尊重与敬佩。]

第四章  Oracle数据字典


Oracle数据字典是Oracle的元数据存储中心。记录和管理对象信息和安全信息。
数据字典包括以下内容:
1.所有数据库Schema对象的定义(表、视图、索引、聚簇、同义词、序列、过程函数、包、触发器)
2.数据库空间分配和使用情况
3.Oracle用户名称、角色、权限信息
4.字段缺省值、完整性约束信息
数据字典组成包括四部分:
1.内部RDBMS(X$表)
 这部分表是Oracle数据库的核心,跟踪数据库内部信息,维持数据库正常运行,也是其它大量视图的基础。了解这部分表对更好的理解Oracle很有帮助,遗憾的是这部分表是Oracle的机密,
   并对外不提供任何文档。要想了解,可以通过Oracle的AUTOTRACE功能,通过查询其它视图可以发现这些机密表。
2.数据字典表
 数据字典表(Data Ditionary Table)用于存储表、索引、约束、以及其它数据库结构信息。
 这些表是在数据库创建时,通过sql.bsq脚本文件创建的。
 这些表通常以"$"结尾,如TAB$,OBJ$,TS$等。
 数据字典表对于数据库的稳定运行关系重大,所以通常Oracle不也许直接对数据字典表进行操作,当用户执行DDL操作或者某些DML操作时,Oracle后台将这些操作解析为数据字典表的操作自动完成。
3.静态数据字典视图
 3.1 静态数据字典视图分类
 由于X$表和数据字典表通常不能直接访问,Oracle提供了一批视图,用于访问数据字典信息。这些信息相对稳定,不能直接修改,所以被称为静态数据字典视图。
   这些视图在创建数据库时由catalog.sql脚本创建。
 静态数据字典分为三类:
 USER_类视图包含了用户拥有的相关对象信息,用户可以通过这个视图查询自己拥有的对象信息。
 ALL_类视图包含了用户自己的和被别的用户授权的对象的信息。
 DBA_类视图包含了数据库所有相关对象的信息,SYSDBA可以访问所有用户的对象。用户需要SELECT ANY TABLE 权限才能访问。
 3.2 静态数据字典视图举例
 A.DICTONARY视图
    该视图只有两个字段,反映的是视图名和注释信息。
     可以直接查询视图,也可以通过Oracle为这个视图定义两个同义词DICT/DICTONARY来查询。
 B.DICT_COLUMNS视图
  该视图存储了视图的列。可以通过这个视图查看某个视图的列信息。
 以上两个视图结合起来使用情景是这样的:
  首先,查询DICTONARY视图,发现某个视图也许正是当前需要的,记下视图的名字;
    然后,从DICT_COLUMNS视图中查找到刚才取得的视图的全部列信息。
    最后,就可以从这个视图里直接取出特定列的值了。 
 C.DBA_BOJECTS/ALL_OBJECTS/USER_OBJECTS视图
  这三个视图基于底层字典表OBJ$建立,反映的是对于角色下的对象信息。
 D.DBA_SOURCE/ALL_SOURCE/USER_SOURCE视图
  这三个视图基于底层字典表SOURCE$建立,反映的是所有对象(FUNCTION、JAVA SOURCE、PACKAGE、PACKAGE BODY、PROCEDURE、TRIGGER、TRIGGER、TYPE、TYPE BODY)的源代码。
4.动态性能视图
 4.1动态性能视图分类
 动态性能视图(V$)和(GV$)两类。
 在数据库创建时,Oracle创建了X$表,并基于这些表,创建了GV$和V$两类视图,V$基于GV$创建,并且,每个GV$(Global View)都有一个对应的V$存在,这个视图是反映RAC环境下所有实例的状态的;V$只是反映当前连接实例的状态。
    这在创建视图的时候,通过视图脚本已经做了规定。
 4.2动态性能视图的本质
 无论是V$还是GV$,其本质都是基于基表X$的视图,V$基于GV$视图,而GV$基于X$表。接着,Oracle在视图V$和GV$上,又创建了V_$和GV_$,并在这两种视图的基础上创建了同义词V$和GV$。
    为什么要这么纠结呢?原因是:Oracle不允许直接对V$和GV$的授权,除了SYS用户以外,不允许其它用户查询或者授权V$和GV$,通过V_$和GV_$,Oracle把V$视图和普通用户隔离开,V_$视图的权限可以授予其它用户,同样,V_$的同义词也就是V_$可以被访问的了。
       那么我们平时在查询视图,例如V$PARAMETER的时候,究竟查询的是谁呢?
     Oracle的查询顺序是先表,再视图,最后同义词(先私有同义词,后公有同义词)。
 基于这个准则,我们查询V$PARAMETER为例,加入是SYS用户连接到数据库实例的画,那么查询的就是视图了,如果是普通用户,那么查询的就是同义词了。
 补充:
 在Oracle中,有一些特殊的视图记录了其它视图的创建方式,V$FIXED_VIEW_DEFINITION就是其中一个,如下例:
 我们查看GV$FIXED_TABLE和V$FIXED_TABLE,了解下GV$和V$的关系。
 首先,查看下V$FIXED_VIEW创建方式:
 SELECT view_definiton FROM V$FIXED_VIEW_DEFINITION WHERE view_name='V$FIXED_TABLE';
 输出如下:select NAME,OBJECT_ID,TYPE,TABLE_NUM FROM GV$FIXED_TABLE WHERE inst_id=USERNV('Instance'),
 可以看到V$FIXED_TABLE是基于GV$FIXED_TABLE视图创建的,接下来,查询GV$FIXED_TABLE视图创建方式:
 SELECT view_definiton FROM V$FIXED_VIEW_DEFINITION WHERE view_name='GV$FIXED_TABLE';
 输出如下:
 select inst_id,kqftanam,kqftaobj,'TABLE',indx from X$kpfta
 union all
 select inst_id,kqfvinam,kqfviobj,'VIEW',65537 from X$kqfvi
 union all
 select inst_id,kqfdtnam,kqfdtobj,'TABLE',65537 from X$kqfdt;
 可以看到GV$FIXED_TABLE是基于X$基表创建的。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老哥讲数据库

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值