I. 绪论

1.1 数据库系统概述

1.11 数据库的 4 个基本概念

数据(data)

数据是数据库中存储的基本对象。
定义:描述事物的符号记录称为数据。可以是数字、文本(text)、图形(graph)、图像(image)、音频(audio)、视频(video)等。
数据的解释是指对数据含义的说明,数据的含义称为数据的语义,数据与其语义是不可分的
记录是计算机中表示和存储数据的一种格式或一种方法。

数据库(DataBase,DB)

数据库是长期存储在计算机内、有组织的、可共享的大量数据的集合。数据库中的数据按一定的数据模型组织、描述和储存,具有较小的冗余度(redundancy)、较高的数据独立性(data independency)和易扩展性(scalability),并可为各种用户共享。

数据库数据具有永久存储、有组织和可共享三个基本特点。

数据库中的数据存储在若干个操作系统文件中。

每个文件中即存储了关系中的数据又存储了关系的结构,用户不能对文件直接操作,必须通过DBMS。

数据库是以一定的组织方式将相关数据组织在一起存储在磁盘上所形成的、能为多个用户共享的、与应用程序彼此独立的一组相互关联的数据的集合。

数据库管理系统(DataBase Management System, DBMS)

数据库管理系统是位于用户与操作系统之间的一层数据管理软件。数据库管理系统和操作系统一样是计算机的基础软件,也是一个大型复杂的软件系统。它的主要功能包括以下几个方面:

  1. 数据定义功能
    数据库管理系统提供数据定义语言(Data Definition Language,DDL),用户通过它可以方便的对数据库中的数据对象的组成和结构进行定义。

  2. 数据组织、存储和管理
    数据库管理系统要分类组织、存储和管理各种数据,包括数据字典、用户数据、数据的存取路径等。要确定以何种文件结构和存取方式在存储级上组织这些数据,如何实现数据之间的联系。数据组织和存储的基本目标是提高存储空间利用率和方便存取,提供多种存取方法(如索引查找、hash查找、顺序查找等)来提高存取效率。

  3. 数据操纵功能
    数据库管理系统提供数据操纵语言(Data Manipulation Language,DML),用户可以使用它操纵数据,实现对数据库的基本操作,如查询、插入、删除和修改等。

  4. 数据库的事务管理和运行管理
    数据库在建立、运用和维护时由数据库管理系统统一管理和控制,以保证事务的正确运行,保证数据的安全性、完整性、多用户对数据的并发使用及发生故障后的系统修复。

  5. 数据库的建立和维护功能
    数据库的建立和维护功能包括数据库初始数据的输入、转换功能,数据库的转储恢复功能,数据库的重组织功能和性能监视、分析功能等。这些功能通常是由一些实用程序或管理工具完成的。

  6. 其他功能
    其他功能包括数据库管理系统与网络中其他软件系统的通信功能,一个数据库管理系统与另一个数据库管理系统或文件系统的数据转换功能,异构数据库之间的互访和互操作功能。

DBMS 是用户与数据库交互的桥梁,是数据库系统的核心。

DBMS 在操作系统的支持下工作

DBMS 支持其上的应用开发工具

数据库系统(DataBase System,DBS)

数据库系统是由数据库、数据库管理系统(及其应用开发工具)、应用程序和数据库管理员(DataBase Administrator,DBA)组成的存储、管理、处理和维护数据的系统。

1.12 数据管理技术的产生和发展

数据库技术是应数据管理任务的需要而产生的。

数据管理是指对数据进行分类、组织、编码、存储、检索和维护,它是数据处理的中心问题。

数据的处理是指对各种数据进行收集、存储、加工和传播的一系列活动的总和。

在应用需求的推动下,在计算机硬件、软件发展的基础上,数据管理技术经历了人工管理、文件系统、数据库系统三个阶段。

  1. 人工管理阶段
    (1)数据不保存
    (2)应用程序管理数据
    (3)数据不共享
    (4)数据不具有独立性

  2. 文件系统阶段
    (1)数据可以长期保存
    (2)由文件系统管理数据

优点:实现了记录内的结构性
缺点:i.数据共享性差,冗余度大 ii.数据独立性差

文件系统仍然是一个不具有弹性的无整体结构的数据集合,即文件之间是孤立的,不能反映现实世界事物之间的内在联系。

文件系统管理的文件是流式文件,或者说只是一些字节流。

  1. 数据库系统阶段
    从文件系统到数据库系统标志着数据管理技术的飞跃

1.13 数据库系统的特点

  1. 数据结构化
    数据库系统实现整体数据的结构化,这是数据库的主要特征之一,也是数据库系统与文件系统的本质区别。
    所谓“整体”结构化是指数据库中的数据不再仅仅针对某一个应用,而是面向整个组织或企业;不仅数据内部是结构化的,而且整体是结构化的,数据之间是具有联系的。

  2. 数据的共享性高,冗余度低且易扩充
    数据共享可以大大减少数据冗余,节约存储空间。数据共享还能够避免数据之间的不相容性与不一致性。

由于数据面向整个系统,是有结构的数据,不仅可以被多个应用共享使用,而且容易增加新的应用,这就使得数据库系统弹性大,易于扩充。
数据的不一致性是指统一数据不同副本的值不一样。

  1. 数据独立性高
    数据独立性包括数据的物理独立性和逻辑独立性。
    物理独立性是指用户的应用程序与数据库中数据的物理存储是相互独立的。
    逻辑独立性是指用户的应用程序与数据库的逻辑结构是相互独立的。

  2. 数据由数据库管理系统统一管理和控制
    数据库管理系统提供数据控制功能

(1)数据的安全性(security)保护
数据的安全性是指保护数据以防止不合法使用造成的数据泄密和破坏。
(2)数据的完整性(integrity)检查
数据的完整性是指数据的正确性、有效性和相容性。完整性检查将数据控制在有效的范围内,并保证数据之间满足一定的关系。
(3)并发(concurrency)控制
对多用户的并发操作加以控制和协调
(4)数据库恢复(recovery)
将数据库从错误状态恢复到某一已知的正确状态(亦称为完整状态或一致状态)。

综上,数据库是长期存储在计算机内有组织、大量、共享的数据集合。它可以供各种用户共享,具有最小冗余度和较高的数据独立性。数据库管理系统在数据库建立、运用和维护时进行并发控制,以保证数据的完整性和安全性,并在多用户同时使用数据库时进行并发控制,在发生故障后对数据库进行恢复。
数据库系统的出现使信息系统从以加工数据的程序为中心转向围绕共享的数据库为中心的新阶段。

1.2 数据模型

模型是对现实世界中某个对象特征的模拟和抽象。
数据模型(data model)是对现实世界数据特征的抽象。是用来描述数据、组织数据和对数据进行操作的。
数据模型是数据库系统的核心和基础。

1.2.1 两类数据模型

