数据库模式,是被称为模式对象的数据结构的逻辑容器。
数据库用户具有口令并拥有各种数据库的权限。每个用户拥有一个单一的模式,此模式与用户具有相同的名称。模式包含相应用户的全部数据。 在生产数据库中,一个数据库模式的拥有者通常表示一个数据库应用程序,而不是一个人。
在一个模式里,某一特定类型的每个模式对象都有一个唯一的名称。同时在一个模式里,不同类型的模式对象也可能需要唯一的名称。
模式对象类型
在关系数据库中,最重要的模式对象是表。 表以行的形式存储数据。
Oracle SQL 使您能够创建和操作许多其他类型的模式对象,包括以下这些:
索引
索引是一种模式对象,对于每一个被索引的表行或表簇行,索引都包含一个条目 ,以提供直接、 快速的存取。 Oracle 数据库支持几种类型的索引。 一个索引组织表是一个表,其数据以一个索引结构来存储。
分区
分区是大型表和索引的分片。 每个分区有其自己的名称,并可能有其自己(可选)的存储特征。
视图
视图是对一个或多个表、或其他视图中的数据的自定义表示。 你可以把它们看作存储的查询。 视图实际上并不存储数据。
序列
序列是一个由用户创建的对象,可以被多个用户共享,用于生成整数。 通常,序列用于生成主键值。
维度
维度定义多个列集之间的父-子关系,列集中的所有列必须都来自同一个表。维度通常用于对客户、 产品、和时间之类的数据进行分类。
同义词
同义词是另一个模式对象的别名。 因为同义词只是一个别名,它在数据字典中除了其定义之外,没有存储。
注:同义词本身也是可以作为模式对象授权给其他用户。
v$开头的动态性能视图是以
v_$开头的动态性能视图的同义词。
这种类型的同义词如果作为模式对象授权给其他用户的话,会提示如下信息:
ORA-02030: can only select from fixed tables/views
PL/SQL子程序和包
PL/SQL 是Oracle 对SQL的过程化扩展。 PL/SQL 子程序是命名的 PL/SQL 块,可以带参数调用。 PL/SQL 包用于将逻辑上相关的 PL/SQL 类型、 变量、游标、和子程序进行分组。
注:模式对象的信息可以通过相应的数据字典视图查看。
还有一些其他类型的对象也存储在数据库中,并以SQL语句来创建和操作,但不包含在模式中。 这些对象包括数据库用户、 角色、 上下文、和目录对象。
模式对象存储
一些模式对象将数据存储在称为段的逻辑存储结构中。其他模式对象,则只包含元数据。
Oracle 数据库逻辑上将模式对象存储在表空间中。 在模式和表空间之间没有任何的关系: 一个表空间可以包含来自不同的模式的对象,一个模式中的对象也可以包含在不同的表空间中。 每个对象的数据在物理上包含在一个或多个数据文件中。
一个表的数据段跨越两个数据文件,这两个数据文件属于同一个表空间。 一个段不能跨多个表空间。
模式对象依赖
一些模式对象会引用其它对象,这就产生了模式对象依赖。如果对象 A 的定义引用了对象 B,那么 A 相对于B来说是依赖对象,或B相对于A来说是被引用对象。
Oracle 数据库提供了一种自动的机制,以确保依赖对象对于相应的被引用对象来说始终是最新的。 当依赖对象产生后,数据库将跟踪依赖对象和其被引用对象之间的依赖关系。当被引用对象的更改可能会影响依赖对象时,依赖对象被标记为无效。
在一个无效的依赖对象重新变得可用之前,必须基于对被引用对象的新定义重新编译。 当无效依赖对象被引用时,重新编译会自动发生。
为演示模式对象之间如何产生依赖,下面的示例脚本创建表 test_table,然后创建一个查询此表的存储过程:
CREATE TABLE test_table ( col1 INTEGER, col2 INTEGER );
CREATE OR REPLACE PROCEDURE test_proc
AS
BEGIN
FOR x IN ( SELECT col1, col2 FROM test_table )
LOOP
-- process data
NULL;
END LOOP;
END;
/
下面的查询显示过程 test_proc 的状态是有效的:
select object_name, status from user_objects where object_name=upper('test_proc');
向test_table表中添加 col3 列之后,该过程仍然是有效的,因为该过程不依赖于该列:
alter table test_table add col3 number;
但是,更改col1 列的数据类型后,test_proc过程变得无效,因为该过程依赖于该列。
alter table test_table modify col1 varchar2(20);
运行或重新编译该过程使它重新有效,如下面的示例中所示:
SQL> execute test_proc
PL/SQL procedure successfully completed.
注:在对被引用对象的修改,可能导致依赖对象重新编译之后仍然不可用。