《Oracle Concept》第一章-1

本人花费半年的时间总结的《Java面试指南》已拿腾讯等大厂offer,已开源在github ,欢迎star!

本文GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了6个月总结的一线大厂Java面试总结,本人已拿大厂offer,欢迎star

原文链接:blog.ouyangsihai.cn >> 《Oracle Concept》第一章-1

预计阅读时间:12分钟

背景

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

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

《》

《》

《》

《》

《》

《》

《》

《》

《》

下面,我们将继续学习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,数据字典和动态性能视图
  • 第三章,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对象,包括以下:

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

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

    第十二章《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的更多介绍。

    《Oracle Concept》第一章-1

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

    《Oracle Concept》第一章-1
    本人花费半年的时间总结的《Java面试指南》已拿腾讯等大厂offer,已开源在github ,欢迎star!

    本文GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了6个月总结的一线大厂Java面试总结,本人已拿大厂offer,欢迎star

    原文链接:blog.ouyangsihai.cn >> 《Oracle Concept》第一章-1


     上一篇
    碰见.swp文件咋办? 碰见.swp文件咋办?
    预计阅读时间:6分钟 《》编写过程中,曾碰见一个问题,算是个小知识点,模拟操作如下。 一个session用vi打开文件,但不退出,或者直接关闭session,造成异常退出的场景, vi test.txt 另一个session打开相同的文
    下一篇 
    MySql和Sql Server语法和关键字区别 MySql和Sql Server语法和关键字区别
    MySQL支持enum,和set类型,SQL Server不支持 MySQL不支持nchar,nvarchar,ntext类型  MySQL的递增语句是AUTO_INCREMENT,而MS SQL是identity(1,1)