数据模型应满足三方面要求:一是能比较真实地模拟现实世界,二是容易为人所理解,三是便于在计算机上实现。
根据模型应用的不同目的,可以将这些模型划分为两大类,它们分别属于两个不同的层次。第一类是概念模型,第二类是逻辑模型和物理模型。
第一类概念模型(conceptual model),也称信息模型,它是按用户的观点来对数据和信息建模,主要用于数据库设计。
第二类中的逻辑模型,它是按计算机系统的观点对数据建模,主要用于数据库管理系统的实现。
第二类中的物理模型是对数据最低层的抽象,它描述数据在系统内部的表示方式和存取方法,或在磁盘或磁带上的存储方式和存取方法,是面向计算机系统的。

为了把现实世界中的具体事物抽象、组织为某一数据库管理系统支持的数据模型,人们常常首先将现实世界抽象为信息世界,然后将信息世界转换为机器世界。

1.2.2 概念模型

概念模型实际上是现实世界到机器世界的一个中间层次。

概念模型用于信息世界的建模,是现实世界到信息世界的第一层抽象,是数据库设计人员进行数据库设计的有力工具,也是数据库设计人员和用户之间进行交流的语言。

  1. 信息世界中的基本概念
    (1)实体(entity)
    客观存在并可相互区别的事物称为实体。
    (2)属性(attribute)
    实体所具有的某一特性称为属性。
    (3)码(key)
    唯一标识实体的属性集称为码
    (4)实体型(entity type)
    具有相同属性的实体必然具有共同的特征和性质。用实体名及其属性名集合来抽象和刻画同类实体,称为实体型。
    (5)实体集(entity set)
    同一类型实体的集合称为实体集。
    (6)联系(relationship)
    实体内部的联系通常是指组成实体的各属性之间的联系,实体之间的联系通常是指不同实体之间的联系。
    实体之间的联系有一对一、一对多和多对多等多种类型。
    (7)域(domain)
    属性的取值范围。

  2. 概念模型的一种表示方法:实体-联系方法
    该方法用 E-R 图来描述现实世界的概念模型,E-R 方法也称为 E-R 模型。

1.2.3 数据模型的组成要素

数据模型是严格定义的一组概念的集合。这些概念精确地描述了系统的静态特性、动态特性和完整性约束条件(integrity constraints)。
数据模型通常由数据结构、数据操作和数据的完整性约束条件三部分组成

  1. 数据结构
    数据结构描述数据库的组成对象以及对象之间的联系。
    数据结构是刻画一个数据模型性质最重要的方面。通常按照其数据结构的类型来命名数据模型。
    数据结构是所描述的对象类型的集合,是对系统静态特性的描述。

  2. 数据操作
    数据操作是指对数据库中各种对象(型)的实例(值)允许执行的操作的集合,包括操作及有关的操作规则。

数据库主要有查询和更新(包括插入、删除、修改)两大类操作。数据模型必须定义这些操作的确切含义、操作符号、操作规则(如优先级)以及实现操作的语言
数据操作是对系统动态特性的描述。

  1. 数据的完整性约束条件
    数据的完整性约束条件是一组完整性规则。
    完整性规则是给定的数据模型中数据及其联系所具有的制约和依存规则,用以限定符合数据模型的数据库状态以及状态的变化,以保证数据的正确、有效和相容。

数据模型应该反映和规定其必须遵守的基本的和通用的完整性约束条件。

数据模型还应该提供定义完整性约束条件的机制,以反映具体应用所涉及的数据必须遵守的特定的语义约束条件。

1.2.4 常用的数据模型

数据库领域中主要的逻辑数据模型有:

  • 层次模型(hierarchical model)
  • 网状模型(network model)
  • 关系模型(relational model)
  • 面向对象数据模型(object oriented data model)
  • 对象关系数据模型(object relational data model)
  • 半结构化数据模型(semistructure data model)

其中层次模型和网状模型统称为格式化模型。
在格式化模型中实体用记录表示,实体的属性对应记录的数据项(或字段)。实体之间的联系在格式化模型中转换成记录之间的两两联系。
在格式化模型中数据结构的单位是基本层次联系。
基本层次联系是指两个记录以及它们之间的一对多(包括一对一)的联系。

1.2.5 层次模型

层次模型用树形结构来表示各类实体以及实体间的联系。

  1. 层次模型的数据结构
    在数据库中定义满足下面两个条件的基本层次联系的集合为层次模型:
    (1)有且只有一个结点没有双亲结点,这个结点称为根节点
    (2)根以外的其他结点有且只有一个双亲结点

层次模型的一个基本的特点是,任何一个给定的记录值只能按其层次路径查看,没有一个子女记录值能够脱离双亲记录值而独立存在。

  1. 层次模型的数据操纵与完整性约束
    进行插入操作时,如果没有相应的双亲结点值就不能插入它的子女结点值。
    进行删除操作时,如果删除双亲结点值,则相应的子女结点值也将被同时删除。

  2. 层次模型的优缺点
    优点:
    (1)层次模型的数据结构比较简单清晰
    (2)层次数据库的查询效率高(层次数据库的性能优于关系数据库,不低于网状数据库)
    (3)层次数据模型提供了良好的完整性支持
    缺点:
    (1)现实世界中的很多联系是非层次性的,如结点之间具有多对多联系,不适合用层次模型表示
    (2)如果一个结点具有多个双亲结点等,用层次模型表示这类联系只能通过引入冗余(易产生不一致性)数据或创建非自然的数据结构(引入虚拟结点)来解决,对插入和删除操作的限制比较多,因此应用程序的编写比较复杂。
    (3)查询子女结点必须通过双亲结点
    (4)由于结构严密,层次命令趋于程序化

1.2.6 网状模型

网状数据模型的典型代表是DBTG(Data Base Task Group,DBTG)系统,亦称CODASYL(Conference On Data System Language,CODASYL)系统。

  1. 网状模型的数据结构
    在数据库中,把满足以下两个条件的基本层次联系集合称为网状模型:
    (1)允许一个以上的结点无双亲
    (2)一个结点可以有多于一个的双亲

允许两个结点之间有多种联系(称之为复合联系),可以更直接地去描述现实世界。层次模型实际上是网状模型的一个特例。
层次模型中子女结点与双亲结点的联系是唯一的,而在网状模型中这种联系可以不唯一。因此要为每个联系命名,并指出与该联系有关的双亲记录和子女记录。

  1. 网状模型的数据操纵与完整性约束

  2. 网状模型的优缺点
    优点:
    (1)能够更改为直接地描述现实世界,如一个结点可以有多个双亲,结点之间可以有多种联系
    (2)具有良好的性能,存取效率较高
    缺点:
    (1)结构比较复杂
    (2)网状模型 DDL、DML 复杂,并且要嵌入某一种高级语言(如COBOL、C)中
    (3)由于记录之间的联系是通过存取路径实现的,应用程序在访问数据时必须选择适当的存取路径

