预计阅读时间:12分钟
背景:
按照《Oracle Conecpt》的结构一起了解Oracle,这是从入门到精通的基础。
前言《Introduction to Oracle Database》的历史文章:
《》
《》
《》
《》
《》
《》
《》
《》
《》
下面,我们将继续学习Part I《Oracle Relational Data Structures》。这部分主要介绍Oracle数据库基础的数据结构,包括数据完整性约束,以及元数据存储的结构,包含了五个章节,
第三章,Indexes and Index-Organized Tables,索引和索引组织表
第五章,Data Integrity,数据完整性
本文主题:第二章《Tables and Table Clusters》 - Introduction to Schema Objects。
这一章主要讨论的是schema对象以及表,表是schema对象中最常用的类型。
schema对象介绍
数据库schema方案,是一个数据结构(也叫schema对象)的逻辑容器。比如表和索引,都是schema对象。可以使用SQL语句,来创建和管理schema对象。
数据库用户会有自己的登录密码,以及不同的数据库权限。每个用户拥有一个独立的schema,通常和用户名相同。schema包含了用户拥有的数据。例如,用户hr拥有名叫hr的schema,其中包含了诸如employees表的schema对象。在生产数据库中,schema用户通常代表一个数据库应用,而不是一个人。
在schema中,每种类型的schema对象都有唯一的名称。例如,hr.employes指向了hr这个schema中的employees表。下图描述了名叫hr的schema用户,以及hr这个schema中的对象。
“Overview of Database Security”章节会了解更多关于用户和权限的内容。
schema对象类型
在一个关系型数据库中,最重要的schema对象就是表。一张表会用行来存储数据。
SQL语句可以创建和管理各种类型的schema对象,包括以下:
PL/SQL子程序和包:PL/SQL是Oracle中SQL语句的扩展。PL/SQL子程序也叫PL/SQL块,可以包含一系列参数。PL/SQL包会聚类逻辑上相关的PL/SQL类型、变量和子程序。详见第八章“PL/SQL Subprograms"和“PL/SQL Packages”。
还有其他一些存储在数据库中,也能用SQL语句创建和控制,但是不包含在schema的对象类型,例如角色、上下文和目录对象。
《Oracle Database 2 Day DBA》和《Oracle Database Administrator’s Guide》可以了解如何管理schema对象。
《Oracle Database SQL Language Reference》会有更多关于schema对象和数据库对象的介绍。
schema对象存储
一些schema对象会在称做segment段的逻辑存储结构中保存数据。例如,一张非分区的堆表,或者索引,都会创建一个段。其他的schema对象,例如视图和序列,则只存储元数据。
Oracle会在表空间中逻辑上存储schema对象。schema和表空间之间,并没有任何联系。表空间可以包含不同schema的对象,一个schema的对象可以包含于多个表空间。每个对象的数据在物理上存储于一个或多个数据文件。
下表展示了表和索引段、表空间、以及数据文件的一种可能的配置。一张表的数据段横跨两个数据文件,但都属于同一个表空间。一个段不能横跨多个表空间。
第十二章《Logical Storage Structures》可以了解更多关于表空间和段的知识。
《Oracle Database 2 Day DBA》和《Oracle Database Administrator’s Guide》可以了解更多如何管理schema对象的存储。
schema对象依赖
一个schema对象引用了其他的对象,这会创建对象依赖。例如,一张视图可以包含引用了表或其他视图的查询,一个PL/SQL子程序可以调用其他的子程序。如果定义了对象A引用了对象B,那么对B来说,A是依赖对象,对A来说,B是被引用对象。
Oracle提供了自动机制确保一个依赖对象总会和被引用对象保持一致。当创建了依赖对象之后,数据库就会跟踪依赖对象和被引用对象的依赖关系。当被引用对象发生改变,有可能影响依赖对象,此时依赖对象就会标记为无效。例如,如果用户删除了一张表,基于这张删除表创建的视图就会失效。
如果被引用对象定义发生了改变,依赖对象变为可用之前,无效的依赖对象必须重新编译。当引用无效依赖对象的时候,会自动进行重新编译。
为了说明schema对象如何创建依赖关系,下面的脚本示例会创建一张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的状态显示有效:
SQL SELECT OBJECT_NAME, STATUS FROM USER_OBJECTS WHERE OBJECT_NAME = 'TEST_PROC';
OBJECT_NAME STATUS
----------- -------
TEST_PROC VALID
向test_table表增加一列col3,由于存储过程不依赖于该列,所以还是有效:
SQL ALTER TABLE test_table ADD col3 NUMBER;
Table altered.
SQL SELECT OBJECT_NAME, STATUS FROM USER_OBJECTS WHERE OBJECT_NAME = 'TEST_PROC';
OBJECT_NAME STATUS
----------- -------
TEST_PROC VALID
但是,要改变col1列的数据类型,由于test_proc依赖于这列, 所以就会失效:
SQL ALTER TABLE test_table MODIFY col1 VARCHAR2(20);
Table altered.
SQL SELECT OBJECT_NAME, STATUS FROM USER_OBJECTS WHERE OBJECT_NAME = 'TEST_PROC';
OBJECT_NAME STATUS
----------- -------
TEST_PROC INVALID
重新执行,或者重新编译存储过程,就会再次让其变为有效,如下所示:
SQL EXECUTE test_proc
PL/SQL procedure successfully completed.
SQL SELECT OBJECT_NAME, STATUS FROM USER_OBJECTS WHERE OBJECT_NAME = 'TEST_PROC';
OBJECT_NAME STATUS
----------- -------
TEST_PROC VALID
《Oracle Database Administrator’s Guide》和《Oracle Database Advanced Application Developer’s Guide》可以了解如何管理schema对象依赖。
SYS和SYSTEM方案schema
所有的Oralce数据库都会包含默认的管理账户。管理账户具有高级别权限,仅授权给DBA执行一些注入启停数据库,管理内存和存储,以及创建和管理数据库用户的操作。
当创建数据库的时候,会自动创建管理账户SYS。这个账户能执行所有的数据库管理工作。SYS方案会存储数据字典的基表和视图。这些基表和试图对于Oracle数据库的运行至关重要。在SYS方案中的表只能由数据库来控制,不能被任何用户修改。
创建数据库的时候,也会自动创建SYSTEM账户。SYSTEM会存储额外的展示管理信息的表和视图,以及一些Oracle数据库可选组件使用的内部表和视图。一定不要使用SYSTEM方案存储非管理员用户使用的数据。
《User Accounts》和《Connection with Administrator Privileges》、《Oracle Database 2 Day DBA》和《Oracle Database Administrator’s Guide》可以了解SYS、SYSTEM以及其他管理账户。
示例schema
一个Oracle数据库可能会包含示例schema,他是一组内部相连的schema集合,Oracle官方文档以及指导教材,可以使用示例schema完成一些基础的操作。hr这个schema就是一个示例的schema,他会包含employees、departments、locations、work histories等的信息。
下图就是hr的实体关系图示。《Concept》中大部分示例来自于hr这个schema。
《Oracle Database Sample Schemas》会有关于schema的更多介绍。
如果您觉得本文有帮助,欢迎关注转发:bisal的个人杂货铺,