数据库模式,是被称为模式对象的数据结构的逻辑容器。举例来说,表和索引即是模式对象。模式对象通过SQL来创建和操作。
数据库用户具有口令并拥有各种数据库的权限。每个用户拥有一个单一的模式,此模式与用户具有相同的名称。模式包含相应用户的全部数据。例如,hr用户拥有hr模式,此模式包含如雇员表之类的模式对象。在生产数据库中,一个数据库模式的拥有者通常表示一个数据库应用程序,而不是一个人。
在一个模式里,某一特定类型的每个模式对象都有一个唯一的名称。例如hr.employees是指hr模式中的employees表。图2-1描述了一个名为hr的模式拥有者,及其在hr模式内的模式对象。

模式对象类型
在关系数据库中,最重要的模式对象是表。表以行的形式存储数据。
OracleSQL使您能够创建和操作许多其他类型的模式对象,包括以下这些:
•索引
索引是一种模式对象,对于每一个被索引的表行或表簇行,索引都包含一个条目,以提供直接、快速的存取。Oracle数据库支持几种类型的索引。一个索引组织表是一个表,其数据以一个索引结构来存储。请参见第3章,“索引和索引组织表”。
•分区
分区是大型表和索引的分片。每个分区有其自己的名称,并可能有其自己(可选)的存储特征。请参阅"分区概述"。
•视图
视图是对一个或多个表、或其他视图中的数据的自定义表示。你可以把它们看作存储的查询。视图实际上并不存储数据。请参见"视图概述"。
•序列
序列是一个由用户创建的对象,可以被多个用户共享,用于生成整数。通常,序列用于生成主键值。请参阅"序列概述"。
•维度
维度定义多个列集之间的父-子关系,列集中的所有列必须都来自同一个表。维度通常用于对数据进行分类(如客户、产品、和时间之)。请参阅"维度概述"。
•同义词
同义词是另一个模式对象的别名。因为同义词只是一个别名,它在数据字典中除了其定义之外,没有存储。请参阅"同义词概述"。
•PL/SQL子程序和包
PL/SQL是Oracle对SQL的过程化扩展。PL/SQL子程序是命名的PL/SQL块,可以带参数调用。PL/SQL包用于将逻辑上相关的PL/SQL类型、变量、和子程序进行分组。请参阅"PL/SQL子程序"和"PL/SQL包"。
还有一些其他类型的对象也存储在数据库中,并以SQL语句来创建和操作,但不包含在模式中。这些对象包括数据库用户、角色、上下文、和目录对象。
模式对象存储
一些模式对象将数据存储在称为段的逻辑存储结构中。例如,一个未分区的堆组织表或索引会创建一个段。其他模式对象,如视图和序列,则只包含元数据。这一节仅描述有段的模式对象。
Oracle数据库逻辑上将模式对象存储在表空间中。在模式和表空间之间没有任何的关系:一个表空间可以包含来自不同的模式的对象,一个模式中的对象也可以包含在不同的表空间中。每个对象的数据在物理上包含在一个或多个数据文件中。
图2-2显示了一种在表、索引段、表空间、和数据文件之间的可能配置。一个表的数据段跨越两个数据文件,这两个数据文件属于同一个表空间。一个段不能跨多个表空间。