1.2.7 关系模型

  1. 关系模型的数据结构
    术语:
  • 关系(relation):一个关系对应通常说的一张表
  • 元组(tuple):表中的一行即为一个元组
  • 属性(attribute):表中的一列即为一个属性,给每一个属性起一个名称即属性名
  • 码(key):也成为码键。表中的某个属性组,可以唯一确定一个元组
  • 域(domain):域是一组具有相同数据类型的值的集合。属性的取值范围来自某个域
  • 分量:元组中的一个属性值
  • 关系模式:对关系的描述,一般表示为关系名(属性1,属性2,…,属性n)

关系模型要求关系必须是规范化的,即要求关系必须满足一定的规范条件,这些规范条件中最基本的一条就是,关系的每一个分量必须是一个不可分的数据项

  1. 关系模型的数据操纵与完整性约束
    关系的完整性约束条件包括三大类:实体完整性、参照完整性和用户定义的完整性。

  2. 关系模型的优缺点
    优点:
    (1)关系模型与格式化模型不同,它是建立在严格的数学概念的基础上
    (2)关系模型的概念单一。无论是实体还是实体之间的联系都用关系来表示,对数据的检索和更新也是关系(即表)
    (3)关系模型的存取路径对用户透明,从而具有更高的数据独立性、更好的安全保密性,也简化了程序员的工作和数据库开发建立的工作
    缺点:
    (1)由于存取路径对用户是隐蔽的,查询效率往往不如格式化数据模型
    (2)开发数据库管理系统的难度较大

1.3 数据库系统的结构

从数据库应用开发人员角度看,数据库系统通常采用三级模式结构,这是数据库系统内部的系统结构。

从数据库最终用户角度看,数据库系统的结构分为单用户结构、主从式结构、分布式结构、客户-服务器、浏览器-应用服务器/数据库服务器多层结构等,这是数据库系统外部的体系结构。

1.3.1 数据库系统模式的概念

在数据模型中有“型”(type)和“值”(value)的概念。

型是指对某一类数据的结构和属性的说明。

值是型的一个具体赋值。

模式(schema)是数据库中全体数据的逻辑结构和特征的描述,仅仅涉及型的描述,不涉及具体的值。

模式的一个具体值称为模式的一个实例(instance)。

同一个模式可以有很多实例。

模式是相对稳定的,而实例是相对变动的,因为数据库中的数据是在不断更新的。模式反映的是数据的结构及其联系,而实例反映的是数据库某一时刻的状态。

1.3.2 数据库系统的三级模式结构

数据库系统的三级模式结构是指数据库是由外模式、模式和内模式三级构成。

  1. 模式(schema)

模式也称逻辑模式,是数据库中全体数据的逻辑结构和特称的描述,是所有用户的共公共数据视图。

是数据库系统模式结构的中间层,既不涉及数据的物理存储细节和硬件环境,由于具体的应用程序、所使用的应用开发工具及高级程序设计语言无关。

模式实际上是数据库数据在逻辑级上的视图。

一个数据库只有一个模式。数据库模式以某一种数据模型为基础,统一综合地考虑了所有用户的需求,并将这些需求有机的结合成一个逻辑整体。

数据库管理系统提供模式数据定义语言(模式 DDL)来严格地定义模式。

  1. 外模式(external schema)

外模式也称子模式(subschema)或用户模式,它是数据库用户能够看见和使用的局部数据的逻辑结构和特征的描述,是数据库用户的数据视图,是与某一应用有关的数据的逻辑表示。

外模式通常是模式的子集。一个数据库可以有多个外模式。

外模式是保证数据库安全性的一个有力措施。每个用户只能看见和访问所对应的外模式中的数据,数据库中的其余数据是不可见的。

数据库管理系统提供外模式数据定义语言(外模式 DDL)来严格地定义外模式。

  1. 内模式(internal schema)

内模式也称存储模式(storage schema),一个数据库只有一个内模式。它是数据物理结构和存储方式的描述,是数据在数据库内部的组织方式。

1.3.3 数据库的二级映像功能与数据独立性

数据库系统的三级模式是数据的三个抽象级别,它把数据的具体组织留给数据库管理系统管理,使用户能逻辑地、抽象地处理数据,而不必关心数据在计算机中的具体表示方式与存储方式。

为了能够在系统内部实现这三个抽象层次的联系和转换,数据库管理系统在这三级模式之间提供了两层映像:外模式/模式映像和模式/内模式映像。

正是这两层映像保证了数据库系统中的数据能够具有较高的逻辑独立性和物理独立性。

  1. 外模式/模式映像

    • 模式描述的是数据的全局逻辑结构,外模式描述的是数据的局部逻辑结构。对应于同一个模式可以有任意多个外模式。对于每一个外模式,数据库系统都有一个外模式/模式映像,它定义了该外模式与模式之间的对应关系。这些映像定义通常包含在各自外模式的描述中。
    • 当模式改变时,由数据管理员对各个外模式/模式映像作相应改变,可以使外模式保持不变。
    • 应用程序是依据数据的外模式编写的,从而应用程序不必修改,保证了数据与程序的逻辑独立性,简称数据的逻辑独立性。
  2. 模式/内模式映像

    • 数据库中只有一个模式,也只有一个内模式,所以模式/内模式映像是唯一的,它定义了数据全局逻辑结构与存储结构之间的对应关系。
    • 当数据库的存储结构改变时,由数据库管理员对模式/内模式映像作相应改变,可以是模式保持不变,从而应用程序也不比改变。保证了数据与程序的物理独立性,简称数据的物理独立性。

数据与程序之间的独立性使的数据的定义和描述可以从应用程序中分离出去。

由于数据的存取由数据库管理系统管理,从而简化而应用程序的编制,大大减少了应用程序的维护和修改。

1.4 数据库系统的组成

  1. 硬件平台及数据库
    (1)足够大的内存
    (2)足够大的磁盘或磁盘阵列等设备
    (3)要求系统有较高的通道能力

  2. 软件
    (1)数据库管理系统
    (2)支持数据库管理系统运行的操作系统
    (3)具有与数据库接口的高级语言及编译系统
    (4)以数据库管理系统为核心的应用开发程序
    (5)为特定应用环境开发的数据库应用系统

  3. 人员
    (1)数据库管理员(DataBase Administrator,DBA)
    职责:①决定数据库中的信息内容和结构。②决定数据库的存储结构和存取策略。③定义数据的安全性要求和完整性约束条件。④监控数据库的使用和运行。⑤数据库的改进和重组、重构。

(2)系统分析员和数据库设计人员
系统分析员负责应用系统的需求分析和规范说明,要和用户及数据库管理员相结合,确定系统的硬件软件配置,并参与数据库系统的概要设计。
数据库设计人员负责数据库中数据的确定及数据库各级模式的设计。数据库设计人员必须参加用户需求调查和系统分析,然后进行数据库设计。在很多情况下,数据库设计人员就由数据库管理员担任。

(3)应用程序员
应用程序员负责设计和编写应用程序的程序模块,并进行调试和安装。

