Oracle 数据库的一个重要部分是它的数据字典,它是一组提供有关数据库管理元数据的只读表。数据字典包含如下信息:
在数据库中每个模式对象的定义,包括列的默认值和完整性约束信息
分配给模式对象的空间量及当前已使用量
Oracle数据库用户的名称、 授予用户的权限和角色、和与用户相关的审计信息
数据字典是每个 Oracle 数据库数据管理的核心部分。例如,数据库执行下列操作:
访问数据字典来查找有关用户、 模式对象、和存储结构的信息
每次发出 DDL 语句时,修改数据字典
就像存储其他数据一样,数据库将数据字典数据存储在表中,用户可以使用SQL来查询其中的数据。例如,用户可以运行 SELECT 语句,以确定他们的权限,在他们的模式中有哪些表,这些表中有哪些列,这些列上是否建有索引等。
数据字典的内容
数据字典包含下列类型的对象:
基表
这些基础表存储有关数据库的信息。只应该由数据库写入和读取这些表。用户很少直接访问基础表,因为他们已被规范化,且大多数数据存储为一种神秘的格式。
视图
这些视图通过使用联接和 WHERE 子句来简化信息,将基础表的数据解码成有用的信息(如用户或表名等)。这些视图包含数据字典中的所有对象的名称和描述。一些视图可以被所有数据库用户访问,而其他一些则仅供管理员访问。
通常,数据字典视图按集合分组。在许多的情况下,一个集合由三个包含相似信息的视图,并且彼此之间通过不同的前缀来区分,如表 6-1 中所示。通过查询相应的视图,您可以访问只与您相关的信息。
不是所有的视图集都有三个视图成员。例如,数据字典包含 DBA_LOCK 视图,但没有 ALL_LOCK 视图。
系统提供的DICTIONARY视图包含所有数据字典视图的名称和简短说明。
SQL> select * from dictionary order by table_name;
具有DBA_前缀的视图
具有DBA_前缀的视图显示在整个数据库中的所有相关信息。DBA_ 视图仅用于管理员。
例如,下面的查询显示数据库中的所有对象的有关信息:
select owner, object_name, object_type from dba_objects order by owner, object_name;
具有ALL_前缀的视图
具有ALL_前缀的视图,是站在用户角度,从整体上看待数据库。这些视图除了包括用户本身拥有的模式对象之外,还包括该用户通过公共或显式授予的特权及角色所能访问的模式对象信息。
例如,如下的查询将返回有关您有权访问的所有对象的信息,
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(*)
----------
55703
SQL> set role none;
Role set.
SQL> select count(*) from all_objects;
COUNT(*)
----------
55703
应用程序开发人员在一个存储过程中使用 ALL_ 视图时应认识到的角色的影响,默认情况下角色是未启用的。
具有USER _前缀的视图
典型的数据库用户最有可能感兴趣的视图可能是那些具有USER_前缀的视图。这些视图:
指的是用户在数据库中的私有环境,包括用户所创建的模式对象的元数据,对该用户的授权等等
只显示与该用户相关的行,仅返回ALL_视图中的信息的一个子集
除隐含的OWNER列外,与其他视图具有相同的列
为了方便,可能具有简洁的PUBLIC同义词
例如,以下查询将返回包含在你的模式中的所有对象:
SELECT OBJECT_NAME, OBJECT_TYPE
FROM USER_OBJECTS
ORDER BY OBJECT_NAME;
DUAL表
DUAL是数据字典中的一个很小的表,数据库和用户编写的程序可以引用它,以保证一个已知的结果。,当一个值必须只能返回一次时,DUAL表很有用,如当前日期和时间等。所有数据库用户都可以访问DUAL表。
DUAL表只有一个称为 DUMMY的列, 仅包含一个其值为X 的行。下面的示例查询DUAL来执行一个算术操作:
SELECT ((3*4)+5)/3 FROM DUAL;
数据字典存储
数据字典基表是在任何 Oracle 数据库中创建的第一批对象。所有数据库的数据字典表和视图都存储在SYSTEM表空间中。由于当数据库打开时,SYSTEM 表空间始终处于联机状态 ,所以当数据库打开时,数据字典总是可用的。
Oracle数据库如何使用数据字典
Oracle数据库的SYS用户,拥有数据字典中的所有基表和用户可访问视图。数据字典基表中的数据,对于Oracle 数据库发挥正常功能是必要的。因此,只应当由数据库写入或更改数据字典信息。无论何时,任何数据库用户都不应改变SYS模式中的表行或模式对象,因为这种行为可能会危及数据完整性。安全管理员必须严格控制这个最重要的帐户。
警告:
修改或操作数据字典表中的数据,可能会永久性地对数据库操作造成负面影响。
在数据库运行期间,数据库读取数据字典,以确定存在模式对象,且用户对它们具有适当的访问权限。Oracle 数据库也会不断地更新数据字典,以反映对数据库结构、审计、授权、和数据等所做的更改。
例如,如果hr用户创建了一个名为interns的表,则新行被添加到数据字典中,以反映新的表、列、 段、 区、和hr用户在该表上的权限。这些新的信息在字典视图下一次被查询时即可见。
数据字典视图的公共同义词
Oracle 数据库为许多数据字典视图创建公共同义词,以便用户可以方便地访问它们。安全管理员还可以为其它在系统范围内使用的模式对象创建公共同义词。用户应避免使用与公共同义词相同的名称来命名他们自己的模式对象。
缓存数据字典以备快速访问
很多数据字典信息存在于数据字典缓存中,因为数据库需要这些信息,来不断验证用户的访问权限,并验证模式对象的状态。解析信息通常保存在缓存中。用于描述表及其列的COMMENTS列不会缓存在词典高速缓存中,但可缓存在数据库缓冲区高速缓存中。
其他程序与数据字典
其他Oracle数据库产品可能会引用现有的视图,并创建他们自己额外的数据字典表或视图。应用程序开发人员在编写需要引用数据字典的程序时,应该引用公共同义词而不是基表。同义词不太可能随版本变化而变化。