7 数据字典
这章讲了每个oracle数据库上只读的表和视图的重要集合,为大家所知的数据字典。
这章包含下面的内容:
*数据字典的引入
*数据字典是如何被利用的?
*动态的性能表
*数据库对象元数据
数据字典的引入
一个数据库最重要的部分之一是数据字典,数据字典是那些只读的提供关于数据库信息的表的集合。一个数据字典包含:
*在数据库中所有对象的定义(表,视图,索引,簇,同义词,序列,存储过程,函数,包,触发器等等);
*有多少空间已经被分配给对象并且被对象所利用;
*每列的默认值;
*完整性约束信息
*oracle用户的名字
*每个用户被授予的权利以及角色
*审核信息,例如各种对象已经被谁访问过或者更新过;
*其他的一般的数据库信息;
数据字典是以表和视图的形式被构造,就像其他的数据库数据。对于一个给定的数据库所有数据字典中的表和视图被存储在数据库的system表空间里。
数据字典不仅是对于每个数据库来说是重要的,对所有用户,从应用软件的最终用户到应用软件的设计者和数据库管理员来说也是非常重要的。一般是通过SQL语句来访问数据字典。因为数据字典是只读的,所以你只能通过对数据字典的表和视图发出查询操作(select语句)。
数据字典的结构
数据字典是由下面的组成的:
基表
基表是存储关于相关数据库的信息的潜在的表。只有oracle能够向这些表中写或者读。用户几乎很少直接访问这些表因为这些表被格式化,并且大多数数据是以秘密的形式存储的。
用户可访问的视图
用户可访问的视图总结并且显示了数据字典中的存储在基表中的信息的视图。这些视图将基表中的数据解码成为有用的信息,例如:用户或者表名,采用连表或者where条件筛选。大多数被授予访问视图的权限而不是访问基表的权限。
数据字典的拥有者—sys
Oracle的sys用户拥有数据字典的基表和用户可访问的视图。Oracle的其他用户是永远不能修改在sys用户下的对象或者是更新,删除或者插入数据行操作的,因为这样的行为可能会破坏数据完整性。安全管理员必须严格控制这个重要的数据。
警告:对数据字典表中数据的修改或者操作可能会永久的并且严重的影响数据库操作。
数据字典是如何被利用的
数据字典有三个主要的用途:
*oracle通过访问数据字典来查找关于用户,对象以及存储结构的信息;
*每次DDL语句被执行,oracle会修改数据字典的信息;
*任何oracle用户都可以利用数据字典得到关于数据库的只读的参考信息。
Oracle是如何利用数据字典的
数据字典中基表的数据对于oracle运行是必要的信息。因此,只有oracle能够对数据字典的信息进行写操作或者修改操作。每当数据库升级或者降级时,oracle提供脚本来修改数据字典中的表。
警告:在数据字典中表的数据不应该被任何用户修改或者删除。
在数据库运行期间,oracle读取数据字典信息来确保对象的存在并且用户有适当的权限访问这些对象。Oracle也不停地更新数据字典来反映数据库结构的变化,审核,权限授予以及数据方面的变化。
例如:如果用户Kathy创建一张名为parts的表,然后新的记录被加入到数据字典中,这条新的记录包含了新表的信息,以及表列,表段,表区域以及用户Kathy拥有的对该表的权限的信息。这些新的信息在下次数据字典被查询时是可见的。
数据字典视图的公共的同义词
Oracle创建了许多数据字典中视图的公共的同义词以便用户能够方便的访问它们。安全管理员也可以为那些被应用的比较广泛的对象创建额外的公共的同义词。用户应该避免为给自己用户下的对象命名一个与公共的同义词的名字一样的名字。
为快速访问缓存数据字典
数据字典的大多数信息被保留在字典缓存中的SGA(系统全局区域)中,因为在数据库做验证用户的访问权限并且检验对象的状态的操作时,oracle不停地访问数据字典。所有的信息采用最近最少(LRU)的算法来在内存中存储。
分解的信息被保留在内存中。描述表以及列的注释的信息一般是不被存放在内存中除非它们被频繁的访问。
其他程序和数据字典
其他的oracle产品能够引用存在的视图并且创建额外的属于他们自己的数据字典表和视图。应用软件开发者写的程序中引用数据字典应该引用公共的同义词而不是引用潜在表:同义词在软件发布之间很少可能被修改。
如何利用数据字典
对于所有数据库用户来说数据字典的视图是提供一个参考。用SQL语句来访问数据字典视图。一些视图所有oracle用户都是可以访问的,并且其他的视图只能是数据库管理员可以访问。
当数据库处于打开状态时数据字典总是可用的。数据字典是在system表空间中,并且system表空间都是处于在线状态中。
数据字典是由视图的集合组成。在许多例子中,三个包含类似信息视图的集合,并且通过它们的前缀来与其他的视图相互区别:
表7-1 数据字典视图前缀
前缀
|
范围
|
user
|
用户的视图(在该用户下的视图)
|
all
|
扩展的用户视图(指定的用户可以访问的视图)
|
dba
|
数据库管理员视图(在所有用户下的视图)
|
所有视图的列的集合上相同的,但是有下面的异常:
*在前缀是user的视图通常不包含owner列。在user前缀的视图这列可以通过该用户发布的查询命令来暗含是该用户的信息;
*一些DBA的视图有额外的列包含了一些对数据库管理员有用的信息。
带有用户前缀的视图
最可能对典型的数据库用户感兴趣的视图是那些带有user前缀的视图。这些视图:
*涉及到在数据库中该用户自己私有的环境,包括被该用户创建的对象,被该用户授予的权限等等信息;
*只显示与该用户相关的行;
*除了已经被暗示的owner列之外,和其他的视图具有相同的列;
*返回在带有ALL前缀的视图的子集;
*为了方便可以拥有简短的pulic同义词;
例如:下面的查询返回在你用户下包含的所有对象:
SELECT object_name, object_type FROM USER_OBJECTS;
带有
ALL
前缀的视图
带有
ALL
前缀的视图反映数据库用户的所有观察图。这些视图不仅反映那个用户自身拥有的对象,也返回了有关一些对象的信息,这些对象都已经通过公共的或者已经明确的将一些权限和角色授予该用户并且是用户可以访问的对象。例如:下面的查询返回一些你能够访问的所有对象的信息:
SELECT owner, object_name, object_type FROM ALL_OBJECTS;
带有
DBA
前缀的视图
带有
DBA
前缀的视图显示了整个数据库的一个全局的视图。对于这些视图同义词是不允许被创建的,因为
DBA
视图只应该被管理员所查询。因此,为了查询
DBA
视图,管理员必须在这个视图名字的前面加上拥有者
,sys
,像下面的语句:
SELECT owner, object_name, object_type FROM SYS.DBA_OBJECTS;
Oracle
推荐你执行数据字典保护来阻止用户通过利用在数据字典上的这样的权限拥有了任何系统权限。如果你使用数据字典保护(
O7_DICTIONARY_ACCESSIBILITY
是
false
),然后对sys用户下的对象的访问只限制于sys用户下。这些用户是sys并且是以sysdba身份连接数据库的。
Dual表
名字为dual的表是一张在数据字典中的表表,oracle和用户写的程序可以引用这张表来保证一个大家都知道的结果。这战败表有一个名为dummy的列并且有一行数据并且数据值是‘X’。
动态的性能表
在数据库运行的整个过程中,oracle维护一组记录当前数据库的活动的虚拟表。这些表被称为动态的性能表。
动态的性能表不是真正的表,并且它们不能被大多数用户所访问。但是,数据库管理员能够查询这些表并且可以在这些表上创建视图,而且可以将这些新创建的视图的访问权限授予其他用户。这些视图有时候也被称之为固定的试图,因为它们不能够被数据库管理员修改和移动。
Sys用户拥有动态的性能表;它们的名字都是以v_$开头的。可以在这些表上创建视图,并且也可以对这些已经建好的视图创建同义词。这些同义词的名字都是以v$开头的。例如:v$datafile视图包含了关于数据库文件的信息,并且v$fixed_table视图包含了关于在数据库中所有的动态性能表和视图的信息。
数据库对象的元数据
Dbms_metadata包提供了提取数据库对象复杂定义的接口。这些定义可以通过或者XML形式或者SQL的DDL的形式来表达。两种风格的接口被提供:
*用来有计划的控制的一个灵活的复杂的接口;
*用来ad hoc查询的简单化的接口。