(4)用户
最后总用户可以分为三类:①偶然用户。②简单用户。③复杂用户。

II. 关系数据库

关系数据库应用数学方法来处理数据库中的数据。

2.1 关系数据结构及形式化定义

2.1.1 关系

关系:单一的数据结构关系

关系模型中数据的逻辑结构:二维表

现实世界的实体以及实体间的各种联系均用单一的结构类型,即关系来表示

  1. 域(domain)

域是一组具有相同数据类型的值的集合

  1. 笛卡尔积(cartensian product)

笛卡尔积是域上的一种集合运算

一个域允许的不同取值个数称为这个域的基数(cardinal number)

  1. 关系(relation)

(1)关系的表示

关系也是一个二维表,表的每行对应一个元组,表的每列对应一个域。

(2)属性

为了加以区分,必须对每列起一个名字,称为属性(attribute)

n 目关系必有 n 个属性

(3)码

候选码(candidate key)

  • 若关系中的某一属性组的值能唯一地标识一个元组,而其子集不能,则称该属性为候选码。最简单的情况下,候选码只包含一个属性。

全码(all-key)

  • 在最极端的情况下,关系模式的所有属性是这个关系模式的候选码。

主码(prime key)

主属性(prime attribute)

候选码的诸属性

  • 不包含在任何候选码中的属性称为非主属性(non-prime attribute)或非码属性(non-key attribute)

(7)三类关系

基本关系(基本表或基表)

  • 实际存在的表,是实际存储数据的逻辑表示

查询表

  • 查询结果对应的表

视图表

  • 由基本表或其他视图表导出的表,是虚表,不对应实际存储的数据

(8)基本关系的性质

列是同质的,即每一列中的分量是同一类型的数据,来自同一个域

不同的列可以出自同一个域

称其中的每一列为一个属性

不用的属性要给予不同的属性名

列的顺序无所谓,即列的次序可以任意交换

任意两个元组的候选码不能取相同的值

行的顺序无所谓,即行的次序可以任意交换

分量必须取原子值,即每一个分量都必须是不可分的数据项

关系模型要求关系必须是规范化(normalization)的,即要求关系必须满足一定的规范条件。这些规范条件中最基本的一条就是,关系的每一个分量必须是一个不可分的数据项。规范化的关系简称为范式(Normal Form,NF)。

2.1.2 关系模式

  1. 关系模式
    • 关系模式是型,关系是值
    • 关系模式是对关系的描述
    • 关系是元组的集合
  2. 关系模式意义
    • 关系模式必须指出元组集合的结构
    • 关系模式应当刻画出完整性约束条件
  3. 关系模式与关系
    • 关系是关系模式在某一时刻的状态或内容
    • 关系模式是静态的、稳定的,而关系是动态地、随时间不断变化的

2.1.3 关系数据库

关系数据库的型也称为关系数据库模式,是对关系数据库的描述。关系数据库模式包括若干域的定义,以及在这些域上定义的若干关系模式。

关系数据库的值是这些关系模式在某一时刻对应的关系的集合,通常就称为关系数据库。

2.1.4 关系模型的结构

在关系数据库的物理组织中,

有的关系数据库管理系统中一个表对应一个操作系统文件,将物理数据组织交给操作系统完成

有的关系数据库管理系统从操作系统那里申请若干个大的文件,自己划分空间,组织表、索引等储存结构,并进行存储管理

2.2 关系操作

2.2.1 关系的基本操作

关系模型中常用的关系操作包括查询(query)操作和插入(insert)、删除(delete)、修改(update)操作两大部分。

查询操作又可以分为:选择(select)、投影(project)、连接(join)、除(divide)、并(union)、差(expect)、交(intersection)、笛卡尔积等。其中选择、投影、并、差、笛卡尔积是5种基本操作,其他操作可以用基本操作来定义和导出。

关系操作的特点是集合操作方式,即操作对象和结果都是集合。这种操作方式也称为一次一集合(set-at-a-time)的方式,非关系型数据模型的数据操作方式则为一次一记录(record-at-a-time)的方式。

2.2.2 关系数据语言的分类

关系代数(relational algebra)

  • 用对关系的运算来表达查询要求

关系演算(relational calculus)

  • 用谓词来表达查询要求

按谓词变元的基本对象分为:元组关系演算、域关系演算。

一个关系数据语言能够表示关系代数可以表示的查询,称为具有完备的表达能力,简称关系完备性。

结构化查询语言(Structured Query Language,SQL)

  • 介于关系代数和关系演算之间
  • 查询功能、数据定义和数据控制功能
  • 是集查询、数据定义语言、数据操纵语言和数据控制语言(Data Control Language,DCL)于一体的关系数据语言。
  • 是一种高度非过程化的语言,用户不必请求数据库管理员为其建立特殊的存取路径,存取路径的选择由关系数据库管理系统的优化机制来完成。

关系数据语言可以分为三类:

  • 关系代数语言(例如ISBL)
  • 关系演算语言
  • 元组关系演算语言(例如ALPHA、QUEL)

域关系演算语言(例如QBE)

  • 具有关系代数和关系演算双重特点的语言(例如 SQL)

2.3 关系的完整性

关系模型的完整性规则是对关系的某种约束条件。

关系模型中有三类完整性约束:实体完整性(entity integrity)、参照完整性(referential integrity)和用户定义的完整性(user-defined integrity)。其中实体完整性和参照完整性是关系模型必须满足的完整性约束条件,被称作是关系的两个不变性。

2.3.1 实体完整性

关系数据库中每个元组应该是可区分的、唯一的。

(1)实体完整性规则是针对基本关系而言的。一个基本表通常对应现实世界的一个实体集。
(2)现实世界中的实体是可区分的,即它们具有某种唯一性标识。
(3)关系模型中以主码作为唯一性标识
(4)主码中的属性即主属性不能取空值。

2.3.2 参照完整性

参照完整性规则就是定义外码与主码之间的引用规则。

若属性(或属性组) F 是基本关系 R 的外码,它与基本关系 S 的主码 $$K_s$$ 相对应(基本关系 R 和 S 不一定是不同的关系),则对于 R 中每个元组在F上的值必须:

  • 或者取空值(F的每个属性值均为空值)
  • 或者等于S中某个元组的主码值

2.3.3 用户定义的完整性

用户定义的完整性就是针对某一具体关系数据库的约束条件,它反映某一具体应用所涉及的数据必须满足的语义要求。

2.4 关系代数

关系代数是一种抽象的查询语言,它用对关系的运算来表达查询。

关系代数的运算对象是关系,运算结果亦为关系。关系代数用到的运算符包括两类:集合运算符和专门的关系运算符。

关系代数的运算按运算符的不同可分为传统的集合运算和专门的关系运算两类。其中,传统的集合运算将关系看成元组的集合,其运算是从行的角度来进行;专门的关系运算不仅涉及行,而且涉及列。

2.4.1 传统的集合运算

