您的位置:首页 > 数据库 > Oracle

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

2010-09-20 17:02 239 查看
[声明:本文是学习著名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$基表创建的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: