导图社区 数据库系统概论
数据库系统概论(第5版)第1章-第11章期中期末复习
编辑于2022-03-12 09:36:17数据库系统概论
第一章 绪论
1.1 数据库系统概述
数据库技术
联机事务处理OLTP
联机分析处理OLAP
计算机辅助设计与制作CAD/CAM
计算机集成制造系统CIMS
电子政务、电子商务
1.1.1 数据库的4个基本概念
数据
定义
数据是数据库中存储的基本对象
描述事物的符号记录称为数据
数据的含义称为数据的语义,数据与其语义是不可分的
种类
数据库 DB
定义
数据库是长期存储在计算机内、有组织的、可共享的大量数据的集合
基本特征
数据按一定的数据模型组织、描述和储存
冗余度较小
数据独立性较高
易扩展
可为各种用户共享
数据库管理系统DBMS
定义
位于用户与操作系统之间的一层数据管理软件
系统软件
功能
数据
数据定义功能
数据组织、存储和管理
数据操纵功能
数据库
数据库的事务管理和运行管理
数据库的建立和维护功能
其他功能
数据库系统DBS
构成
数据库
数据库管理系统
应用程序
数据库管理员 DBA
1.1.2 数据管理技术的产生和发展
数据管理
数据处理的中心问题
对数据进行分类、组织、编码、存储、检索和维护
数据处理
对各种数据进行收集、存储、加工和传播的一系列活动的总和
数据管理技术的发展过程
人工管理阶段
背景
批处理
特点
数据不保存
应用程序管理数据
数据不共享,冗余度极大
数据不独立,完全依赖与程序
应用程序自己控制
文件系统阶段
背景
联机实时处理、批处理
特点
数据可以长期保存
由文件系统管理数据
共享性差,冗余度大
独立性差
数据的共享程度记录内有结构、整体无结构
应用程序自己控制
数据库系统阶段
背景
分布处理、联机实时处理、批处理
特点
共享性高,冗余度小
具有高度的物理独立性和一定的逻辑独立性
整体结构化,用数据模型描述
由数据库管理系统提供数据安全性、完整性、并发控制和恢复能力
数据管理三阶段的比较
数据的管理者
数据的共享程度
数据的独立性
数据的结构化
数据控制能力
从文件系统到数据库系统标志着数据管理技术的飞跃
1.1.3 数据库系统的特点
数据结构化
数据的整体结构化是数据库的主要特征之一,也是数据库系统与文件系统的本质区别
整体结构化
数据库中的数据不再仅仅针对某一个应用,而是面向全组织
不仅数据内部结构化,整体式结构化的,数据之间具有联系
数据记录可以变长
数据的最小存取单元是数据项
数据的共享性高,冗余度低且易扩充
可以被多个用户、多个应用共享使用
数据共享的好处
减少数据冗余,节约存储空间
避免数据之间的不相容与不一致
使数据库系统弹性大、易于扩充
数据独立性高
物理独立性
用户的应用程序与数据库中数据的物理存储是相互独立的
逻辑独立性
用户的应用程序与数据库的逻辑结构是相互独立的
数据由数据库管理系统统一管理和控制
数据的安全性保护
指保护数据以防止不合法使用造成的数据泄密和破坏
数据的完整性检查
指数据的正确性、有效性和相容性
并发控制
数据库恢复
数据库系统的出现是信息系统从已加工数据的程序为中心转向围绕共享的数据库为中心的新阶段
1.2 数据模型
数据模型
是对现实世界数据特征的抽象
数据库系统的核心和基础
1.2.1 两类数据模型
概念模型
逻辑模型和物理模型
逻辑模型
层次模型
网状模型
关系模型
面向对象数据模型
对象关系数据模型
半结构化数据模型
1.2.2 概念模型
信息世界中的基本概念
实体
人、事、物或抽象的概念
属性
实体所具有的某一特性
身高体重
码
唯一标识实体的属性集
实体型
用实体名及其属性名来抽象和刻画同类实体。
学生(学号 姓名 性别 成绩)
实体集
同一类型实体的集合
全体学生
联系
实体内部的联系
实体之间的联系
一对一、一对多、多对多
实体—联系方法 (E-R模型)
1.2.3 数据模型的组成要素
数据结构
描述数据库的组成对象以及对象之间的联系
对系统静态特性的描述
数据操作
数据操作是指对数据库中各种对象(型)和实例(值)允许执行的操作的集合,包括操作及有关的操作规则
类型
查询
更新(插入、删除、修改)
对系统动态特性的描述
数据的完整性约束条件
是一组完整性规则的集合
以限定符和数据模型的数据库状态以及状态的变化,以保证数据的正确、有效和相容
1.2.4 常用的数据模型
层次模型
数据结构
树形结构
特点
只能直接处理一对多的实体联系
完整性约束条件
优缺点
优点
数据结构比较简单清晰
查询效率高,性能优于关系模型,不低于网状模型
提供了良好的完整性支持
缺点
结点之间的多对多联系表示不自然
对插入和删除操作的限制多,应用程序的编写比较复杂
查询子女结点必须通过双亲结点
层次命令趋于程序化
网状模型
典型代表是DBTG系统(CODASYL系统)
数据结构
表示方法
实体型
属性
联系
操纵和完整性约束
优缺点
关系模型
数据结构
关系
一张表
元组
表中的一行
属性
表中的一列,给每个属性起一个名称即属性名
主码
表中某个属性组,它可以唯一确定一个元组
域
一组具有相同数据类型的值的集合
分量
元组中的一个属性值
关系模式
对关系的描述
关系名(属性1,属性2,……,属性n)
关系必须是规范化的,不允许表中还有表
数据操作
查询、插入、删除、更新
完整性约束条件
实体完整性
参照完整性
用户定义的完整性
优缺点
优点
概念单一
关系模型的存储路径对用户透明
缺点
查询效率较低
对象关系数据模型
半结构化数据模型
1.3 数据库系统的结构
数据库系统的结构
从数据库应用开发人员角度看
三级模式结构
数据库系统内部的系统结构
从数据库最终用户角度看,数据库系统的结构分为
单用户结构
主从式结构
分布式结构
客户-服务器
浏览器-应用服务器 / 数据库服务器多层结构
1.3.1 数据库系统模式的概念
“型” 和“值” 的概念
型是指对某一类数据的结构和属性的说明
值是型的一个具体赋值
模式
反映的是数据的结构及其联系
实例
反映的的是数据库某一时刻的状态
1.3.2 数据库系统的三级模式结构
模式(逻辑模式)
定义
模式也称逻辑模式,是数据库中全体数据的逻辑结构和特征的描述,是所有用户的公共数据视图。
一个数据库只有一个模式
模式的地位:是数据库系统模式结构的中间层
模式的定义
数据的逻辑结构(数据项的名字、类型、取值范围等)
数据之间的联系
数据有关的安全性、完整性要求
外模式(子模式或用户模式)
定义
数据库用户(包括应用程序员和最终用户)使用的局部数据的逻辑结构和特征的描述
数据库用户的数据视图,是与某一应用有关的数据的逻辑表示
外模式的地位:介于模式与应用之间
模式与外模式的关系:一对多
外模式与应用的关系:一对多
外模式的用途
外模式是保证数据库安全性的一个有力措施
内模式(存储模式)
定义
是数据物理结构和存储方式的描述
是数据在数据库内部的组织方式
一个数据库只有一个内模式
1.3.3 数据库的二级映像功能与数据独立性
外模式/模式映像
定义外模式与模式之间的对应关系
每一个外模式,数据库系统都有一个外模式/模式映象
映象定义通常包含在各自外模式的描述中
保证数据的逻辑独立性
当模式改变时,数据库管理员对外模式/模式映象作相应改变,使外模式保持不变
模式/内模式映像
定义了数据全局逻辑结构与存储结构之间的对应关系
数据库中模式/内模式映象是唯一的
该映象定义通常包含在模式描述中
保证数据的物理独立性
当数据库的存储结构改变了(例如选用了另一种存储结构),数据库管理员修改模式/内模式映象,使模式保持不变。
数据库模式
数据库的内模式
数据库的外模式
三层模式和两级映象
三级模式
模式
模式也称逻辑模式,是数据库中全体数据的逻辑结构和特征的描述,是所有用户的公共数据视图。
外模式
外模式是数据库用户能够看见和使用的局部数据的逻辑结构和特征的描述,是数据库用户的数据视图,是与某一应用有关的数据的逻辑表示
内模式
内模式是数据物理结构和存储方式的描述,是数据在数据库内部的组织方式
两级映象
外模式/模式映像
当模式改变时,数据库管理员对外模式/模式映象作相应改变,使外模式保持不变。应用程序是依据数据的外模式编写的,应用程序不必修改,保证了数据与程序的逻辑独立性,简称数据的逻辑独立性
模式/内模式映像
当数据库的存储结构改变时,由数据库管理员对模式/内模式映象相应改变,可以使模式保持不变,从而应用程序也不必改变。保证了数据与程序的物理独立性,简称数据的物理独立性。
1.4 数据库系统的组成
组成
数据库
数据库管理系统(及其开发工具)
应用程序
数据库管理员
硬件平台及数据库
软件
人员
数据库管理员(DBA)
职责
决定数据库中的信息内容和结构
决定数据库的存储结构和存取策略
定义数据的安全性要求和完整性约束条件
监控数据库的使用和运行
数据库的改进和重组、重构
系统分析员和数据库设计人员
应用程序员
用户
1.5 小结
数据库系统概述
数据库的基本概念
数据管理的发展过程
数据库系统的特点
数据模型
数据模型的三要素
三种主要数据库模型
数据库系统内部的系统结构
数据库系统三级模式结构
数据库系统两层映像系统结构
数据库系统的组成
第二章 关系数据库
2.1 关系数据结构及形式化定义
2.1.1 关系
域
一组具有相同数据结构的指的集合
例:整数,实数,{‘男’,‘女’}
笛卡尔积
所有域的所有取值的一个组合
元组
笛卡尔积中每一个元素(d,d2,…,dn)叫做一个n元组
例:(张三,计算机专业,李勇)
分量
笛卡尔积元素(d,d2,…,dn)中的每一个值di叫做一个分量
张三、计算机专业、李勇都是分量
基数
元素个数
表示方法
一张二维表 表中的每行对应一个元组,每列对应一个域
关系
关系
R(D1,D2,…,Dn)
R:关系名 n:关系的目或度
元组
关系中的每个元素
单元关系与二元关系
关系的表示
一张二维表 表中的每行对应一个元组,每列对应一个域
属性
关系中不同列可以对应相同的域,为了加以区分,必须对每列起一个名字,称为属性
n目关系必有n个属性
码
候选码
某关系中的某一属性组的值能唯一的标识一个元素
简单的情况:候选码只包含一个属性
候选码可能是多列
全码
最极端的情况:关系模式的所有属性组是这个关系模式的候选码,称为全码
主码
若一个关系有多个候选码,则选定其中一个为主码
候选码中的一个
主属性
候选码的诸属性称为主属性
三类关系
基本关系(基本表或基表)
实际存在的表,是实际存储数据的逻辑表示
查询表
查询结果对应的表
视图表
由基本表或其他视图表导出的表,是虚表,不对应实际存储的数据
基本关系的性质
列是同质的
不同的列可出自同一个域
其中的每一列称为一个属性 不同的属性要给予不同的属性名称
列的顺序无所谓,列的次序可以任意交换
任意两个元组的候选码不能相同
行的顺序无所谓,列的次序可以任意交换
分量必须取原子值
每一列不能再分
2.1.2 关系模式
什么是关系模式
关系模式是型 关系是值
关系模式 学生(学生,姓名,年龄,性别,籍贯) 关系 学生的表(关系实例)
关系模式是对关系的描述
元组集合的结构
属性构成 属性来自的域 属性与域之间的映像关系
完整性约束条件
定义关系模式
R(U,D,DOM,F)
R :关系名
U:组成该关系的属性名集合
D:U中属性所来自的域
DOM:属性向域的映象集合
F:属性间数据的依赖关系的集合
简记 R(U)或R(A1,A2,…,An)
R:关系名 A1,A2,…,An:属性名
关系模式与关系
关系模式
对关系的描述 静态的、稳定的
关系
关系模式在某一时刻的状态或内容 动态的、随时间不断变化的
2.1.3 关系数据库
在一个给定的应用领域中,所有关系的集合构成一个关系数据库
关系数据库的型与值
型:关系数据库模式,是对关系数据库的描述 值:关系模式在某一时刻对应的关系的集合
关系数据库模式是关系数据库的型,是对关系数据库的描述
一个数据库模式里有多个关系模式
2.1.4 关系模型的存储结构
物理组织
2.2 关系操作
2.2.1 基本的关系操作
常用的关系操作
查询操作:选择、投影、并、差、笛卡尔积(5种基本操作)连接、除、交
数据更新:插入、删除、修改
关系操作的特点
集合操作方式:操作的对象和结果都是集合,一次一集合的方式
2.2.2 关系数据库语言的分类
关系代数语言
用对关系的运算来表示查询的要求
代表:ISBL
关系演算语言
元组关系演算语言
谓词变元的基本对象时元组变量
代表:APLHA,QUEL
域关系演算语言
谓词变元的基本对象时域变量
代表:QEB
具有关系代数和关系演算双重特点的语言
代表:SQL
2.3 关系的完整性
2.3.1 实体完整性
规则2.1 实体完整性规则
主码唯一且不能为空
主属性不能取空值
2.3.2 参照完整性
关系间的引用
不仅两个或两个以上的关系间可以存在引用关系,同一关系内部属性间也可能存在引用关系
外码
设E是基本关系R的一个或一组属性,但不是关系R的码。 如果F与基本关系S的主码Ks相对应,则称F是R的外码
基本关系R:参照关系 基本关系S:被参照关系或目标关系
关系R与S不一定是不同的关系
目标关系S和主码Ks和参照关系的外码F必须定义在同一个(或一组)域上
外码并不一定要与相应的主码同名
规则2.2 参照完整性规则
参照完整性规则就是定义外码和主码之间的引用规则
外码取值必须为
或者取空值
或者等于被参照表中某个元组的主码值
2.3.3 用户定义的完整性
针对某一具体关系数据库的约束条件,反映某一具体应用所涉及的数据必须满足的语义要求
2.4 关系代数
2.4.1 传统的集合运算
并
差
交
笛卡尔积
2.4.2 专门的关系运算
选择
在关系R中选择满足给定条件的各个元组
单目运算,对象只有一个
投影
从R中选择出若干属性列组成新的关系
还可能取消某些元组(避免重复行)
连接
等值连接
从关系R与S的笛卡尔积中选取A/B属性值相等的那些元组
自然连接
在公共属性(组)上进行的等值连接
悬浮元组
两个关系R和S在做自然连接时,关系R中某些元组有可能在S中不存在公共属性上值相等的元组,从而造成R中这些元组在操作时被舍弃了,这些被舍弃的元组称为悬浮元组。
外连接
如果把悬浮元组也保存在结果关系中,而在其他属性上填空值(Null)
左外连接
只保留左边关系R中的悬浮元组
右外连接
只保留右边关系S中的悬浮元组
除运算
设关系R除以关系S的结果为关系T,则T包含所有在R但不在S中的属性及其值,且T的元组与S的元组的所有组合都在R中
2.6 小结
关系代数运算
并、差、交、笛卡尔积、投影、选择、连接、除
基本运算
并、差、笛卡尔积、投影、选择
关系数据结构
关系
关系模式
关系数据库
关系模型的存储结构
关系操作
查询
选择、投影、连接、除、并、交、差
数据更新
插入、删除、修改
关系的完整性约束
实体完整性
参照完整性
用户定义的完整性
关系数据语言
关系代数语言
关系演算语言
元组关系演算语言 ALPHA
域关系演算语言 QBE
第三章 关系数据库标准语言SQL
3.1 SQL概述
3.1.1 SQL的产生与发展
SQL标准的进展过程
3.1.2 SQL的特点
SQL集数据查询、数据操纵、数据定义和数据控制功能于一体
综合统一
集数据定义语言(DDL),数据操纵语言(DML),数据控制语言(DCL)功能于一体。
高度非过程化
SQL只要提出“做什么”,无须了解存取路径。
存取路径的选择以及SQL的操作过程由系统自动完成
面向集合的操作方式
操作对象、查找结果可以是元组的集合
一次插入、删除、更新操作的对象可以是元组的集合
以同一种语法结构提供多种使用方式
自含式语言
嵌入式语言
语言简洁,易学易用
3大类,11个命令词
drop删除属性列
delete删除数据
3.1.3 SQL的基本概念
SQL支持关系数据库三级模式结构
基本表(模式)
本身独立存在的表,SQL中一个关系就对应一个基本表
一个(或多个)基本表对应一个存储文件
一个表可以带若干索引
存储文件(内模式)
逻辑结构组成了关系数据库的内模式
物理结构对用户是隐蔽的
视图(外模式)
从一个或几个基本表导出的表
虚表,只存放视图的定义而不存放视图对应的数据
3.2 学生-课程数据库
3.3 数据定义
一个关系数据库管理系统的实例中可以建立多个数据库, 一个数据库中可以建立多个模式, 一个模式下通常包括多个表、视图和索引等数据库对象
SQL的数据定义功能
表定义
模式定义
视图和索引的定义
3.3.1 模式的定义与删除
定义模式
定义模式实际上定义了一个命名空间。在这个空间中可以定义该模式包含的数据库对象,例如基本表、视图、索引等
定义该模式包含的数据库对象,如基本表、视图、索引
在CREATE SCHEMA中可以接受CREATE TABLE,CREATE VIEW和GRANT子句。
create schema <模式名> authoration <用户名> [<表定义子句>|<视图定义子句>|<授权定义子句>]
删除模式
drop schema <模式名> <cascade|restrict>
CASCADE(级联)
删除模式的同时把该模式中所有的数据库对象全部删除
RESTRICT(限制)
如果该模式中定义了下属的数据库对象(如表、视图等),则拒绝该删除语句的执行。
仅当该模式中没有任何下属的对象时才能执行。
3.3.2 基本表的定义、删除与修改
定义基本表语格式
create table <表名> ( <列名><数据类型>[<列级完整性约束条件>]] [,<列名><数据类型>[<列级完整性约束条件>]] [,<表级完整性约束条件>]) [;]
组成
关系名(表名)
属性名(列名)
属性数据类型
完整性约束
注意:除了最后一个,其他每个列级完整性约束条件后面都有逗号!
常用完整性约束
主码约束:primary key
必须有,不可为空,只有一个
参照完整性约束:foreign key…references
唯一性约束:unique
非空值约束:NOT NULL
取值约束:check
数据类型
整型数据
bigint:大整数(8字节)
int:长整数(四字节)
smallint:短整型(2字节)
tinyint:微整型(1字节)
精确数值数据
decimal (p[,q]):定点数,由p位数字(不包括符号、小数点)组成,小数后面有d位数字
numeric
浮点数值数据
float(n):可选精度的浮点数,精度至少为n位数字
real:取决于机器精度的单精度浮点数
字符串数据
char:长度为n的定长字符串
varchar:最大长度为n的变长字符串
日期时间数据
data:日期类型
time:时间类型
datatime:日期时间类型
模式与表
一个模式包含多个基本表
每一个基本表都属于某一个模式
定义基本表所属模式
方法一:在表名中明显地给出模式名 Create table"S-T".Student(......); /*模式名为 S-T*/ Create table "S-T".Cource(......); Create table "S-T".SC(......);
在创建模式语句中同时创建表
设置所属的模式
修改基本表
alter table <表名> [ add[column] <新列名> <数据类型> [ 完整性约束 ] ] [ add <表级完整性约束>] [ drop [ column ] <列名> [cascade| restrict] ] [ drop constraint<完整性约束名>[ restrict | cascade ] ] [alter column <列名><数据类型> ] ;
ADD:用于增加新列、新的列级完整性约束条件和新的表级完整性约束条件
DROP COLUMN:用于删除表中的列
CASCADE:自动删除引用了该列的其他对象
RESTRICT:如果该列被其他对象引用,关系数据库管理系统将拒绝删除该列
DROP CONSTRAINT:删除指定的完整性约束条件
ALTER COLUMN:修改原有的列定义,包括修改列名和数据类型
删除基本表
drop table <表名> [ restrict | cascade ] ;
RESTRICT:删除表是有限制的
欲删除的基本表不能被其他表的约束所引用
如果存在依赖该表的对象,则此表不能被删除
CASCADE:删除该表没有限制
在删除基本表的同时,相关的依赖对象一起删除
3.3.3 索引的建立与删除
建立索引
建立索引的目的:加快查询速度
create [unique] [cluster] index <索引名> on <表名>(<列名>[<次序>][,<列名>[<次序>] ]…);
<表名>:要建索引的基本表的名字
索引:可以建立在该表的一列或多列上,各列名之间用逗号分隔
<次序>:指定索引值的排列次序,升序:ASC,降序:DESC。缺省值:ASC
UNIQUE:此索引的每一个索引值只对应唯一的数据记录
CLUSTER:表示要建立的索引是聚簇索引
修改索引
alter index <旧索引名> rename to <新索引名>
删除索引
drop index <索引名>;
3.3.4 数据字典
数据字典是关系数据库管理系统内部的一组系统表,它记录了数据库中所有定义信息: 关系模式定义、视图定义、索引定义、完整性约束定义、各类用户对数据库的操作权限、统计信息等
3.4 数据查询
select [all | disticnt] <目标列表达式>[,<目标列表达式>] … from <表名或视图名>[,<表名或视图名> ]…| (selct 语句) [as]<别名> [ where <条件表达式> ] [ group by <列名1> [ having <条件表达式> ] ] [ order by <列名2> [ ASC|DESC ] ];
SELECT子句:指定要显示的属性列
FROM子句:指定查询对象(基本表或视图)
WHERE子句:指定查询条件
GROUP BY子句:对查询结果按指定列的值分组,该属性列值相等的元组为一个组。通常会在每组中作用聚集函数。
HAVING短语:只有满足指定条件的组才予以输出
ORDER BY子句:对查询结果表按指定列值的升序或降序排序
3.4.1 单表查询
查询仅涉及一个表
选择表中的若干列
查询指定列
SELECT Sno,Sname FROM Student;
查询全部列
选出所有属性列: 在SELECT关键字后面列出所有列名 将<目标列表达式>指定为 *
SELECT * FROM Student;
查询经过计算的值
SELECT子句的<目标列表达式>不仅可以为表中的属性列,也可以是表达式
select Sname,2014-Sage
使用列别名改变查询结果的列标题
选择表中的若干元组
消除取值重复的行
如果没有指定DISTINCT关键词,则缺省为ALL
指定DISTINCT关键词,去掉表中重复的行
SELECT DISTINCT Sno FROM SC;
查询满足条件的元组
比较大小
确定范围
BETWEEN … AND …
NOT BETWEEN … AND …
确定集合
IN <值表>, NOT IN <值表>
SELECT Sname, Ssex FROM Student WHERE Sdept IN ('CS','MA’,'IS' );
字符匹配
[NOT] LIKE ‘<匹配串>’ [escape‘ <换码字符>’]
<匹配串>可以是一个完整的字符串,也可以含有通配符%和 _
% 代表任意长度(长度可以为0)的字符串
_ 代表任意单个字符。
匹配串为固定字符串
SELECT * FROM Student WHERE Sno LIKE ‘201215121';
匹配串为含通配符的字符串
SELECT Sname, Sno, Ssex FROM Student WHERE Sname LIKE '刘%';
SELECT Sname FROM Student WHERE Sname LIKE '欧阳__';
使用换码字符将通配符转义为普通字符
SELECT Cno,Ccredit FROM Course WHERE Cname LIKE 'DB\_Design' ESCAPE '\ ' ;
涉及空值的查询
谓词: IS NULL 或 IS NOT NULL
SELECT Sno,Cno FROM SC WHERE Grade IS NOT NULL;
多重条件查询
逻辑运算符:AND和 OR来连接多个查询条件
AND的优先级高于OR
ORDER BY子句
可以按一个或多个属性列排序
升序:ASC;降序:DESC;缺省值为升序
SELECT * FROM Student ORDER BY Sdept, Sage DESC;
聚集函数
统计元组个数 COUNT(*)
统计一列中值的个数 COUNT([DISTINCT|ALL] <列名>)
SELECT COUNT(DISTINCT Sno) FROM SC;
计算一列值的总和(此列必须为数值型)
SUM([DISTINCT|ALL] <列名>)
计算一列值的平均值(此列必须为数值型
AVG([DISTINCT|ALL] <列名>)
求一列中的最大值和最小值
MAX([DISTINCT|ALL] <列名>) MIN([DISTINCT|ALL] <列名>)
当聚集函数遇到空值时,除COUNT(*) 外,都跳过空值而只处理非空值 count是对元组计数,某个元组的部分取空值不影响
注意!! 聚集函数只能用于select子句和group by中的having子句
GROUP BY子句
对查询结果分组
按指定的一列或多列值分组,值相等的为一组
SELECT Cno,COUNT(Sno) FROM SC GROUP BY Cno;
注:后面只能加列名或者聚集函数
HAVING 短语
只有满足HAVING短语指定条件的组才输出
[例3.47] 查询选修了3门以上课程的学生学号。 SELECT Sno FROM SC GROUP BY Sno HAVING COUNT(*) >3;
HAVING短语与WHERE子句的区别
WHERE子句作用于基表或视图,从中选择满足条件的元组
HAVING短语作用于组,从中选择满足条件的组
3.4.2 连接查询
同时涉及两个以上的表的查询
[<表名1>.]<列名1> <比较运算符> [<表名2>.]<列名2> [<表名1>.]<列名1> BETWEEN [<表名2>.]<列名2> AND [<表名2>.]<列名3>
1.等值与非等值连接查询
等值连接:连接运算符为=
SELECT Student.*, SC.* FROM Student, SC WHERE Student.Sno = SC.Sno;
连接操作的执行过程
嵌套循环法
首先在表1中找到第一个元组,然后从头开始扫描表2,逐一查找满足连接件的元组,找到后就将表1中的第一个元组与该元组拼接起来,形成结果表中一个元组。
表2全部查找完后,再找表1中第二个元组,然后再从头开始扫描表2,逐一查找满足连接条件的元组,找到后就将表1中的第二个元组与该元组拼接起来,形成结果表中一个元组。
重复上述操作,直到表1中的全部元组都处理完毕
排序合并法
索引连接
自然连接
SELECT Student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade FROM Student,SC WHERE Student.Sno = SC.Sno;
2.自身连接
自身连接:一个表与其自己进行连接需要给表起别名以示区别 由于所有属性名都是同名属性,因此必须使用别名前缀
SELECT FIRST.Cno, SECOND.Cpno FROM Course FIRST, Course SECOND WHERE FIRST.Cpno = SECOND.Cno;
3.外连接
左外连接
列出左边关系中所有的元组
SELECT Student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade FROM Student LEFT OUT JOIN SC ON (Student.Sno=SC.Sno);
右外连接
列出右边关系中所有的元组
注:可以将主体表中不满足连接条件的元组一并输出
4.多表连接
两个以上的表进行连接
SELECT Student.Sno, Sname, Cname, Grade FROM Student, SC, Course /*多表连接*/ WHERE Student.Sno = SC.Sno AND SC.Cno = Course.Cno;
3.4.3 嵌套查询
将一个查询块嵌套在另一个查询块的WHERE子句或HAVING短语的条件中的查询
SELECT Sname /*外层查询/父查询*/ FROM Student WHERE Sno IN ( SELECT Sno /*内层查询/子查询*/ FROM SC WHERE Cno= ' 2 ');
子查询的限制:不能使用ORDER BY子句
order by 子句只能对最终查询结果排序
嵌套查询求解方法
不相关子查询: 子查询的查询条件不依赖于父查询
子查询在上一级查询处理之前求解
相关子查询:子查询的查询条件依赖于父查询
(1)首先取外层查询中表的第一个元组,根据它与内层查询相关的属性值处理内层查询,若WHERE子句返回值为真,则取此元组放入结果表 (2)然后再取外层表的下一个元组 (3)重复这一过程,直至外层表全部检查完为止
带有IN谓词的子查询
SELECT Sno, Sname, Sdept FROM Student WHERE Sdept IN (SELECT Sdept FROM Student WHERE Sname= ' 刘晨 ');
不相关子查询
带有比较运算符的子查询
SELECT Sno, Cno FROM SC x WHERE Grade >=(SELECT AVG(Grade) FROM SC y WHERE y.Sno=x.Sno);
从外层查询中取出SC的一个元组x,将元组x的Sno值(201215121)传送给内层查询。 SELECT AVG(Grade) FROM SC y WHERE y.Sno='201215121‘;
执行内层查询,得到值88(近似值),用该值代替内层查询,得到外层查询: SELECT Sno,Cno FROM SC x WHERE Grade >=88;
外层查询取出下一个元组重复做上述①至③步骤,直到外层的SC元组全部处理完毕
带有ANY(SOME)或ALL谓词的子查询
SELECT Sname,Sage FROM Student WHERE Sage < ANY (SELECT Sage FROM Student WHERE Sdept= ' CS ') AND Sdept <> ‘CS ' ; /*父查询块中的条件 */
可使用聚集函数
效率更高
带有EXISTS谓词的子查询
EXISTS谓词
不返回任何数据,只产生逻辑真值“true”或逻辑假值“false”
内层查询结果非空,外层的where子句返回真值
内层查询结果为空,则外层的WHERE子句返回假值
由EXISTS引出的子查询,其目标列表达式通常都用 * ,因为带EXISTS的子查询只返回真值或假值,给出列名无实际意义。
SELECT Sname FROM Student WHERE EXISTS (SELECT * FROM SC WHERE Sno=Student.Sno AND Cno= ' 1 ');
思路分析: 本查询涉及Student和SC关系 在Student中依次取每个元组的Sno值,用此值去检查SC表 若SC中存在这样的元组,其Sno值等于此Student.Sno值,并且其Cno= ‘1’,则取此Student.Sname送入结果表
NOT EXISTS谓词
内层查询结果为空,则外层的where子句返回真值
把带有全称量词的谓词转换为等价的带有存在量词的谓词
子查询过程
[例 3.63]查询至少选修了学生201215122选修的全部课程的学生号码。 SELECT DISTINCT Sno FROM SC SCX WHERE NOT EXISTS (SELECT * FROM SC SCY WHERE SCY.Sno = ' 201215122 ' AND NOT EXISTS (SELECT * FROM SC SCZ WHERE SCZ.Sno=SCX.Sno AND SCZ.Cno=SCY.Cno));
3.4.4 集合查询
注意
参加集合操作的各查询结果的列数必须相同; 对应项的数据类型也必须相同
并操作 union
UNION:将多个查询结果合并起来时,系统自动去掉重复元组 UNION ALL:将多个查询结果合并起来时,保留重复元组
[例 3.64] 查询计算机科学系的学生及年龄不大于19岁的学生。 SELECT * FROM Student WHERE Sdept= 'CS' UNION SELECT * FROM Student WHERE Sage<=19;
系统自动去掉重复数组
交操作 intersect
[例3.66] 查询计算机科学系的学生与年龄不大于19岁的学生的交集。 SELECT * FROM Student WHERE Sdept='CS' INTERSECT SELECT * FROM Student WHERE Sage<=19
差操作 except
[例 3.68] 查询计算机科学系的学生与年龄不大于19岁的学生的差集。 SELECT * FROM Student WHERE Sdept='CS' EXCEPT SELECT * FROM Student WHERE Sage <=19;
3.4.5基于派生表的查询
子查询出现在FROM子句中,这时子查询生成的临时派生表成为主查询的查询对象
3.4.6 Select语句的一般形式
3.5 数据更新
3.5.1 插入数据
插入元组
insert into <表名> [(<属性列1>[,<属性列2 >…)] values (<常量1> [,<常量2>]… );
INSERT INTO Student (Sno,Sname,Ssex,Sdept,Sage) VALUES ('201215128','陈冬','男','IS',18);
注意INTO 和 VALUES 的顺序
空值的处理
INTO后指明属性名
新插入记录自动赋空值
INTO后没有指出属性名
要明确给出空值
插入子查询结果
INSERT INTO <表名> [(<属性列1> [,<属性列2>… )] 子查询;
SELECT子句目标列必须与INTO子句匹配
可以一次插入多个元组
检查所插元组是否破坏表上已定义的完整性规则
3.5.2 修改数据
UPDATE <表名> SET <列名>=<表达式>[,<列名>=<表达式>]… [WHERE <条件>];
如果省略WHERE子句,表示要修改表中的所有元组
三种修改方式
修改某一个元组的值
UPDATE Student SET Sage=22 WHERE Sno=' 201215121 ';
修改多个元组的值
UPDATE Student SET Sage= Sage+1;
带子查询的修改语句
UPDATE SC SET Grade=0 WHERE Sno IN (SELETE Sno FROM Student WHERE Sdept= 'CS' );
注意
实体完整性
主码不允许修改
用户定义完整性
值域约束
unique 约束
not null 约束
3.5.3 删除数据
DELETE FROM <表名> [WHERE <条件>];
三种删除方式
带子查询的删除语句
删除某一个元组的值
删除多个元组的值
可能破坏参照完整性
3.6 空值的处理
空值的产生
插入有空值
被修改为空值
空值的判断
IS NULL或IS NOT NULL
空值的约束条件
属性定义(或者域定义)中 ①有NOT NULL约束条件的不能取空值 ②加了UNIQUE限制的属性不能取空值 ③码属性不能取空值
空值的算术运算、比较运算和逻辑运算
3.7 视图
视图的特点
虚表,是从一个或几个基本表(或视图)导出的表
只存放视图的定义,不存放视图对应的数据
基表中的数据发生变化,从视图中查询出的数据也随之改变
3.7.1 定义视图
建立视图
CREATE VIEW <视图名> [(<列名> [,<列名>]…)] AS <子查询> [WITH CHECK OPTION];
with check option
对视图进行updata、insert、delete操作时要保证更新、插入或删除的行满足试图定义中的谓词条件
组成视图的属性列名:全部省略或全部指定
必须明确指定组成视图的所有列名
某个目标列不是单纯的属性名,而是聚集函数或列表达式
多表连接时选出了几个同名列作为视图的字段
需要在视图中为某个列启用新的更合适的名字
DBMS系统只是把视图的定义存入数据字典,并不执行其中的select语句
行列子集视图
从单个基本表导出
保留了主码,去掉了基本表的某些行和某些列
基于多个基表的视图
必须在视图名后面明确说明视图的各个属性列
基于视图的视图
带表达式的视图
必须在视图名后面明确说明视图的各个属性列
分组视图
有聚集函数和group by子句的查询
必须在视图名后面明确说明视图的各个属性列
删除视图
DROP VIEW <视图名>[CASCADE];
CASCADE级联删除语句,把该视图和由它导出的所有视图一起删除
从数据字典中删除视图的定义
3.7.2 查询视图
视图消解法
关系数据库管理系统执行对视图的查询时,首先进行有效性检查,检查查询中涉及的表、视图等是否存在。如果存在,则从数据字典中取出视图的定义,把定义中的子查询和用户的查询结合起来,转换成等价的对基本表的查询,然后再执行修正了的查询。
进行有效性检查
转换成等价的对基本表的查询
执行修正后的查询
定义视图并查询视图 与 基于派生表的查询是有区别的
视图一旦定义,其定义将永久保存在数据字典中,之后的所有查询都可以直接引用该视图
派生表只是在语句执行时临时定义,语句执行后该定义即被删除
3.7.3 更新视图
UNPDATE
UPDATE IS_Student SET Sname= '刘辰' WHERE Sno= ' 201215122 ';
转换后的语句: UPDATE Student SET Sname= '刘辰' WHERE Sno= ' 201215122 ' AND Sdept= 'IS';
INSERT
INSERT INTO IS_Student VALUES(‘201215129’,’赵新’,20);
INSERT INTO Student(Sno,Sname,Sage,Sdept) VALUES(‘200215129 ','赵新',20,'IS' );
DELETE
DELETE FROM IS_Student WHERE Sno= ' 201215129 ';
允许对行列子集视图进行更新
对其他类型视图的更新不同系统有不同限制
3.7.4 视图的作用
视图能够简化用户的操作
使用户能以多种角度看待同一数据
对重构数据库提供了一定程度的逻辑独立性
能够对机密数据提供安全保护
适当的利用视图可以更清晰的表达查询
第十一章 并发控制
并发控制
多事务执行方式
事务串行执行
每个时刻只有一个事务运行,其他事务必须等到这个事务结束以后方能运行
交叉并发方式
在单处理机系统中,事务的并行执行是这些并行事务的并行操作轮流交叉运行
同时并发方式
多处理机系统中,每个处理机可以运行一个事务,多个处理机可以同时运行多个事务,实现多个事务真正的并行运行
事务并发执行带来的问题
会产生多个事务同时存取同一数据的情况
可能会存取和存储不正确的数据,破坏事务隔离性和数据库的一致性
11.1 并发控制概述
事务是并发控制的基本单位
并发控制机制的任务
对并发操作进行正确调度
保证事务的隔离性
保证数据库的一致性
并发操作带来的数据不一致性
丢失修改
两个事务T1和T2读入同一数据并修改,T2的提交结果破坏了T1提交的结果,导致T1的修改被丢失
不可重复读
指事务T1读取数据后,事务T2 执行更新操作,使T1无法再现前一次读取结果
包括三种情况
事务T2对其做了修改
事务T2删除了其中部分记录
事务T2插入了一些记录
幻影现象
读“脏”数据
事务T1修改某一数据,并将其写回磁盘,事务T2读取同一数据后,T1由于某种原因被撤销
这时T1已修改过的数据恢复原值,T2读到的数据就与数据库中的数据不一致,T2读到的数据就为“脏”数据,即不正确的数据
不一致的原因
并发操作破坏了事务的隔离性
并发控制就是要用正确的方式调度并发操作,使一个用户事务的执行不受其他事务的干扰,从而避免造成数据的不一致性
并发控制的主要技术
封锁
时间戳
乐观控制法
多版本并发控制
11.2 封锁
什么是封锁
封锁就是事务T在对某个数据对象(例如表、记录等)操作之前,先向系统发出请求,对其加锁
加锁后事务T就对该数据对象有了一定的控制,在事务T释放它的锁之前,其它的事务不能更新此数据对象
基本封锁类型
排它锁(X锁/写锁)
若事务T对数据对象A加上X锁,则只允许T读取和修改A,其它任何事务都不能再对A加任何类型的锁,直到T释放A上的锁
共享锁(S锁/读锁)
若事务T对数据对象A加上S锁,则事务T可以读A但不能修改A,其它事务只能再对A加S锁,而不能加X锁,直到T释放A上的S锁
锁的相容矩阵
11.3 封锁协议
在运用X锁和S锁对数据对象加锁时,需要约定一些规则,这些规则为封锁协议。如,何时申请X锁或S锁、持锁时间、何时释放
三级封锁协议
一级封锁协议
事务T在修改数据R之前必须先对其加X锁,直到事务结束才释放
一级封锁协议可防止丢失修改,并保证事务T是可恢复的
如果仅仅是读数据不对其进行修改,是不需要加锁的,所以它不能保证可重复读和不读“脏”数据
二级封锁协议
一级封锁协议加上事务T在读取数据R之前必须先对其加S锁,读完后即可释放S锁
级封锁协议可以防止丢失修改和读“脏”数据
由于读完数据后即可释放S锁,所以它不能保证可重复读
三级封锁协议
三级封锁协议可防止丢失修改、读脏数据和不可重复读
一级封锁协议加上事务T在读取数据R之前必须先对其加S锁,直到事务结束才释放
不同级别的封锁协议和一致性保证
封锁协议级别越高,一致性程度越高
11.4 活锁和死锁
11.4.1 活锁
事务T1封锁了数据R,事务T2又请求封锁R,于是T2等待。T3也请求封锁R,当T1释放了R上的封锁之后系统首先批准了T3的请求,T2仍然等待。T4又请求封锁R,当T3释放了R上的封锁之后系统又批准了T4的请求…… T2有可能永远等待
避免活锁:采用先来先服务的策略
11.4.2 死锁
事务T1封锁了数据R1,T2封锁了数据R2。T1又请求封锁R2,因T2已封锁了R2,于是T1等待T2释放R2上的锁。接着T2又申请封锁R1,因T1已封锁了R1,T2也只能等待T1释放R1上的锁。这样T1在等待T2,而T2又在等待T1,T1和T2两个事务永远不能结束,形成死锁
两类方法
死锁的预防
一次封锁法
要求每个事务必须一次将所有要使用的数据全部加锁,否则就不能继续执行
存在的问题:降低系统并发度
顺序封锁法
顺序封锁法是预先对数据对象规定一个封锁顺序,所有事务都按这个顺序实行封锁
成本高,难按规定的顺序施加封锁
死锁的诊断与解除
死锁的诊断
超时法
如果一个事务的等待时间超过了规定的时限,就认为发生了死锁
等待图法
用事务等待图动态反映所有事务的等待情况
解除死锁
选择一个处理死锁代价最小的事务,将其撤消。释放此事务持有的所有的锁,使其它事务能继续运行下去
11.5 并发调度的可串行性
串行调度是正确的
执行结果等价于串行调度的调度也是正确的,称为可串行化调度
11.5.1 可串行化调度
可串行化调度
多个事务的并发执行是正确的,当且仅当其结果与按某一次序串行地执行这些事务时的结果相同
可串行性
是并发事务正确调度的准则
一个给定的并发调度,当且仅当它是可串行化的,才认为是正确调度
11.5.2 冲突可串行化调度
冲突操作:是指不同的事务对同一数据的读写操作和写写操作
Ri(x)与Wj(x) /*事务Ti读x,Tj写x,其中i≠j*/ Wi(x)与Wj(x) /*事务Ti写x,Tj写x,其中i≠j*/
不能交换的动作
同一事务的两个操作
不同事务的冲突操作
冲突可串行化
一个调度Sc在保证冲突操作的次序不变的情况下,通过交换两个事务不冲突操作的次序得到另一个调度Sc’,如果Sc’是串行的,称调度Sc是冲突可串行化的调度
判断一个调度是否是冲突可串行化的
若一个调度是冲突可串行化,则一定是可串行化的调度
冲突可串行化调度是可串行化调度的充分条件,不是必要条件
11.6 两段锁协议
两段锁协议
指所有事务必须分两个阶段对数据项加锁和解锁
在对任何数据进行读、写操作之前,事务首先要获得对该数据的封锁
在释放一个封锁之后,事务不再申请和获得任何其他封锁
“两段”锁的含义
事务分为两个阶段
第一阶段
获得封锁,也称为扩展阶段
第二阶段
释放封锁,也称为收缩阶段
事务遵守两段锁协议是可串行化调度的充分条件,而不是必要条件
若并发事务都遵守两段锁协议,则对这些事务的任何并发调度策略都是可串行化的
若并发事务的一个调度是可串行化的,不一定所有事务都符合两段锁协议
两段锁协议与防止死锁的一次封锁法
一次封锁法要求每个事务必须一次将所有要使用的数据全部加锁,否则就不能继续执行,因此一次封锁法遵守两段锁协议
两段锁协议并不要求事务必须一次将所有要使用的数据全部加锁,因此遵守两段锁协议的事务可能发生死锁
11.7 封锁的粒度
封锁对象的大小称为封锁粒度
封锁的对象
逻辑单元
属性值、属性值的集合、元组、关系、索引项、整个索引、整个数据库等
物理单元
页(数据页或索引页)、物理记录等
封锁粒度与系统的并发度和并发控制的开销密切相关
封锁的粒度越大,数据库所能够封锁的数据单元就越少,并发度就越小,系统开销也越小
封锁的粒度越小,并发度较高,但系统开销也就越大
多粒度封锁
在一个系统中同时支持多种封锁粒度供不同的事务选择
选择封锁粒度
同时考虑封锁开销和并发度两个因素, 适当选择封锁粒度
需要处理大量元组的用户事务
以关系为封锁单元
需要处理多个关系的大量元组的用户事务
以数据库为封锁单位
只处理少量元组的用户事务
以元组为封锁单位
11.9 小结
活锁和死锁
并发事务调度的正确性
可串行性
并发操作的正确性则通常由两段锁协议来保证
两段锁协议是可串行化调度的充分条件,但不是必要条件
冲突可串行性
其他并发控制机制
时间戳方法
乐观控制法
多版本并发控制
数据库的并发控制以事务为单位
数据库的并发控制通常使用封锁机制
多粒度封锁
基本封锁
第十章 数据库恢复技术
事务是一系列的数据库操作,是数据库应用程序的基本逻辑单元
事务处理技术
数据库恢复技术
并发控制技术
事务是恢复和并发控制的基本单位
10.1 事务的基本概念
事务
事务是用户定义的一个数据库操作序列,这些操作要么全做,要么全不做,是一个不可分割的工作单位
显式定义方式
begin transaction SQL语句 commit
提交
事务正常结束
提交事务的所有操作(读+更新)
事务中所有对数据库的更新写回到磁盘上的物理数据库中
begin transaction SQL语句 rollback
回滚
事务异常终止
事务运行的过程中发生了故障,不能继续执行
系统将事务中对数据库的所有已完成的操作全部撤销
事务滚回到开始时的状态
隐式方式
当用户没有显式地定义事务时,数据库管理系统按缺省规定自动划分事务
事务的ACID特性
事物的4个特性
原子性(Atomicity)
事务是数据库的逻辑工作单位。事务中包括的诸操作要么都做,要么都不做
一致性(Consistency)
事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态
一致性状态
数据库中只包含成功事务提交的结果
不一致状态
数据库系统运行中发生故障,有些事务尚未完成就被迫中断
这些未完成事务对数据库所做的修改有一部分已写入物理数据库,这时数据库就处于一种不正确的状态
隔离性(Isolation)
一个事务的执行不能被其他事务干扰
一个事务内部的操作及使用的数据对其他并发事务是隔离的,并发执行的各个事务之间不能互相干扰
持续性(Durability)
一个事务一旦提交,它对数据库中数据的改变就应该是永久性的
接下来的其他操作或故障不应该对其执行结果有任何影响
保证事务ACID特性是事务处理的任务
破坏事务ACID特性的因素
多个事务并行运行时,不同事务的操作交叉执行
事务在运行过程中被强行停止
10.2 数据库恢复概述
故障是不可避免的
计算机硬件故障、软件的错误、操作员的失误、恶意的破坏
故障的影响
影响数据库中数据的正确性
破坏数据库,全部或部分丢失数据
数据库的恢复
子数据库管理系统必须具有把数据库从错误状态恢复到某一已知的正确状态(亦称为一致状态或完整状态)的功能主题
10.3 故障的种类
事务内部的故障
事物内部可能造成事务被回滚的情况
事务内部更多的故障是非预期的,是不能由应用程序处理的
事务故障仅指这类非预期的故障
不正确状态
事务没有达到预期的终点(COMMIT或者显式的ROLLBACK)
事务故障的恢复
事务撤消(UNDO)
强行回滚(ROLLBACK)该事务
撤销该事务已经作出的任何对数据库的修改,使得该事务象根本没有启动一样
系统故障
软故障
造成系统停止运转的任何事件,使得系统要重新启动
整个系统的正常运行突然被破坏
所有正在运行的事务都非正常终止
不破坏数据库
内存中数据库缓冲区的信息全部丢失
恢复策略
一些尚未完成的事务的
结果可能已送入物理数据库
系统重新启动时,恢复程序让所有非正常终止的事务回滚,强行撤消(UNDO)所有未完成事务
一些已完成的事务
可能有一部分甚至全部留在缓冲区,尚未写回到磁盘上的物理数据库中,系统故障使得这些事务对数据库的修改部分或全部丢失
系统重新启动时,恢复程序需要重做(REDO)所有已提交的事务
介质故障
硬故障(外存故障)
破坏数据库或部分数据库,并影响正在存取这部分数据的所有事务
计算机病毒
数据库一旦被破坏仍要用恢复技术把数据库加以恢复
故障小结
各类故障对数据库的影响有两种可能性
数据库本身被破坏
数据库没有被破坏,但数据可能不正确,这是由于事务的运行被非正常终止造成的
恢复操作的基本原理
冗余
利用存储在系统别处的冗余数据来重建数据库中已被破坏或不正确的那部分数据
10.4 恢复的实现技术
数据转储
转储是指数据库管理员定期地将整个数据库复制到磁带、磁盘或其他存储介质上保存起来的过程
备用的数据文本称为后备副本(backup)或后援副本
数据库遭到破坏后可以将后备副本重新装入
重装后备副本只能将数据库恢复到转储时的状态
要想恢复到故障发生时的状态,必须重新运行自转储以后的所有更新事务
10.4.1 数据转储
转储方法
静态转储与动态转储
静态转储
在系统中无运行事务时进行的转储操作
转储开始时数据库处于一致性状态
转储期间不允许对数据库的任何存取、修改活动
得到的一定是一个数据一致性的副本
优缺点
优点:实现简单
缺点:降低了数据库的可用性
动态转储
转储操作与用户事务并发进行
转储期间允许对数据库进行存取或修改
优缺点
优点:不用等待正在运行的用户事务结束、不会影响新事务的运行
缺点:不能保证副本中的数据正确有效
利用动态转储得到的副本进行故障恢复
需要把动态转储期间各事务对数据库的修改活动登记下来,建立日志文件
后备副本加上日志文件就能把数据库恢复到某一时刻的正确状态
海量转储与增量转储
海量转储: 每次转储全部数据库
得到的后备副本进行恢复往往更方便
增量转储: 只转储上次转储后更新过的数据
如果数据库很大,事务处理又十分频繁,则增量转储方式更实用更有效
10.4.2 登记日志文件
日志文件的格式和内容
日志文件是用来记录事务对数据库的更新操作的文件
以记录为单位的日志文件
日志文件的格式
需要登记的内容
各个事务的开始标记(BEGIN TRANSACTION)
各个事务的结束标记(COMMIT或ROLLBACK)
各个事务的所有更新操作
每个操作均作为日志文件中的一个日志记录
日志记录的内容
事务标识(标明是哪个事务)
操作类型(插入、删除或修改)
操作对象(记录ID、Block NO.)
更新前数据的旧值(对插入操作而言,此项为空值)
更新后数据的新值(对删除操作而言, 此项为空值)
以数据块为单位的日志文件
日志记录的内容
事务标识
被更新的数据块
日志文件的作用
协助后备副本进行介质故障恢复
进行事务故障恢复
进行系统故障恢复
具体作用
事务故障恢复和系统故障恢复必须用日志文件
在动态转储方式中必须建立日志文件,后备副本和日志文件结合起来才能有效地恢复数据库
在静态转储方式中,也可以建立日志文件
登记日志文件
为保证数据库是可恢复的,登记日志文件时必须遵循两条原则
登记的次序严格按并发事务执行的时间次序
必须先写日志文件,后写数据库
为什么要先写日志文件
写数据库和写日志文件是两个不同的操作
在这两个操作之间可能发生故障
如果先写了数据库修改,而在日志文件中没有登记下这个修改,则以后就无法恢复这个修改了
如果先写日志,但没有修改数据库,按日志文件恢复时只不过是多执行一次不必要的UNDO操作,并不会影响数据库的正确性
10.5 恢复策略
10.5.1 事务故障的恢复
事务故障:事务在运行至正常终止点前被终止
恢复方法
由恢复子系统利用日志文件撤消(UNDO)此事务已对数据库进行的修改
事务故障的恢复由系统自动完成,对用户是透明的,不需要用户干预
10.5.2 系统故障的恢复
系统故障造成数据库不一致状态的原因
未完成事务对数据库的更新可能已写入数据库
已提交事务对数据库的更新可能还留在缓冲区没来得及写入数据库
恢复方法
Undo 故障发生时未完成的事务
Redo 已完成的事务
系统故障的恢复由系统在重新启动时自动完成,不需要用户干预
10.5.3 介质故障的恢复
重装数据库
装入最新的后备数据库副本(离故障发生时刻最近的转储副本) ,使数据库恢复到最近一次转储时的一致性状态
重做已完成的事务
装入有关的日志文件副本(转储结束时刻的日志文件副本) ,重做已完成的事务
介质故障的恢复需要数据库管理员介入
具体的恢复操作仍由数据库管理系统完成
10.6 具有检查点的恢复技术
问题的提出
两个问题
搜索整个日志将耗费大量的时间
重做处理:重新执行,浪费了大量时间
具有检查点的恢复技术
在日志文件中增加检查点记录
增加重新开始文件
恢复子系统在登录日志文件期间动态地维护日志
检查点技术
检查点记录的内容
建立检查点时刻所有正在执行的事务清单
这些事务最近一个日志记录的地址
重新开始文件的内容
记录各个检查点记录在日志文件中的地址
利用检查点的恢复策略
动态维护日志文件的方法
周期性地执行如下操作:建立检查点,保存数据库状态。
恢复子系统可以定期或不定期地建立检查点,保存数据库状态
使用检查点方法可以改善恢复效率
系统出现故障时,恢复子系统将根据事务的不同状态采取不同的恢复策略
事物在故障发生时还未完成
撤销
检查点之后提交,故障前完成
重做
检查点之前提交
不必重做
10.7 数据库镜像
介质故障是对系统影响最为严重的一种故障,严重影响数据库的可用性
提高数据库可用性的解决方案
数据库镜像
数据库管理系统自动把整个数据库或其中的关键数据复制到另一个磁盘上
数据库管理系统自动保证镜像数据与主数据的一致性。每当主数据库更新时,数据库管理系统自动把更新后的数据复制过去
出现介质故障时
可由镜像磁盘继续提供使用
同时数据库管理系统自动利用镜像磁盘数据进行数据库的恢复
不需要关闭系统和重装数据库副本
频繁地复制数据自然会降低系统运行效率
在实际应用中用户往往只选择对关键数据和日志文件镜像
不是对整个数据库进行镜像
10.8 小结
事务的概念和性质
事务是数据库的逻辑工作单位
数据库管理系统保证系统中一切事务的原子性、一致性、隔离性和持续性,就保证了事务处于一致状态
不仅是恢复的基本单位,也是并发控制的基本单位
故障的种类
事务故障
系统故障
介质故障
恢复中最经常使用的技术
数据库转储
登记日志文件
恢复的基本原理
利用存储在后备副本、日志文件和数据库镜像中的冗余数据来重建数据库
第七章 数据库设计
7.1 数据库设计概述
数据库设计是指对于一个给定的应用环境,构造(设计)优化的数据库逻辑模式和物理结构,并据此建立数据库及其应用系统,使之能够有效地存储和管理数据,满足各种用户的应用需求,包括信息管理要求和数据操作要求。
信息管理要求
数据库中应该存储和管理哪些数据对象
数据操作要求
对数据对象需要进行哪些操作,如查询、增、删、改、统计等操作
数据库设计的目标是为用户和各种应用系统提供一个信息基础设施和高效率的运行环境
7.1.1 数据库设计的特点
1. 数据库建设的基本规律
“十二分基础数据”强调了数据的收集、整理、组织和不断更新是数据库建设中的重要环节
2. 结构(数据)设计和行为(处理)设计相结合
7.1.2 数据库设计方法
手工试凑法
规范设计法
7.1.3 数据库设计的基本步骤
参加数据库设计的人员
系统分析人员和数据库设计人员
数据库管理员和用户代表
应用开发人员
6个阶段
1. 需求分析
数字字典、全系统中数据项、数据结构、数据流、数据存储的描述
2. 概念结构设计
概念模型(E-R图)、数据字典
3. 逻辑结构设计
某种数据模型(关系、非关系)
4. 物理结构设计
存储安排、存取方法选择、存取路径建立
5. 数据库实施
创建数据库模式、装入数据、数据库试运行
6. 数据库运行和维护
性能监测、转储/恢复、数据库重组和重构
7.1.4 数据库设计过程中的各级模式
7.2 需求分析
7.2.1 需求分析的任务
需求分析的任务
详细调查现实世界要处理的对象(组织、部门、企业等)
充分了解原系统(手工系统或计算机系统)工作概况
明确用户的各种需求
在此基础上确定新系统的功能
新系统必须充分考虑今后可能的扩充和改变
调查的重点是“数据”和“处理”,通过调查、收集与分析,获得用户对数据库的要求
信息要求
处理要求
安全性与完整性要求
7.2.2 需求分析的方法
进行需求分析首先是调查清楚用户的实际需求并进行初步分析,与用户达成共识,然后分析与表达这些需求
调查用户需求的步骤
调查组织机构情况
调查各部门的业务活动情况
协助用户明确对新系统的各种要求,包括信息要求、处理要求、完全性与完整性要求
确定新系统的边界
常用调查方法
跟班作业
开调查会
请专人介绍
询问
设计调查表请用户填写
查阅记录
进一步分析和表达用户需求
分析方法
结构化分析方法
SA方法从最上层的系统组织机构入手
采用自顶向下、逐层分解的方式分析系统
对用户需求进行分析与表达后,需求分析报告必须提交给用户,征得用户的认可
7.2.3 数据字典
数据字典是关于数据库中数据的描述,即元数据,不是数据本身。数据字典在需求分析阶段建立,在数据库设计过程中不断修改、充实、完善的。
数据字典的内容
数据项
数据项是不可再分的数据单位
数据的最小组成单位
数据项描述={数据项名,数据项含义说明,别名, 数据类型,长度,取值范围,取值含义,与其他数据项的逻辑关系, 数据项之间的联系}
数据结构
反映了数据之间的组合关系
若干个数据项可以组成一个数据结构
数据结构描述={数据结构名,含义说明,组成:{数据项或数据结构}}
数据流
数据流是数据结构在系统内传输的路径
数据流描述={数据流名,说明,数据流来源, 数据流去向,组成:{数据结构},平均流量,高峰期流量}
数据存储
数据存储是数据结构停留或保存的地方,也是数据流的来源和去向之一。
数据存储描述={数据存储名,说明,编号,输入的数据流 ,输出的数据流,组成:{数据结构},数据量,存取频度,存取方式}
处理过程
处理过程描述={处理过程名,说明,输入:{数据流}, 输出:{数据流},处理:{简要说明}}
7.3 概念结构设计
7.3.1 概念模型
将需求分析得到的用户需求抽象为信息结构(即概念模型)的过程就是概念结构设计
概念模型的特点
能真实、充分地反映现实世界,是现实世界的一个真实模型。
易于理解,从而可以用它和不熟悉计算机的用户交换意见。
易于更改,当应用环境和应用要求改变时,容易对概念模型修改和扩充。
易于向关系、网状、层次等各种数据模型转换
7.3.2 E-R模型
E-R模型是用E-R图来描述现实世界的概念模型
1. 实体之间的联系
(1)两个实体型之间的联系
①一对一联系(1∶1)
②一对多联系(1∶n)
③多对多联系(m∶n)
(2)两个以上的实体型之间的联系
一般地,两个以上的实体型之间也存在着一对一、一对多、多对多联系。
(3)单个实体型内的联系
同一个实体集内的各实体之间也可以存在一对一、一对多、多对多的联系
2. E-R图
E-R图提供了表示实体型、属性和联系的方法
实体型:用矩形表示,矩形框内写明实体
属性:用椭圆形表示
联系:用菱形表示,菱形框内写明联系名,同时在无向边旁标上联系的类型(1∶1,1∶n或m∶n)
3. 一个实例
7.3.5 概念结构设计
概念结构设计的第一步就是对需求分析阶段收集到的数据进行分类、组织,确定实体、实体的属性、实体之间的联系类型
1. 实体与属性的划分原则
为了简化E-R图的处置,现实世界的事物能作为属性对待的尽量作为属性对待
两条准则
作为属性,不能再具有需要描述的性质。属性必须是不可分的数据项,不能包含其他属性。
属性不能与其他实体具有联系,即E-R图中所表示的联系是实体之间的联系。
2. E-R图的集成
自顶向下地进行需求分析,然后自底向上地设计概念结构
合并。解决各分E-R图之间的冲突, 将分E-R图合并起来生成初步E-R图。
冲突主要有三类
①属性冲突
属性域冲突,即属性值的类型、取值范围或取值集合不同
属性取值单位冲突
②命名冲突
同名异义,即不同意义的对象在不同的局部应用中具有相同的名字
异名同义(一义多名),即同一意义的对象在不同的局部应用中具有不同的名字
③结构冲突
同一对象在不同应用中具有不同的抽象
同一实体在不同子系统的E-R图中所包含的属性个数和属性排列次序不完全相同
实体间的联系在不同的E-R图中为不同的类型
修改和重构。消除不必要的冗余,生成基本E-R图
冗余的数据是指可由基本数据导出的数据,冗余的联系是指可由其他联系导出的联系
消除冗余主要采用分析方法,即以数据字典和数据流图为依据,根据数据字典中关于数据项之间逻辑关系的说明来消除冗余
用规范化理论来消除冗余
①确定分E-R图实体之间的数据依赖
②求FL的最小覆盖GL,差集为 D=FL-GL
逐一考察D中的函数依赖,确定是否是冗余的联系,若是,就把它去掉
7.4 逻辑结构设计
逻辑结构设计的任务是把概念结构设计阶段设计好的基本E-R图转换为与选用数据库管理系统产品所支持的数据模型相符合的逻辑结构
7.4.1 E-R图向关系模型的转换
将E-R图转换为关系模型:将实体型、实体的属性和实体型之间的联系转化为关系模式
转换内容
将实体型、实体的属性和实体型之间的联系转化为关系模式
转换原则
转换实体
实体类型——>关系模式
属性
标识符——>码
转换联系
1:1联系
①转换为一个独立的关系模式
关系的属性:与该联系相连的各实体的码以及联系本身的属性
关系的候选码:每个实体的码均是该关系的候选码
②与某一端实体对应的关系模式合并
合并后关系的属性:加入对应关系的码和联系本身的属性
合并后关系的码:不变
1:n联系
①转换为一个独立的关系模式
关系的属性:与该联系相连的各实体的码以及联系本身的属性
关系的码:n端实体的码
②与n端对应的关系模式合并
合并后关系的属性:在n端关系中加入1端关系的码和联系本身的属性
合并后关系的码:不变
m:n联系
转换为一个关系模式
关系的属性:与该联系相连的各实体的码以及联系本身的属性
关系的码:各实体码的组合
三个或三个以上实体间的一个多元联系
换为一个关系模式
具有相同码的关系模式可合并
将其中一个关系模式的全部属性加入到另一个关系模式中
去掉其中的同义属性
7.4.2 数据模型的优化
数据库逻辑设计的结果不是唯一的
得到初步数据模型后,还应该适当地修改、调整数据模型的结构,以进一步提高数据库应用系统的性能,这就是数据模型的优化
关系数据模型的优化通常以规范化理论为指导
优化数据模型的方法
确定数据依赖
对于各个关系模式之间的数据依赖进行极小化处理,消除冗余的联系
按照数据依赖的理论对关系模式进行分析,考察是否存在部分函数依赖、传递函数依赖、多值依赖等,确定各关系模式分别属于第几范式。
按照需求分析阶段得到的各种应用对数据处理的要求,分析对于这样的应用环境这些模式是否合适,确定是否要对它们进行合并或分解。
并不是规范化程度越高的关系就越优
对关系模式进行必要分解,提高数据操作效率和存储空间的利用率
水平分解
把(基本)关系的元组分为若干子集合
垂直分解
把关系模式R的属性分解为若干子集合
7.4.3 设计用户子模式
定义用户外模式时应该更注重考虑用户的习惯与方便
针对不同级别的用户定义不同的视图,以保证系统的安全性
简化用户对系统的使用
使用更符合用户习惯的别名
7.5 物理结构设计
数据库的物理结构
数据库在物理设备上的存储结构与存取方法,它依赖于选定的数据库管理系统。
数据库的物理设计
为一个给定的逻辑数据模型选取一个最适合应用要求的物理结构的过程
数据库物理设计的步骤
确定数据库的物理结构
对物理结构进行评价
7.5.3 确定数据库的存储结构
确定数据库物理结构
确定数据的存放位置和存储结构
包括:确定关系、索引、聚簇、日志、备份等的存储安排和存储结构,确定系统配置等
综合考虑存取时间、存储空间利用率和维护代价3个方面的因素
7.5.4 评价物理结构
定量估算各种方案
存储空间
存取时间
维护代价
对估算结果进行权衡、比较,选择出一个较优的合理的物理结构
7.6 数据库的实施和维护
7.6.1 数据的载入和应用程序的调试
数数据库实施阶段两项重要的工作
数据的载人
应用程序的编码和调试
数据库应用程序的设计应该与数据设计并行进行
7.6.2 数据库的试运行
主要工作包括
功能测试
实际运行应用程序,执行对数据库的各种操作,测试应用程序的各种功能
性能测试
测量系统的性能指标,分析是否符合设计目标
特别强调
数据的分期入库
先输入小批量数据供先期联合调试使用,待试运行基本合格后再输入大批量数据,逐步增加数据量,逐步完成运行评价
数据库的转储和恢复
7.6.3 数据库的运行和维护
数据库的转储和恢复
数据库的安全性、完整性控制
数据库性能的监督、分析和改进
数据库的重组织与重构造
重组织
数据库运行一段时间后,由于记录的不断增、删、改,会使数据库的物理存储变坏,从而降低数据库存储空间的利用率和数据的存取效率,使数据库的性能下降。
不修改原设计的逻辑和物理结构
重构造
数据库应用环境发生变化,会导致实体及实体间的联系也发生相应的变化,使原有的数据库设计不能很好地满足新的需求
增加新的应用或新的实体
取消某些已有应用
改变某些已有应用
部分修改数据库的模式和内模式
7.7 小结
数据库的设计过程
数据库各级模式的形成
需求分析阶段:综合各个用户的应用需求(现实世界的需求)
概念设计阶段:概念模式(信息世界模型),用E-R图来描述
逻辑设计阶段:逻辑模式、外模式
物理设计阶段:内模式
概念结构设计
E-R模型的基本概念和图示方法
E-R模型的设计
把E-R模型转换为关系模型的方法
在逻辑设计阶段将E-R图转换成具体的数据库产品支持的数据模型如关系模型,形成数据库逻辑模式
然后根据用户处理的要求,安全性的考虑,在基本表的基础上再建立必要的视图,形成数据的外模式
在物理设计阶段根据DBMS特点和处理的需要,进行物理存储安排,设计索引,形成数据库内模式
第六章 关系数据理论
6.1 问题的提出
关系模式由五部分组成,是一个五元组: R(U, D, DOM, F) 关系名R是符号化的元组语义 U为一组属性 D为属性组U中的属性所来自的域 DOM为属性到域的映射 F为属性组U上的一组数据依赖
数据依赖
是一个关系内部属性与属性之间的一种约束关系,通过属性间值的相等与否体现出来的数据间相互联系
主要类型
函数依赖
多值依赖
关系模式Student<U, F>中存在的问题
数据冗余
浪费大量的存储空间
更新异常
数据冗余 ,更新数据时,维护数据完整性代价大
插入异常
删除异常
6.2 规范化
6.2.1 函数依赖
函数依赖
定义6.1 设R(U)是一个属性集U上的关系模式,X和Y是U的子集。若对于R(U)的任意一个可能的关系r,r 中不可能存在两个元组在X上的属性值相等, 而在Y上的属性值不等, 则称“X函数确定Y”或“Y函数依赖于X”,记作X→Y。
平凡函数依赖与非平凡函数依赖
X→Y,但Y⊈X则称X→Y是非平凡的函数依赖
X→Y,但Y⊆X 则称X→Y是平凡的函数依赖
完全函数依赖与部分函数依赖
定义6.2 在R(U)中,如果X→Y,并且对于X的任何一个真子集X’, 都有 X’ ↛ Y, 则称Y对X完全函数依赖,记作X →(F) Y。
若X→Y,但Y不完全函数依赖于X,则称Y对X部分函数依赖,记作X →(P) Y
传递函数依赖
定义6.3 在R(U)中,如果X→Y(Y⊈X),Y↛X,Y→Z,Z⊈Y, 则称Z对X传递函数依赖。记为:X →(传递) Z。
6.2.2 码
定义6.4 设K为R<U,F>中的属性或属性组合。若K → (F) U,则K称为R的一个候选码
完全函数依赖
如果U函数依赖于K,即K → U,则K称为超码
若关系模式R有多个候选码,则选定其中的一个做为主码
包含在任何一个候选码中的属性 ,称为主属性
整个属性组是码,称为全码
关系模式 R中属性或属性组X 并非 R的码,但 X 是另一个关系模式的码,则称 X 是R 的外部码也称外码
6.2.3 范式
关系数据库中的关系必须满足一定的要求。满足不同程度要求的为不同范式。
范式的种类
第一范式(1NF) 第二范式(2NF) 第三范式(3NF) BC范式(BCNF) 第四范式(4NF) 第五范式(5NF)
从上到下越来越严格
一个低一级范式的关系模式,通过模式分解可以转换为若干个高一级范式的关系模式的集合,这种过程就叫规范化
6.2.4 2NF
若关系模式R∈1NF,并且每一个非主属性都完全函数依赖于任何一个候选码,则R∈2NF
一个关系模式不属于2NF,会产生以下问题
插入异常
删除异常
修改复杂
解决方法
投影分解
6.2.5 3NF
设关系模式R<U,F>∈1NF,且不存在非主属性对码的传递函数依赖
如果R属于3NF,则必有R属于2NF
6.2.9 规范化小结
规范化的基本思想是逐步消除数据依赖中不合适的部分
“一事一地”的模式设计原则
规范化实质上是概念的单一化
关系模式的规范化过程是通过对关系模式的分解来实现的,即把低一级的关系模式分解为若干个高一级的关系模式
6.4 模式的分解
三种模式分解等价的定义
分解具有无损连接性
分解要保持函数依赖
分解既要保持函数依赖,又要具有无损连接性
第五章 数据库完整性
数据库的完整性
数据库的完整性是指数据的正确性和相容性。
数据的正确性
指数据是符合现实世界语义,反映了当前实际状况的
数据的相容性
指数据库同一对象在不同关系表中的数据是符合逻辑的
概念区分
数据完整性
防止数据库中存在不符合语义的数据,也就是防止数据库中存在不正确的数据
防范对象:不合语义的、不正确的数据
数据安全性
保护数据库 防止恶意的破坏和非法的存取
防范对象:非法用户和非法操作
保护数据库 防止恶意的破坏和非法的存取
为了维护数据库完整性,DBMS功能
1.提供定义完整性约束条件的机制
SQL标准使用了一系列概念来描述完整性,包括关系模型的实体完整性、参照完整性和用户定义完整性
2.提供完整性检查的方法
一般在INSERT、UPDATE、DELETE语句执行后开始检查,也可以在事务提交时检查
3.违约处理
数据库管理系统若发现用户的操作违背了完整性约束条件,就采取一定的动作
拒绝(NO ACTION)执行该操作
级连(CASCADE)执行其他操作
关系数据库管理系统使得完整性控制成为其核心支持的功能,从而能够为所有用户提供一致的数据库完整性
5.1 实体完整性
5.1.1 实体完整性定义
关系模型的实体完整性
CREATE TABLE中用PRIMARY KEY定义
单属性构成的码有两种说明方法
定义为列级约束条件
定义为表级约束条件
对多个属性构成的码只有一种说明方法
定义为表级约束条件
5.1.2 实体完整性检查和违约处理
插入或对主码列进行更新操作时,关系数据库管理系统按照实体完整性规则自动进行检查
检查主码值是否唯一,如果不唯一则拒绝插入或修改
检查主码的各个属性是否为空,只要有一个为空就拒绝插入或修改
5.2 参照完整性
5.2.1 参照完整性定义
关系模型的参照完整性定义
在CREATE TABLE中用FOREIGN KEY短语定义哪些列为外码
用REFERENCES短语指明这些外码参照哪些表的主码
5.2.2 参照完整性检查和违约处理
可能破坏参照完整性的情况
参照表
插入元组、修改外码值
拒绝
被参照表
删除元组、修改主码值
拒绝/级联删除/设置为空值
参照完整性违约处理
拒绝(NO ACTION)执行
不允许该操作执行。该策略一般设置为默认策略
级联(CASCADE)操作
当删除或修改被参照表(Student)的一个元组造成了与参照表(SC)的不一致, 则删除或修改参照表中的所有造成不一致的元组
设置为空值(SET-NULL)
当删除或修改被参照表的一个元组时造成了不一致, 则将参照表中的所有造成不一致的元组的对应属性设置为空值。
对于参照完整性,除了应该定义外码,还应定义外码列是否允许空值
on delete cascade
级联删除
on delete action
拒绝删除
5.3 用户定义的完整性
用户定义的完整性是:针对某一具体应用的数据必须满足的语义要求
5.3.1 属性上的约束条件
属性上约束条件的定义
列值非空(NOT NULL)
列值唯一(UNIQUE)
检查列值是否满足一个条件表达式(CHECK)
[例5.8] SC表的Grade的值应该在0和100之间。 CREATE TABLE SC ( Sno CHAR(9) , Cno CHAR(4), Grade SMALLINT CHECK (Grade>=0 AND Grade <=100), ); /*Grade取值范围是0到100*/
属性上的约束条件检查和违约处理
插入元组或修改属性的值时,关系数据库管理系统检查属性上的约束条件是否被满足,如果不满足则操作被拒绝执行
5.3.2 元组上的约束条件
1. 元组上约束条件的定义
在CREATE TABLE时可以用CHECK短语定义元组上的约束条件,即元组级的限制
可以设置不同属性之间的取值的相互约束条件
check ( Ssex='女' OR Sname NOT LIKE'Ms.%')
2. 元组上约束条件检查和违约处理
插入元组或修改属性的值时,关系数据库管理系统检查元组上的约束条件是否被满足,如果不满足则操作被拒绝执行
5.4 完整性约束命名子句
1.完整性约束命名子句
constraint <完整性约束条件名><完整性约束条件>
<完整性约束条件>包括NOT NULL、UNIQUE、PRIMARY KEY短语、FOREIGN KEY短语、CHECK短语等
2. 修改表中的完整性限制
使用ALTER TABLE语句修改表中的完整性限制
ALTER TABLE Student DROP CONSTRAINT C1; ALTER TABLE Student ADD CONSTRAINT C1 CHECK (Sno BETWEEN 900000 AND 999999),
5.6 断言
可以使用 CREATE ASSERTION语句,通过声明性断言来指定更具一般性的约束
可以定义涉及多个表的或聚集操作的比较复杂的完整性约束
断言创建以后,任何对断言中所涉及的关系的操作都会触发关系数据库管理系统对断言的检查,任何使断言不为真值的操作都会被拒绝执行
1. 创建断言的语句格式
create assertion<断言名><CHECK 子句>
每个断言都被赋予一个名字,<CHECK 子句>中的约束条件与WHERE子句的条件表达式类似
2. 删除断言的语句格式
DROP ASSERTION <断言名>;
5.7 触发器
触发器(Trigger)是用户定义在关系表上的一类由事件驱动的特殊过程
触发器保存在数据库服务器中
任何用户对表的增、删、改操作均由服务器自动激活相应的触发器
触发器可以实施更为复杂的检查和操作,具有更精细和更强大的数据控制能力
5.7.1 定义触发器
create trigger <触发器名> { | AFTER} <触发事件> ON <表名> REFERENCING NEW|OLD ROW AS<变量> FOR EACH {ROW | STATEMENT} [WHEN <触发条件>]<触发动作体>
触发器又叫做事件-条件-动作规则
5.8 小结
数据库的完整性是为了保证数据库中存储的数据是正确的
关系数据库管理系统完整性实现的机制
完整性约束定义机制
完整性检查机制
违背完整性约束条件时关系数据库管理系统应采取的动作
第四章 数据库安全性
数据库的安全性是指保护数据库以防止不合法使用所造成的数据泄露、更改或破坏
4.1 数据库安全性概述
4.1.1 数据库的不安全因素
非授权用户对数据库的恶意存取和破坏
数据库中重要或敏感的数据被泄露
安全环境的脆弱性
4.1.2 安全标准简介
TCSEC标准
TCSEC桔皮书
TSCEC/TDI紫皮书,将TCSEC扩展到数据库管理系统
描述安全性级级别划分指标
安全策略
责任
保证
文档
安全级别划分
A1: 验证设计
B3: 安全域
B2: 结构化保护
B1: 标记安全保护
对系统的数据加以标记,对标记的主体和客体实施强制存取控制(MAC)、审计等安全机制
B1级别的产品才被认为是真正意义上的安全产品
C2: 受控的存取保护
C1: 自主安全保护
自主存取控制DAC
保护或限制用户权限的传播
D: 最小保护
CC标准
目前CC已基本取代了TCSEC,成为评估信息产品安全性的主要标准
TCSEC的C1和C2级分别相当于EAL2和EAL3 B1,B2和B3分别相当于EAL4、EAL5 A1对应于EAL7
2001年被我国采用为国家标准
4.2 数据库安全性控制
概述
非法使用数据库的情况
计算机系统的安全模型
系统根据用户标识鉴定用户身份,合法用户才准许进入计算机系统
数据库管理系统还要进行存取控制,只允许用户执行合法操作
操作系统有自己的保护措施
数据以密码形式存储到数据库中
数据库管理系统安全性控制模型
存取控制流程
数据库安全性控制的常用方法
用户标识和鉴定
存取控制
视图
审计
数据加密
4.2.1 用户身份鉴别
用户身份鉴别
系统提供的最外层安全保护措施
用户标识:由用户名和用户标识号组成
用户身份鉴别的方法
静态口令鉴别
动态口令鉴别
生物特征鉴别
智能卡鉴别
4.2.2 存取控制
存取控制机制
定义用户权限
合法权限检查
用户权限定义和合法检查机制一起组成了数据库管理系统的存取控制子系统
常用存取控制方法
自主存取控制
C2级
用户对不同的数据对象有不同的存取权限
不同的用户对同一对象也有不同的权限
用户还可将其拥有的存取权限转授给其他用户
强制存取控制
B1级
每一个数据对象被标以一定的密级
每一个用户也被授予某一个级别的许可证
对于任意一个对象,只有具有合法许可证的用户才可以存取
4.2.3 自主存取控制方法
通过SQL的GRANT语句和REVOKE语句实现
用户权限组成
数据库对象
操作类型
关系数据库的存取控制对象
数据本身
基本表中的数据、属性列上的数据
数据库模式
模式、基本表、视图和索引的创建
注意
遵守表在创建时定义的主码及其他约束
在给用户授予INSERT权限时,一定要包含主码的INSERT权限,否则用户的插入动作会因为主码为空而被拒绝
4.2.4 授权:授予与回收
GRANT
GRANT语句的一般格式
grant <权限>[,<权限>]... ON <对象类型> <对象名>[,<对象类型> <对象名>]… TO <用户>[,<用户>]... [with grant option];
WITH GRANT OPTION子句
指定:可以再授予
没有指定:不能传播
将对指定操作对象的指定操作权限授予指定的用户
发出GRANT
数据库管理员
数据库对象创建者(即属主Owner)
拥有该权限的用户
按受权限的用户
一个或多个具体用户
PUBLIC(即全体用户)
例题
[例4.2] 把对Student表和Course表的全部权限授予用户U2和U3 GRANT ALL PRIVILIGES ON TABLE Student,Course TO U2,U3;
[例4.5] 把对表SC的INSERT权限授予U5用户,并允许他再将此权限授予其他用户 GRANT INSERT ON TABLE SC TO U5 WITH GRANT OPTION;
REVOKE
REVOKE语句的一般格式为
revoke <权限>[,<权限>]... ON <对象类型> <对象名>[,<对象类型><对象名>]… FROM <用户>[,<用户>]...[cascade | restrict];
对象类型别丢了!!
授权
用户可以自主地决定将数据的存取权限授予何人,决定是都也将“授予”的权限授予别人。因此称这样的存取控制是自主存取控制。
创建数据库模式的权限
CREATE USER语句格式
create user <username> [with][DBA|RESOURCE|CONNECT];
只有系统的超级用户才有权创建一个新的数据库用户
新创建的数据库用户的权限
CONNECT权限
不能创建新用户,不能创建模式,也不能创建基本表,只能登录数据库
RESOURCE权限
创建基本表和视图,成为所创建对象的属主。但不能创建模式,不能创建新的用户
DBA权限
可以创建新的用户、创建模式、创建基本表和视图等
4.2.5 数据库角色
角色的创建
create role <角色名>
给角色授权
grant <权限>[,<权限>]… ON <对象类型>对象名 TO <角色>[,<角色>]…
将一个角色授予其他的角色或用户
grant <角色1>[,<角色2>]… TO <角色3>[,<用户1>]… [with admin option]
WITH ADMIN OPTION
获得某种权限的角色或用户还可以把这种权限授予其他角色
角色权限的收回
revoke <权限>[,<权限>]… ON <对象类型> <对象名> FROM <角色>[,<角色>]…
4.2.6 强制存取控制方法
强制存取控制(MAC)
保证更高程度的安全性
用户不能直接感知或进行控制
适用于对数据有严格而固定密级分类的部门
DBMA所管理的全部实体
主体
数据库管理系统所管理的实际用户
代表用户的各进程
客体
文件、基本表、索引、视图
敏感度标记
级别
绝密(TS)
机密(S)
可信(C)
公开(P)
TS>=S>=C>=P
主体的敏感度标记称为许可证级别
客体的敏感度标记称为密级
强制存取控制规则
仅当主体的许可证级别大于或等于客体的密级时,该主体才能读取相应的客体
仅当主体的许可证级别小于或等于客体的密级时,该主体才能写相应的客体
如果违反,就有可能把数据的密级从高流向低,造成数据的邪路
强制存取控制(MAC)是对数据本身进行密级标记,无论数据如何复制,标记与数据是一个不可分的整体,只有符合密级标记要求的用户才可以操纵数据,从而提供了更高级别的安全性
实现强制存取控制时要首先实现自主存取控制
原因:较高安全性级别提供的安全保护要包含较低级别的所有保护
自主存取控制与强制存取控制共同构成数据库管理系统的安全机制
4.3 视图机制
通过视图机制把要保密的数据对无权存取这些数据的用户隐藏起来,对数据提供一定程度的安全保护
视图机制间接地实现支持存取谓词的用户权限定义
4.4 审计
审计功能
C2以上安全级别的DBMS必须具有审计功能
把用户对数据库的所有操作自动记录下来放入审计日志
审计员可以利用审计日志监控数据库中的各种行为,重现导致数据库现有状况的一系列事件,找出非法存取数据的人、时间和内容
1.审计事件
服务器事件
系统权限
语句事件
模式对象事件
2.审计功能
基本功能
提供多种审计查阅方式
提供多套审计规则
提供审计分析和报表功能
审计日志管理功能
提供查询审计设置及审计记录信息的专门视图
3. AUDIT语句和NOAUDIT语句
AUDIT语句:设置审计功能
audit [权限 on [对象名]
audit alter,update on SC;
NOAUDIT语句:取消审计功能
noaudit [权限 on [对象名]
审计分为
用户级审计
任何用户可设置的审计
主要是用户针对自己创建的数据库表和视图进行审计
系统级审计
只能由数据库管理员设置
监测成功或失败的登录要求、监测授权和收回操作以及其他数据库级权限下的操作
数据库安全审计系统提供了一种事后检查的安全机制
4.5 数据加密
加密的基本思想
根据一定的算法将原始数据——明文变换为不可直接识别的格式——密文,从而使得不知道解密算法的人无法获知数据的内容
数据加密
防止数据库中数据在存储和传输中失密的有效手段
加密方法
存储加密
透明存储加密
内核级加密保护方式,对用户完全透明
性能较好,安全完备性较高
非透明存储加密
通过多个加密函数实现
传输加密
链路加密
端到端加密
4.6 其他安全性保护
推理控制
处理强制存取控制未解决的问题
避免用户利用能够访问的数据推知更高密级的数据
例如,利用列的函数依赖关系,用户能从地安全级别信息推导出其无权访问的高安全等级信息,进而导致信息泄露
隐蔽信道
处理强制存取控制未解决的问题
数据隐私保护
控制其不愿他人知道或他人不便知道的个人数据的能力
实体集和实体型的区别
描述的对象不同
实体型:具有相同属性的实体必然的特征,例如学生(学号,性别,出生年月)
实体集:具有相同类型及相同属性的实体的集合,即侧重于实体的集合。例如,全体学生就是一个实体集
组成不同
实体型:组成是实体名及属性。
实体集:组成是实体,由于一个实体集可能有多个属性,每个实体可用(属性、数据值对)构成的集合来表示,对应实体集的每个属性有一个(属性,数据值)对。
用途不同
实体型:用于刻画出全部同质实体的共同特征和性质
实体集:用于表明数据库为实体集当中每个实体存储相似信息