传统的集合运算是二目运算,包括并、交、差、笛卡尔积4种运算。

2.4.2 专门的关系运算

专门的关系运算包括选择、投影、连接、除运算等。

关系代数中,这些运算经有限次复合后形成的表达式称为关系代数表达式。

III. 关系数据库标准语言SQL

结构化查询语言(Structured Query Language,SQL)

  1. 数据定义(data definition)
  • 用来定义数据库的逻辑结构,包括定义表、视图和数据库及索引。
  1. 数据操纵(data manipulation)
  • 包括插入、修改和删除数据的操作。
  1. 数据查询(data query)

  2. 数据控制(data control)

  • 包括对数据的安全性控制、完整性规则的描述以及对事物的控制语句。

3.1 SQL 概述

3.1.1 SQL 的产生与发展

3.1.2 SQL 的特点

  1. 综合统一
  2. 高度非过程化
  3. 面向集合的操作方式
  4. 以同一种语法结构提供多种使用方式
    • 自含式(独立的)语言可以独立使用交互命令,适用于终端用户、应用程序员和DBA
    • 嵌入式语言使其嵌入在高级语言中使用,供应用程序员开发应用程序。
  5. 语言简洁,易学易用

3.1.3 SQL 的基本概念

SQL 支持数据库的三级模式结构,即外模式、模式和内模式。

与之对应的数据库对象是视图、基本表、索引。

外模式包括若干视图(view)和部分基本表(base table),数据库模式包括若干基本表,内模式包括若干存储文件(stored table)。

用户可以用 SQL 对基本表和视图进行查询或其他操作,基本表和视图,都是关系。

基本表是本身独立存在的表,在关系数据库管理系统中的一个关系就对应一个基本表。一个或多个基本表对应一个存储文件,一个表可以带若干索引,索引也存放在存储文件中

存储文件的逻辑结构组成了关系数据库的内模式。存储文件的物理结构对最终用户是隐蔽的。

视图是从一个或几个基本表导出的表。它本身不独立存储在数据库中,即数据库中只存放视图的定义而不存放视图对应的数据。这些数据仍存放在导出视图的基本表中,因此视图是一个虚表。视图在概念上与基本表等同,用户可以在视图上再定义视图。

3.3 数据定义

SQL 标准不提供修改模式定义和修改视图定义的操作,如果想修改,必须先删除再重建。

一个关系数据库管理系统的实例(instance)中可以建立多个数据库,一个数据库中可以建立多个模式,一个模式下通常包括多个表、视图和索引等数据库对象。

3.3.1 模式的定义与删除

  1. 定义模式
    • CREATE DATABASE/SCHEMA <模式名>AUTHORIZATION<用户名>
    • 可以在创建模式的同时在这个模式定义中创建基本表、视图,定义授权。
      • CREATE DATABASE/SCHEMA <模式名>AUTHORIZATION<用户名>[<表定义子句>|<视图定义子句>|<授权定义子句>]
  2. 删除模式
    • DROP DATABASE/SCHEMA <模式名><CASCADE | RESTRICT>
    • CASCADE级联,RESTRICT限制

3.3.2 基本表的定义、删除与修改

  1. 定义基本表

    • 创建了一个模式就建立了一个数据库的命名空间,一个框架。在这个空间中首先要定义的是该模式包含的数据库基本表。
    • 参照表和被参照表可以是同一个表
      1
      2
      3
      4
      CREATE TABLE<表名> (<列名><数据类型>[列级完整性约束条件]
      [,<列名><数据类型>[列级完整性约束条件]]
      ......
      [,<表级完整性约束条件>]);
  2. 数据类型

    • 关系模型中一个很重要的概念是域,每一个属性来自一个域,它的取值必须是域中的值。
    • 在SQL中域的概念用数据类型来实现,定义表的各个属性时需要指明其数据类型及长度。
  3. 模式与表

    • 每一个基本表都属于某一个模式,一个模式包含多个基本表。
    • 定义基本表时一般可以有三种方法
      • 在表名中明显地给出模式名
      • 在创建模式语句中同时创建表
      • 设置所属的模式,这样在创建表时表名中不必给出模式名
  4. 修改基本表

    • SQL语言用ALTER TABLE语句修改基本表
      1
      2
      3
      4
      5
      6
      ALTER TABLE <表名>
      [ADD [COLUMN] <新列名><数据类型> [完整性约束]]
      [ADD <表级完整性约束>]
      [DROP [COLUMN] <列名> [CASCADE | RESTRICT]]
      [DROP CONSTRAINT <完整性约束名> [RESTRICT | CASCADE]]
      [ALTER COLUMN <列名><数据类型>];
  5. 删除基本表

    • DROP TABLE <表名> [RESTRICT | CASCADE];

3.3.3 索引的建立与删除

当表的数据量比较大时,查询操作会比较耗时。建立索引是加快查询速度的有效手段。

数据库索引有多种类型,常见索引包括顺序文件上的索引、B+ 树索引、散列(hash)索引、位图索引等。

索引虽然能够加速数据库查询,但需要占用一定的数据空间,当基本表更新时,索引要进行相应的维护,增加了数据库的负担。

关系数据库管理系统在执行查询时会自动选择合适的索引作为存取路径,用户不必也不能显式地选择索引。索引是关系数据库管理系统的内部实现技术,属于内模式的范畴。

  1. 建立索引
    • 次序可选ASC(升序)DESC(降序),默认值为ASC
    • UNIQUE表明此索引的每一个索引值只对应唯一的数据记录
    • CLUSTER表示要建立的索引是聚簇索引
      1
      2
      CREATE [UNIQUE] [CLUSTER] INDEX<索引名>
      ON <表名> (<列名> [<次序>][,<列名> [<次序>]]...);
  2. 修改索引
    • ALTER INDEX <旧索引名> RENAME TO <新索引名>
  3. 删除索引
    • 索引一经建立就由系统使用和维护,不需用户干预。
    • 建立索引是为了减少查询操作的时间,如果数据增删改频繁,系统就会花费许多时间来维护索引,从而降低了查询效率。
    • DROP INDEX <索引名>
    • 删除索引时,系统会同时从数据字典中删去有关该索引的描述。

3.3.4 数据字典

  • 数据字典是关系数据库管理系统内部的一组系统表,它记录了数据库中所有的定义信息,包括关系模式定义、视图定义、索引定义、完整性约束定义、各类用户对数据库的操作权限、统计信息等。
  • 关系数据库管理系统在执行SQL的数据定义语句时,实际上就是在更新数据字典表中的相应信息。
  • 在进行查询优化和查询处理时,数据字典中的信息是其重要依据。

3.4 数据查询

数据查询是数据库的核心操作。

3.4.1 单表查询

单表查询是指仅涉及一个表的查询。

  1. 选择表中的若干列
    • 选择表中的全部或部分列即关系代数的投影运算
  2. 选择表中的若干元组
  3. ORDER BY子句
    • 升序(ASC),降序(DESC),默认值为升序
  4. 聚集函数
  5. GROUP BY 子句