模式对象依赖
一些模式对象会引用其它对象,这就产生了模式对象依赖。例如,一个视图包含一个引用表或其他视图的查询,或一个PL/SQL子程序调用其他子程序。如果对象A的定义引用了对象B,那么A相对于B来说是依赖对象,或B相对于A来说是被引用对象。
Oracle数据库提供了一种自动的机制,以确保依赖对象对于相应的被引用对象来说始终是最新的。当依赖对象产生后,数据库将跟踪依赖对象和其被引用对象之间的依赖关系。当被引用对象的更改可能会影响依赖对象时,依赖对象被标记为无效。例如,当用户删除一个表,所有基于这个被删除表的视图都将变得不可用。
在一个无效的依赖对象重新变得可用之前,必须基于对被引用对象的新定义重新编译。当无效依赖对象被引用时,重新编译会自动发生。
为演示模式对象之间如何产生依赖,下面的示例脚本创建表test_table,然后创建一个查询此表的存储过程:
CREATETABLEtest_table(col1INTEGER,col2INTEGER);
CREATEORREPLACEPROCEDUREtest_proc
AS
BEGIN
FORxIN(SELECTcol1,col2FROMtest_table)
LOOP
–processdata
NULL;
ENDLOOP;
END;
/
下面的查询显示过程test_proc的状态是有效的:
SQL>SELECTOBJECT_NAME,STATUSFROMUSER_OBJECTSWHEREOBJECT_NAME=‘TEST_PROC’;
OBJECT_NAMESTATUS
TEST_PROCVALID
向test_table表中添加col3列之后,该过程仍然是有效的,因为该过程不依赖于该列:
SQL>ALTERTABLEtest_tableADDcol3NUMBER;
Tablealtered.
SQL>SELECTOBJECT_NAME,STATUSFROMUSER_OBJECTSWHEREOBJECT_NAME=‘TEST_PROC’;
OBJECT_NAMESTATUS
TEST_PROCVALID
SQL>ALTERTABLEtest_tableADDcol3NUMBER;
Tablealtered.
SQL>SELECTOBJECT_NAME,STATUSFROMUSER_OBJECTSWHEREOBJECT_NAME=‘TEST_PROC’;
OBJECT_NAMESTATUS
TEST_PROCVALID
但是,更改col1列的数据类型后,test_proc过程变得无效,因为该过程依赖于该列。
SQL>ALTERTABLEtest_tableMODIFYcol1VARCHAR2(20);
Tablealtered.
SQL>SELECTOBJECT_NAME,STATUSFROMUSER_OBJECTSWHEREOBJECT_NAME=‘TEST_PROC’;
OBJECT_NAMESTATUS
TEST_PROCINVALID
SQL>ALTERTABLEtest_tableMODIFYcol1VARCHAR2(20);
Tablealtered.
SQL>SELECTOBJECT_NAME,STATUSFROMUSER_OBJECTSWHEREOBJECT_NAME=‘TEST_PROC’;
OBJECT_NAMESTATUS
TEST_PROCINVALID
运行或重新编译该过程使它重新有效,如下面的示例中所示:
SQL>EXECUTEtest_proc
PL/SQLproceduresuccessfullycompleted.
SQL>SELECTOBJECT_NAME,STATUSFROMUSER_OBJECTSWHEREOBJECT_NAME=‘TEST_PROC’;
OBJECT_NAMESTATUS
TEST_PROCVALID
SQL>EXECUTEtest_proc
PL/SQLproceduresuccessfullycompleted.
SQL>SELECTOBJECT_NAME,STATUSFROMUSER_OBJECTSWHEREOBJECT_NAME=‘TEST_PROC’;
OBJECT_NAMESTATUS
TEST_PROCVALID
SYS和SYSTEM模式
所有Oracle数据库都包括默认管理帐户。管理帐户享有很高的特权,仅用于授权的数据库管理员执行如启停数据库、管理内存和存储、创建和管理数据库用户等任务。
SYS管理帐户在创建数据库时自动创建。此帐户可以执行所有的数据库管理功能。SYS模式存储数据字典基表和视图。这些基表和视图对数据库的运行至关重要。SYS模式中的表只由数据库操作,绝不能被任何用户修改。
在创建数据库时,也会自动创建SYSTEM帐户。SYSTEM模式存储其它一些用于显示管理信息的表和视图,以及用于各种数据库选项和工具的内部表和视图。永远不要使用SYSTEM模式来存储非管理性用户的表。
示例模式
Oracle数据库可能包含示例模式,这是一组相互关联的模式,在Oracle文档和Oracle教学材料中用于演示常见数据库任务。hr模式是一个包含有关雇员、部门和位置、工作历史等信息的示例模式。
图2-3是hr模式中表的一个实体关系图。在本手册中的大多数示例都使用此模式中的对象。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




