Oracle数据库数据字典概述

Oracle数据库数据字典概述

数据字典介绍

每个 Oracle 数据库的核心只读参考表及视图的集合,这些统称为数据字典。

Oracle 数据库的一个重要部分是它的数据字典,它是一组提供有关数据库管理元数据的只读表
数据字典包含如下信息:
1、在数据库中每个模式对象的定义,包括列的默认值和完整性约束信息
2、分配给模式对象的空间量及当前已使用量
3、Oracle 数据库用户的名称、 授予用户的权限和角色、和与用户相关的审计信息

数据字典是每个 Oracle 数据库数据管理的核心部分。
例如,数据库执行下列操作:
1、访问数据字典来查找有关用户、 模式对象、和存储结构的信息
2、每次发出 DDL 语句时,修改数据字典

就像存储其他数据一样,数据库将数据字典数据存储在表中,用户可以使用SQL 来查询其中的数据。例如,用户可以运行 SELECT 语句,以确定他们的权限,在他们的模式中有哪些表,这些表中有哪些列,这些列上是否建有索引等。

数据字典的内容

数据字典包含下列类型的对象:

基表

这些基础表存储有关数据库的信息。只应该由数据库写入和读取这些表。用户很少直接访问基础表,因为他们已被规范化,且大多数数据存储为一种神秘的格式。(例如,用户信息内部以user$方式命名存储,表空间信息内部以ts$方式命名存储)

视图

这些视图通过使用联接和 WHERE 子句来简化信息,将基础表的数据解码成有用的信息(如用户或表名等)。这些视图包含数据字典中的所有对象的名称和描述。一些视图可以被所有数据库用户访问,而其他一些则仅供管理员访问。

数据字典分组

通常,数据字典视图按集合分组。在许多的情况下,一个集合由三个包含相似信息的视图,并且彼此之间通过不同的前缀来区分。

前缀 用户访问 内容 注意
DBA_ 数据库管理员 所有对象 一些 DBA_ 视图具有更多的列,其中包含对管理员有用的信息。
ALL_ 所有用户 用户具有访问权限的对象 包括用户所拥有的对象和当前会话已启用的角色权限可以访问的对象。
USER_ 所有用户 用户所拥有的对象 USER_为前缀的视图不包括OWNER 列,此列隐含为发出查询的用户。

不是所有的视图集都有三个视图成员。例如,数据字典包含 DBA_LOCK 视图,但没有 ALL_LOCK 视图。

系统提供的DICTIONARY视图包含所有数据字典视图的名称和简短说明。

如下的对此视图的查询包含部分示例输出:
SELECT * FROM DICTIONARY ORDER BY TABLE_NAME;
TABLE_NAME             COMMENTS
------------------- ----------------------------------------
ALL_ALL_TABLES      Description of all object and relational tables accessible to the user
ALL_APPLY           Details about each apply process that dequeues from the queue visible to the current user current user

具有 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; 

具有 USER__前缀的视图

数据库用户最有可能感兴趣的视图可能是那些具有 USER前缀的视图。这些视图如下:
1、用户在数据库中的私有环境,用户所创建的模式对象的元数据,对该用户的授权等等
2、只显示与该用户相关的行,仅返回 ALL_视图中的信息的一个子集
3、除隐含的 OWNER 列外,与其他视图具有相同的列
4、为了方便,可能具有简洁的 PUBLIC 同义词

DUAL 表

DUAL 是数据字典中的一个很小的表,数据库和用户编写的程序可以引用它,以保证一个已知的结果。当一个值必须只能返回一次时,DUAL 表很有用,如当前日期和时间等。所有数据库用户都可以访问DUAL 表。
DUAL 表只有一个称为 DUMMY 的列, 仅包含一个其值为 X 的行。

下面的示例查询 DUAL 来执行一个算术操作:
SELECT ((3*4)+5)/3 FROM DUAL;
((3*4)+5)/3
-----------
5.66666667

select sysdate from dual;

补充说明

Oracle 在 23ai中首次实现了对“无表查询”的支持,允许 SELECT语句在不需要从表里取数据时,完全省略 FROM子句,像在MySQL中一样,直接执行简单的 SELECT语句来获取计算结果或系统值。

SELECT ((3*4)+5)/3;
select sysdate;

背后的实现原理

实际上,它是一个纯粹的“语法糖”,并不会改变 Oracle 的执行逻辑。
当你执行SELECT SYSDATE;时,Oracle的查询优化器会在后台自动将这条语句重写为 SELECT SYSDATE FROM SYS.DUAL;。
它的作用主要是为了简化书写,提高SQL代码在其他数据库间的可移植性,实际执行的计划和以前使用 DUAL 表是完全一样的

数据字典存储

数据字典基表是在任何 Oracle 数据库中创建的第一批对象。
所有数据库的数据字典表和视图都存储在 SYSTEM 表空间中。由于当数据库打开时,SYSTEM 表空间始终处于联机状态 ,所以当数据库打开时,数据字典总是可用的。

Oracle数据库如何使用数据字典

Oracle 数据库的 SYS 用户,拥有数据字典中的所有基表和用户可访问视图。数据字典基表中的数据,对于 Oracle 数据库发挥正常功能是必要的。因此,只应当由数据库写入或更改数据字典信息。
无论何时,任何数据库用户都不应改变 SYS 模式中的表行或模式对象,因为这种行为可能会危及数据完整性。安全管理员必须严格控制这个最重要的帐户。

注意事项:
1、修改或操作数据字典表中的数据,可能会永久性地对数据库操作造成负面影响。
2、在数据库运行期间,数据库读取数据字典,以确定存在模式对象,且用户对它们具有适当的访问权限。Oracle 数据库也会不断地更新数据字典,以反映对数据库结构、审计、授权、和数据等所做的更改。例如,如果 hr 用户创建了一个名为 interns 的表,则新行被添加到数据字典中,以反映新的表、列、 段、 区、和 hr 用户在该表上的权限。这些新的信息在字典视图下一次被查询时即可见。

数据字典视图的公共同义词

Oracle 数据库为许多数据字典视图创建公共同义词,以便用户可以方便地访问它们。安全管理员还可以为其它在系统范围内使用的模式对象创建公共同义词。用户应避免使用与公共同义词相同的名称来命名他们自己的模式对象。

缓存数据字典以备快速访问

很多数据字典信息存在于数据字典缓存中,因为数据库需要这些信息,来不断验证用户的访问权限,并验证模式对象的状态。解析信息通常保存在缓存中。
用于描述表及其列的 COMMENTS 列不会缓存在词典高速缓存中,但可缓存在数据库缓冲区高速缓存中。

其他程序与数据字典

其他 Oracle 数据库产品可能会引用现有的视图,并创建他们自己额外的数据字典表或视图。应用程序开发人员在编写需要引用数据字典的程序时,应该引用公共同义词而不是基表。
同义词不太可能随版本变化而变化。

数据库对象的元数据

DBMS_METADATA 软件包提供了用于提取数据库对象的完整定义的接口。定义可以按 XML 或 SQL DDL 来表示。它提供了两种样式的接口: 一个灵活的、 复杂的用于编程控制的接口,和一个简化的用于特定查询的接口。

posted @ 2026-04-28 09:46  数据库路上  阅读(7)  评论(0)    收藏  举报