3.4.2 连接查询

若一个查询同时涉及两个以上的表,则称之为连接查询;
连接查询是关系数据库中最主要的查询。

  1. 等值与非等值连接查询
  2. 自身连接
  3. 外连接
  4. 多表连接

3.4.3 嵌套查询

在 SQL 语言中,一个 SELECT-FROM-WHERE 语句称为一个查询块/.

将一个查询块嵌套在另一个查询块的 WHERE 子句或 HAVING 短语的条件中的查询称为嵌套查询(nested query)

  • 子查询的 SELECT 语句不能使用 ORDER BY 子句,ORDER BY 子句只能对最终查询结果排序(除非子查询中用了 top 3 之类)
  1. 带有 IN 谓词的子查询
    • 子查询的查询条件不依赖于父查询,称为不相关子查询
    • 子查询的查询条件依赖于父查询,这类子查询称为相关子查询(correlated subquery),整个查询语句称为相关嵌套查询(correlated nested query)
  2. 带有比较运算符的子查询
  3. 带有 ANY (SOME) 或 ALL 谓词的子查询
  4. 带有 EXISTS 谓词的子查询
    • 带有 EXISTS 谓词的子查询不返回任何数据,只产生逻辑真值 true 或逻辑假值 false
    • 与 EXISTS 谓词相对应的是 NOT EXISTS 谓词

3.4.4 集合查询

SELECT 语句的查询结果是元组的集合,所以多个 SELECT 语句的结果可进行集合操作。

集合操作包括并操作 UNION ,交操作 INTERSECT ,差操作 EXCEPT

  • 参加集合操作的各查询结果的列数必须相同,对应项的数据类型也必须相同
  • 如果要保留重复元组则用 UNION ALL 操作符

3.4.5 基于派生表的查询

子查询不仅可以出现在 WHERE 子句中,还可以出现在 FROM 子句中,这时子查询生成的临时派生表(derived table)成为主查询的查询对象

3.4.6 SELECT 语句的一般格式

1
2
3
4
5
SELECT[ALL|DISTINCT]<目标列表达式>[别名][.<目标列表达式>[别名]]...
FROM<表名或视图名>[别名][,<表名或视图名>[别名]]...|(<SELECT语句>)[AS]<别名>
[WHERE<条件表达式>]
[GROUP BY<列名1>[HAVING<条件表达式>]]
[ORDER BY<列名2>[ASC|DESC]];
  1. 目标列表表达式的可选格式
  2. 聚集函数的一般格式
  3. WHERE 子句的条件表达式的可选格式

3.5 数据更新

数据更新操作有三种:

  • 向表中添加若干行数据
  • 修改表中的数据
  • 删除表中的若干行

3.5.1 插入数据

  1. 插入元组
  2. 插入子查询结果
    • 可以一次插入多个元组

3.5.2 修改数据

修改操作又称为更新操作,其语句的一般格式为:

1
2
3
UPDATE<表名>
SET<列名>=<表达式>[,<列名>=<表达式>]...
[WHERE<条件>];
  • 修改指定表中满足 WHERE 子句条件的元组
  • 其中 SET 子句给出表达式的值用于取代相应的属性列值
  • 如果省略 WHERE 子句,则表示要修改表中的所有元组
  1. 修改某一个元组的值
  2. 修改多个元组的值
  3. 带子查询的修改语句

3.5.3 删除数据

删除语句的一般格式为:

1
2
3
DELETE
FROM<表名>
[WHERE<条件>];
  • 从指定表中删除满足 WHERE 子句条件的所有元组
  • 如果省略 WHERE 子句,则表示删除表中全部元组,但表的定义仍在字典中
  • DELETE 语句删除的是表中的数据,而不是关于表的定义
  1. 删除某一个元组的值
  2. 删除多个元组的值
  3. 带子查询的删除语句

3.6 空值的处理

  1. 空值的产生
  2. 空值的判断
    • IS NULLIS NOT NULL 来表示
  3. 空值的约束条件
    • 属性定义(或域定义)中有 NOT NULL 约束条件的不能取空值,加了 UNIQUE 限制的属性不能取空值,码属性不能取空值

3.7 视图

  • 视图是从一个或几个基本表(或视图)导出的表,是一个虚表
  • 数据库中只存放视图的定义,而不存放视图对应的数据,这些数据仍在原来的基本表中(无数据冗余)
  • 一旦基本表中的数据发生变化,从视图中查询出的数据也就随之改变了
  • 视图一经定义,就可以和基本表一样被查询、被删除;也可以在一个视图上再定义新的视图

3.7.1 定义视图

  1. 建立视图
    • 以下三种情况下,必须明确指定组成视图的所有列名
      • 某个目标列不是单纯的属性名,而是聚集函数或列表达式
      • 多表连接时选出了几个同名列作为视图的字段
      • 需要在视图中为某个列启用新的更合适的名字
  2. 删除视图
    • 视图删除后视图的定义将从数据字典中删除
      • 如果该视图上还导出了其他视图,则使用 CASCADE 级联删除语句把该视图和由它导出的所有视图一起删除
    • 基本表删除后,由该基本表导出的所有视图均无法使用了,但是视图的定义没有从字典中清除,删除这些视图定义需要显式地使用 DROP VIEW 语句

3.7.2 查询视图

定义视图并查询视图与基于派生表的查询是有区别的

  • 试图一旦定义,其定义将永久保存在数据字典中,之后的所有查询都可以直接引用该视图
  • 派生表只是在语句执行时临时定义,语句执行后该定义即被删除

3.7.3 更新视图

更新视图是指通过视图来插入(INSERT)、删除(DELETE)和修改(UPDATE)数据

  • 由于视图是不实际存储数据的虚表,因此对视图的更新最终要转换为对基本表的更新
    • 像查询视图那样,对视图的更新操作也是通过视图消解,转换为对基本表的更新操作
  • 不可更新视图和不允许更新视图是两个不同的概念

3.7.4 视图的作用

  1. 视图能够简化用户的操作
  2. 视图使用户能以多种角度看待同一数据
  3. 视图对重构数据库提供了一定程度的逻辑独立性
  4. 视图能够对机密数据提供安全保护
  5. 适当利用视图可以更清晰地表达查询

IV. 数据库安全性

数据库的数据保护主要包括数据的安全性和完整性。

4.1 数据库安全性概述

数据库的安全性是指保护数据库以防止不合法使用所造成的数据泄露、更改或破坏。

4.1.1 数据库的不安全因素

  1. 非授权用户对数据库的恶意存取和破坏
    • 用户身份鉴别、存取控制、视图
  2. 数据库中重要或敏感的数据被泄露
    • 强制存取控制、数据加密存储、加密传输、审计日志
  3. 安全环境的脆弱性
    • 建立了一套可信(trusted)计算机系统的概念和标准

4.1.2 安全标准简介

