DataDictionary and Dynamic Performance Views(数据字典和动态性能试图)
这一章介绍了每个数据库的具有的只读参考表(视图)的最重要部分,统称为数据字典。这张还介绍了动态性能试图,它们是一些在数据库打开状态时会不停更新的特殊视图。
这章包含一下小节:
·Overview of the Data Dictionary(数据字典的概述)
·Overview of the Dynamic Performance Views(动态性能试图的概述)
·Database Object Metadata(数据库对象元数据)
Overview of the DataDictonary(数据字典的概述)
Oracle数据库有一个很重要的部分,就是data dictionary(数据字典),它们是只读表提供数据库管理时需要的元数据。数据字典们会包含如下内容:
·每个schema object的定义,包括每列的默认值,完整性约束信息
·分配给schema object的空间,以及它当前使用了多少空间
·Oracle数据库的用户的名字,授予用户的权限和角色,以及和用户相关的审计信息
数据字典,是每个数据库数据管理的核心部分.举个例子说明,数据库执行了下列操作:
·通过访问数据字典获取用户,schema object,存储结构等的详细信息.
·每次发出DDL语句时,会对数据字典造成修改.
因为Oracle数据库存储数据字典中数据的方式,和其他数据一样,都是存入到表中,所以用户可以直接通过SQL来查这些数据。举个例子:用户可以执行SELECT语句去确定他们的权限,他们的schema中有什么表,这些表有什么列,列上是否有索引,等等。
Contents of the DataDIctionary(数据字典的内容)
数据字典由下面两种对象组成:
·Base tables
它们存储着关于数据库的信息。只有Oracle数据库可以读写这些表。用户很少直接访问这些表,因为表和其中数据的格式,都是按照一种绝密的方式存放的。
·Views
这些视图使用joins和WHERE语句来简化信息,对基表的数据进行判断,把有用的信息显示出来(例如表名,用户名)。这些视图包含数据字典中的所有对象的描述和名称。有一些视图,所有的用户都可以访问,而另外的视图则只为管理员准备
基本来说,数据字典视图根据集合分组。大多数情况下,一个集合由包含相似信息的三个视图组成,这三个视图通过不同的前缀来区分,如下面的表所示。查询合适的视图,你可以访问只与你相关的信息:
| Prefix |
User Access |
Contents |
Notes |
| DBA_ |
数据库管理员 |
所有对象 |
一些DBA_视图拥有一些额外的列。专门供DBA使用 |
| ALL_ |
所有用户 |
用户有权限访问的 |
包括自己拥有的对象。这些视图服从当前已经启用的角色 |
| USER_ |
所有用户 |
用户自设拥有的 |
USER_开头的视图,通常都没有OWNER列。此列隐含为对视图发出查询的用户 |
不是所有的视图集合都是三个成员。举个例子:有数据字典DBA_LOCK视图,但没有ALL_LOCK视图。
系统提供了一个DICTIONARY视图包含了所有数据字典视图的名称和简单描述。
下面就是查询这个视图的案例:
SQL> SELECT * FROM DICTIONARY
2 ORDER BY TABLE_NAME;
TABLE_NAME COMMENTS
----------------------------------------------------------------------
ALL_ALL_TABLES Description of all object andrelational
tablesaccessible to the user
ALL_APPLY Details about each applyprocess that
dequeues fromthe queue visible to the
current user
.
.
Views with the Prefix DBA_(DBA_前缀的视图)
DBA_前缀的视图显示了整个数据库中所有相关的信息。DBA_ 视图为DBA所准备。
举个例子,下面的查询显示了数据库中所有object相关的信息:
SELECT OWNER, OBJECT_NAME, OBJECT_TYPE
FROM DBA_OBJECTS
ORDER BY OWNER, OBJECT_NAME;
Viewswith the Prefix ALL_(ALL_前缀的视图)
ALL_前缀的视图通过用户的视角去看整个数据库。这些视图返回的信息,都是用户可以访问的信息,通过public角色或者显式授予的权限和角色,可以看到自己有权限看到的对象的信息。
举个例子,下面的查询将返回你所有访问的所有对象的信息:
SELECT OWNER, OBJECT_NAME, OBJECT_TYPE
FROM ALL_OBJECTS
ORDER BY OWNER, OBJECT_NAME;
因为ALL_ 视图 服从与 已经启用的角色,查询的结果则依赖于哪些角色已经启用了,像下面的例子:
SQL> SET ROLE ALL;
Role set.
SQL> SELECT COUNT(*) FROM ALL_OBJECTS;
COUNT(*)
----------
68295
SQL> SET ROLE NONE;
Role set.
SQL> SELECT COUNT(*) FROM ALL_OBJECTS;
COUNT(*)
----------
53771
应用开发人员应该认识到在存储过程中 使用ALL_ 视图时 角色对其的影响,如果这里角色默认不是激活状态的话。
Viewswith the Prefix USER_(USER_ 开头的视图)
普通数据库用户可以对USER_ 开头的视图更感兴趣,这些视图:
·指的是在数据库中用户的私有环境,包括用户创建的schema objects相关的元数据,用户授出去的权限,等等。
·显示ALL_ 视图中属于用户自己的一部分
·拥有的和其他视图一样的列,除了OWNER列以外。
·可以为了方便而创建一个简短一些的PUBLIC 同义词。
举个例子,下面的查询返回你schema中所有的objects
SELECT OBJECT_NAME, OBJECT_TYPE
FROM USER_OBJECTS
ORDER BY OBJECT_NAME;
TheDUAL Table(DUAL表)
DUAL是个数据字典中的小表,Oracle数据库和用户自定义过程可以引用它来保证获得一个正常的返回结果。当一个值只返回一次时,可以使用dual表,举个例子:当前的日期和时间。所有的数据库用户都可以访问DUAL。
DUAL表只有一列,列名为DUMMY,也只有一行,值是X。
下面的例子是通过查询DUAL做一次数学运算:
SQL> SELECT ((3*4)+5)/3 FROM DUAL;
((3*4)+5)/3
-----------
5.66666667
Storageof the Data Dictionary(数据字典的存储)
Oracle数据库最先创建的就是数据字典的基表。数据库中所有的数据字典视图和基表都是存放在SYSTEM表空间。因为在数据库打开时,SYSTEM表空间永