《Oracle Concept》第一章-1

>>强大,10k+点赞的 SpringBoot 后台管理系统竟然出了详细教程!
点击标题下「蓝色微信名」可快速关注

预计阅读时间:12分钟


背景

按照《Oracle Conecpt》的结构一起了解Oracle,这是从入门到精通的基础。


前言《Introduction to Oracle Database》的历史文章:

《Oracle Concept》前言介绍-7

《Oracle Concept》前言介绍-6

《Oracle Concept》前言介绍-5

《Oracle Concept》前言介绍-4

《Oracle Concept》前言介绍-3

《Oracle Concept》前言介绍-2

《Oracle Concept》前言介绍-1

《Oracle Conecpt》 - 目录结构

《Oracle Conecpt》 - 初步认识1


下面,我们将继续学习Part I《Oracle Relational Data Structures》。这部分主要介绍Oracle数据库基础的数据结构,包括数据完整性约束,以及元数据存储的结构,包含了五个章节,

  • 第二章,Tables and Table Clusters,表和表簇

  • 第三章,Indexes and Index-Organized Tables,索引和索引组织表

  • 第四章,Partitions, Views, and Other Schema Objects,分区、视图和其他的方案对象

  • 第五章,Data Integrity,数据完整性

  • 第六章,Data Dictionary and Dynamic Performance Views,数据字典和动态性能视图


本文主题:第二章《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中的对象。

《Oracle Concept》第一章-1

"Overview of Database Security"章节会了解更多关于用户和权限的内容。


schema对象类型

在一个关系型数据库中,最重要的schema对象就是表。一张表会用行来存储数据。


SQL语句可以创建和管理各种类型的schema对象,包括以下:

  • 索引:索引是一种包含表或表簇的索引键值项的schema对象,用他可以快速、直接地访问数据行。Oracle支持多种类型的索引。索引组织表是一张数据以索引结构存储的表。详见第三章“Indexes and Index-Organized Tables”。

  • 分区:分区是对大表和索引的分片。每个分区拥有自己的名称,也可以拥有自己的存储属性。详见第四章“Overview of Partitions”。

  • 视图:视图是一张或多张表,或者其他视图的个性化表示。可以理解为存储的查询语句。然而视图并不真正存储数据。详见第四章“Overview of Views”。

  • 序列:序列是一个用户创建的对象,可以被其他用户共享,用来生成一个整型数值。一种典型的应用,就是利用序列,来生成主键值。详见第四章“Overview of Sequences”。

  • 维度:维度定义了不同列集合的父子关系,其中一个列集合的所有列均来自于同一张表。维度通常用来分类数据,例如客户、产品和时间。详见第四章“Overview of Dimensions”。

  • 同义词:同义词是另一个schema对象的别名。因为同义词就是一个简单的别名,除了数据字典中的定义,不需要任何存储空间。详见第四章“Overview of Synonyms”。

  • 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的对象可以包含于多个表空间。每个对象的数据在物理上存储于一个或多个数据文件。


下表展示了表和索引段、表空间、以及数据文件的一种可能的配置。一张表的数据段横跨两个数据文件,但都属于同一个表空间。一个段不能横跨多个表空间。

《Oracle Concept》第一章-1

第十二章《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 Concept》第一章-1

《Oracle Database Sample Schemas》会有关于schema的更多介绍。

《Oracle Concept》第一章-1



如果您觉得本文有帮助,欢迎关注转发:bisal的个人杂货铺,

《Oracle Concept》第一章-1