通用准则(Common Criteria, CC)项目

  • TCSEC
  • CTCPEC
  • FC
  • ITSEC
  • 99年被ISO采用为国际标准
  • 01年被我国采用为国家标准

CC 把对信息产品的安全要求分为安全功能要求和安全保证要求。

4.2 数据库安全性控制

主要包括用户身份鉴别、多层存取控制、审计、视图、数据加密等安全技术。

4.2.1 用户身份鉴别

用户身份鉴别是数据库管理系统提供的最外层安全保护措施。

  1. 静态口令鉴别
  2. 动态口令鉴别
  3. 生物特征鉴别
  4. 智能卡鉴别

4.2.2 存取控制

数据库安全最重要的一点就是确保只授权给有资格的用户访问数据库的权限,同时令所有未被授权的人员无法接近数据,这主要通过数据库系统的存取控制机制实现。

存取控制机制主要包括:

  1. 定义用户权限(,并将用户权限登记到数据字典中)
    • 用户对某一数据对象的操作权力称为权限
  2. 合法权限检查

定义用户权限和合法权限检查机制一起组成了数据库管理系统的存取控制子系统。

  • C2 级的数据库管理系统支持自主存取控制(Discretionary Access Control, DAC)
  • B1 级的数据库管理系统支持强制存取控制(Mandatory Access Control, MAC)

4.2.3 自主存取控制方法

  • 用户权限是由两个要素组成的:数据库对象和操作类型
  • 定义一个用户的存取权限就是要定义这个月用户可以在哪些数据对象上进行哪些类型的操作
  • 在数据库系统中,定义存取权限称为授权(authorization)
  • 在关系数据库系统中,存取控制的对象不仅有数据本身(基本表中的数据、属性列上的数据),还有数据库模式(包括数据库、基本表、视图和索引的创建等)

4.2.4 授权:授予与收回

  1. GRANT 语句向用户授予权限
  2. REVOKE 语句收回已经授予用户的权限
  3. 创建数据库模式的权限
    • GRANT 和 REVOKE 语句向用户授予或收回对数据的操作权限
    • 对创建数据库模式一类的数据库对象的授权则由数据库管理员在创建用户时实现

4.2.5 数据库角色

数据库角色是被命名的一组与数据库操作相关的权限,角色是权限的集合。

  1. 角色的创建
  2. 给角色授权
  3. 将一个角色授予其他的角色或用户
  4. 角色权限的收回

4.2.6 强制存取控制方法

4.3 视图机制

通过视图机制把要保密的数据对无权存取的用户隐藏起来,从而自动对数据提供一定程度的安全保护

  • 视图机制间接地实现支持存取谓词的用户权限定义

4.4 审计

按照 TDI/TCSEC 标准中安全策略的要求,审计(audit)功能是数据库管理系统达到C2以上安全级别必不可少的一项指标

  • 审计功能把用户对数据库的所有操作自动记录下来放入审计日志(audit log)中
  • 数据库安全审计系统提供了一种事后检查的安全机制
  1. 审计事件
  2. 审计功能
  3. AUDIT 语句和 NOAUDIT 语句
    • AUDIT 语句用来设置审计功能,NOAUDIT 语句则取消审计功能
    • 审计一般可分为用户级审计和系统级审计

4.5 数据加密

加密的基本思想是根据一定的算法将原始数据——明文(plain text)变换为不可直接识别的格式——密文(cipher text),从而使得不知道解密算法的人无法获知数据的内容。

数据加密主要包括:

  1. 存储加密
    • 提供透明和非透明两种存储方式
  2. 传输加密
    • 在客户/服务器结构中,链路加密和端到端加密

4.6 其他安全性保护

  • 推理控制(inference control)
    • 避免用户利用其能够访问的数据推知更高密级的数据
  • 隐蔽信道(covert channel)
  • 数据隐私(data privacy)保护
    • 控制不愿被他人知道或他人不便知道的个人数据的能力

V. 数据库完整性

数据库的完整性(integrity)是指数据的正确性(correctness)和相容性(compatability)

  • 数据的正确性是指数据是符合现实世界语义、反映当前实际状况的
  • 数据的相容性是指数据库同一对象在不同关系表中的数据是符合逻辑的

数据的完整性和安全性是两个既有联系又不尽相同的概念

  • 数据库的完整性是为了防止数据库中存在不符合语义的数据,也就是防止数据库中存在不正确的数据
    • 完整性检查和控制的防范对象是不合语义的、不正确的数据,防止它们进入数据库
  • 数据的安全性是保护数据库防止恶意破坏和非法存取
    • 安全性控制的防范对象是非法用户和非法操作,防止他们对数据库数据的非法存取

为维护数据库的完整性,数据库管理系统(DBMS)必须能够实现如下功能

  1. 提供完整性约束条件的机制
    • 完整性约束条件也称为完整性规则,是数据库中的数据必须满足的语义约束条件
    • 关系模型的实体完整性、参照完整性和用户定义的完整性(作为数据库模式的一部分存入数据字典中)
  2. 提供完整性检查的方法
    • DBMS 中检查数据是否满足完整性约束条件的机制称为完整性检查
  3. 进行违约处理
    • DBMS 若发现用户的操作违背了完整性约束条件将采取一定的动作,如拒绝(NO ACTION)执行该操作或级联(CASCADE)执行其他操作,进行违约处理以保证数据的完整性

关系数据库管理系统使得完整性控制成为其核心支持的功能,从而能够为所有用户和应用提供一致的数据库完整性。

5.1 实体完整性

5.1.1 定义实体完整性

关系模型的实体完整性在 CREATE TABLE 中用 PRIMARY KEY 定义

  • 对单属性构成的码有两种说明方法:
    • 定义为列级约束条件
    • 定义为表级约束条件
  • 对多个属性构成的码只有一种说明方法:
    • 定义为表级约束条件

5.1.2 实体完整性检查和违约处理

用 PRIMARY KEY 短语定义了关系的主码后,每当用户程序对基本表插入一条记录或对主码列进行更新操作时,关系 DBMS 将按照实体完整性规则自动进行检查

  • 检查主码是否唯一,如果不唯一则拒绝插入或修改
  • 检查主码的各个属性是否为空,只要有一个为空就拒绝插入或修改

检查记录中主码值是否唯一的一种方法是进行全表扫描,依次判断表中每一条记录的主码值与将插入记录的主码值(或修改的新主码值)是否相同

  • 全表扫描非常耗时
  • 为了避免对基本表进行全表扫描,关系 DBMS 一般都在主码上自动建立一个索引(如 B+ 树索引)

5.2 参照完整性

5.2.1 定义参照完整性

关系模型的参照完整性在 CREATE TABLE 中用 FOREIGN KEY 短语定义哪些列为外码,用 REFERENCES 短语指明这些外码参照哪些表的主码

  • 表级定义参照完整性

5.2.2 参照完整性检查和违约处理

参照完整性将两个表中相应元组联系起来了。因此,对被参照表和参照表进行增、删、改操作时有可能破坏参照完整性,必须进行检查以保证这两个表的相容性。

可能破坏参照完整性的情况及违约处理

被参照表 参照表 违约处理
可能破坏参照完整性 ←插入元组 拒绝
可能破坏参照完整性 ←修改外码值 拒绝
删除元组→ 可能破坏参照完整性 拒绝/级联删除/设置为空值
修改主码值→ 可能破坏参照完整性 拒绝/级联删除/设置为空值
  • 拒绝(NO ACTION)执行
    • 不允许该操作执行。该策略一般设置为默认策略
  • 级联(CASCADE)操作
    • 当删除或修改被参照表的一个元组导致与参照表的不一致时,删除或修改参照表中的所有导致不一致的元组
  • 设置为空值
    • 当删除或修改被参照表的一个元组时造成了不一致,则将参照表中的所有导致不一致的元组的对应属性设置为空值

外码能否接受空值的问题

  • 对于参照完整性,除了应该定义外码,还应该定义外码列是否允许空值

5.3 用户定义的完整性

用户定义的完整性就是针对某一具体应用的数据必须满足的语义要求。

5.3.1 属性上的约束条件

属性上约束条件的定义

在 CREATE TABLE 中定义属性的同时,可以根据应用要求定义属性上的约束条件,即属性限制

  • 列值非空(NOT NULL)
  • 列值唯一(UNIQUE)
  • 检查列值是否满足一个条件表达式(CHECK短语)

属性上约束条件的检查和违约处理

5.3.2 元组上的约束条件

元组上的约束条件定义

与属性上约束条件的定义类似,在 CREATE TABLE 语句中可以用 CHECK 短语定义元组上的约束条件,即元组级的限制;
同属性值限制相比,元组级的限制可以设置不同属性之间的取值的相互约束条件。

元组上约束条件的检查和违约处理

5.4 完整性约束命名子句

SQL 在 CREATE TABLE 语句中提供了完整性约束命名子句 CONSTRAINT ,通用来对完整性约束条件命名,从而可以灵活地增加、删除一个完整性约束条件。

完整性约束命名子句

  • CONSTRAINT <完整性约束条件名><完整性约束条件>
  • 完整性约束条件包括 NOT NULL、UNIQUE、PRIMARY KEY、FOREIGN KEY、CHECK 短语等

修改表中的完整性限制

  • 可以使用 ALTER TABLE 语句修改表中的完整性限制。

5.5 域中的完整性限制

5.6 断言

在 SQL 中可以使用数据定义语言中的 CREATE ASSERTION 语句,通过声明性断言(declarative assertions)来指定更具一般性的约束

  • 可以定义涉及多个表或聚集操作的比较复杂的完整性约束
  • 断言创建以后,任何对断言中所涉及关系的操作都会触发关系 DBMS 对断言的检查,任何使断言不为真值的操作都会被拒绝执行

创建断言的语句格式

  • CREATE ASSERTION <断言名> <CHECK 子句>
  • 每个断言都被赋予一个名字
  • CHECK 子句中的约束条件与WHERE子句的条件表达式类似

删除断言的语句格式

  • DROP ASSERTION <断言名>

5.7 触发器

触发器(trigger)是用户定义在关系表上的一类由事件驱动的特殊过程

  • 一旦定义,触发器将被保存在数据库服务器中
  • 任何用户对表的增、删、改操作均由服务器自动激活相应的触发器,在关系 DBMS 核心层进行集中的完整性控制

5.7.1 定义触发器

触发器又叫做事件-条件-动作(event-condition-action)规则

  • 当特定的系统事件发生时,对规则的条件进行检查,如果条件成立则执行规则中的动作,否则不执行该动作
  • 规则中的动作体可以很复杂,可以涉及其他表和其他数据库对象,通常是一段 SQL 存储过程
1
2
3
4
5
CREATE TRIGGER <触发器名>
{BEFORE|AFTER} <触发事件> ON <表名>
REFERENCING NEW|OLD ROW AS <变量>
FOR EACH {ROW|STATEMENT}
[WHEN <触发事件>] <触发动作体>
  1. 只有表的拥有者,即创建表的用户才可以在表上创建触发器,并且一个表上只能创建一定数量的触发器
  2. 触发器名
    • 触发器名可以包含模式名,也可以不包含模式名
    • 同一模式下,触发器名必须是唯一的,并且触发器名和表名必须在同一模式下
  3. 表名
    • 触发器只能定义在基本表上,不能定义在视图上
    • 当基本表的数据发生变化时,将激活定义在该表上相应触发事件的触发器,因此该表也称为触发器的目标表
  4. 触发事件
    • 触发事件可以是 INSERT、DELETE、UPDATE ,也可以是这几个事件的组合(如INSERT OR DELETE),还可以是 UPDATE OF <触发列, …>,即进一步指明修改哪些列时激活触发器
    • AFTER/BEFORE 是触发的时机。AFTER 表示在触发事件的操作执行之后激活触发器,BEFORE 表示在触发事件的操作执行之前激活触发器
  5. 触发器类型
    • 触发器按照所触发动作的间隔尺寸可以分为行级触发器(FOR EACH ROW)和语句级触发器(FOR EACH STATEMENT)
    • 语句级触发器触发动作体执行一次,行级触发器触发动作体执行(行数)次
  6. 触发条件
    • 触发器被激活时,只有当前触发条件为真时触发动作体才执行,否则触发动作体不执行
    • 如果省略 WHEN 触发条件,则触发动作体在触发器激活后立即执行
  7. 触发动作体
    • 触发动作体既可以是一个匿名 PL/SQL 过程块 (BEGIN…END),也可以是对已创建存储过程的调用
      • 如果是行级触发器,用户可以在过程体中使用 NEW 和 OLD 引用 UPDATE/INSERT 事件之后的新值和 UPDATE/DELETE 事件之前的旧值
      • 如果是语句级触发器,则不能在触发动作体中使用 NEW 或 OLD 进行引用
    • 如果触发动作体执行失败,激活触发器的事件就会终止执行,触发器的目标表或触发器可能影响的其他对象不会发生任何变化

5.7.2 激活触发器

触发器的执行是由触发事件激活,并由数据库服务器自动执行的。一个数据表上可能定义了多个触发器,如多个 BEFORE 触发器、多个 AFTER 触发器等,同一个表上的多个触发器激活时遵循如下执行顺序:

  • 执行该表上的 BEFORE 触发器
  • 激活触发器的 SQL 语句
  • 执行该表上的 AFTER 触发器

对于同一个表上的多个 BEFORE(AFTER) 触发器,遵循“谁先创建谁先执行”的原则,即按照触发器创建的时间先后顺序执行

  • 有些关系 DBMS 是按照触发器名称的字母排序顺序执行触发器

5.7.3 删除触发器

DROP TRIGGER <触发器名> ON <表名>
触发器必须是一个已经创建的触发器,并且只能由具有相应权限的用户删除