第一章 绪论
概述
数据
定义:描述事物的符号记录
地位:数据库中存储的基本对象
数据的语义:数据的含义,数据与其语义是不可分的
数据库
定义:长期储存在计算机内、有组织的、可共享的大量数据的集合
特点:①数据按一定的数据模型组织、描述和存储
②具有较小的冗余度
③较高的数据独立性
④易扩展性
⑤可为各种用户共享
基本特点:永久存储、有组织、可共享
数据库管理系统
位于用户与操作系统之间的一层数据管理软件
数据库管理系统和操作系统是计算机的基础软件
功能:
- 数据定义功能
-
- 提供数据定义语言 DDL
- 定义数据库中的数据对象
- 数据组织、存储和管理
-
- 分类、存储和管理各种数据
- 确定组织数据的文件结构和存取方式
- 实现数据之间的联系
- 提供存取方法提高存取效率
- 数据操纵功能
-
- 提供数据操纵语言 DML
- 实现对数据库的基本操作
- 数据库的事务管理和运行管理
-
- 数据库在建立、运用和维护时由数据库管理系统统一管理和控制
- 保证数据的安全性、完整性、多用户对数据的并发使用
- 发生故障后的系统恢复
- 数据库的建立和维护功能
-
- 数据库初始数据的输入、转换功能
- 数据库的转储、恢复功能
- 数据库的重组织功能
- 性能监视、分析功能
- 其他功能
-
- 数据库管理系统与网络中其他软件系统的通信功能
- 一个数据库管理系统与另一个数据库管理系统或文件系统的数据转换功能
- 异构数据库之间的互访和互操作功能
数据库系统
定义:数据库系统是由数据库、数据库管理系统、应用程序和数据库管理员组成的存储、管理、处理和维护数据的系统
数据管理技术
数据管理:对数据进行分类、组织、编码、存储、检索和维护,是数据处理的中心问题
发展动力:① 应用需求的推动 ② 计算机硬件、软件的发展
人工管理阶段
特点:
- 数据不保存
- 应用程序管理数据
- 数据不共享
- 数据不具有独立性
文件系统阶段
特点:
- 数据可以长期保存
- 文件系统管理数据
缺点:
- 数据共享性差,冗余度大
- 数据独立性差
数据库系统阶段
从文件系统到数据库系统标志着数据管理技术的飞跃
特点:
- 数据结构化:数据库系统实现整体数据的结构化,不仅是数据库的主要特征之一,也是数据库系统与文件系统的本质区别;不仅数据内部是结构化的,而且整体是结构化的,数据之间是具有联系的
- 数据的共享性高、冗余度低且易扩充:数据共享可以大大减少数据冗余,节约存储空间;数据共享能够避免数据之间的不相容性与不一致性
- 数据独立性高:数据独立性包括数据的物理独立性和逻辑独立性;数据独立性是由数据库管理系统提供的二级映像功能保证
-
- 物理独立性是指用户的应用程序与数据库中数据的物理存储是相互独立的
- 逻辑独立性是指用户的应用程序与数据库的逻辑结构是相互独立的
- 数据由数据库管理系统统一管理和控制
数据库管理系统提供的数据控制功能:
-
- 数据的安全性保护:保护数据以防止不合法使用造成的数据泄密和破坏
- 数据的完整性检测:数据的正确性、有效性和相容性
- 并发控制
- 数据库恢复
总结
数据库是长期存储在计算机内有组织、大量、共享的数据集合。它可以供各种用户共享,具有最小冗余度和较高的数据独立性。
数据库管理系统在数据库建立、运用和维护时对数据库进行统一控制,以保证数据库的完整性和安全性,并在多用户同时使用数据库时进行并发控制,在发生故障后对数据库进行恢复
数据模型
定义:对现实世界数据特征的抽象
地位:数据模型是数据库系统的核心和基础
组成要素:数据结构、数据操作、数据的完整性约束条件
要求:
- 能比较真实地模拟现实世界
- 容易为人所理解
- 便于在计算机上实现
分类:根据应用的不同目的,可分为概念模型、逻辑模型和物理模型
- 概念模型,也称信息模型,是按用户的观点对数据和信息建模,主要用于数据库设计
- 逻辑模型和物理模型
-
- 逻辑模型,按计算机系统的观点对数据建模,主要用于数据库管理系统的实现,主要包括层次模型、网状模型、关系模型、面向对象数据模型和对象关系数据模型、半结构化数据模型
- 物理模型,对数据最底层的抽象,描述数据在系统内部的表示方式和存取方法,或在磁盘或磁带上的存储方式和存取方法,面向计算机系统
首先将现实世界抽象为信息世界,然后将信息世界转换为机器世界
概念模型属于信息世界
现实世界 —> 概念模型 数据库设计人员完成
概念模型 —> 逻辑模型 可以是数据库设计人员完成,也可以用数据库设计工具协助设计人员完成
逻辑模型 —> 物理模型 数据库管理系统完成
组成要素
数据结构:描述数据库的组成对象以及对象之间的联系
数据操作:对数据库中各种对象的实例允许执行的操作的集合,包括操作及有关的操作规则
数据的完整性约束条件:一组完整性规则
常用模型
- 层次模型
- 网状模型
- 关系模型
- 面向对象数据模型
- 对象关系数据模型
- 半结构化数据模型
层次模型和网状模型统称为格式化模型
概念模型
概念模型是现实世界到机器世界的一个中间层次
作用:
- 是现实世界到机器世界的一个中间层次
- 用于信息世界的建模
- 是数据库设计人员进行数据库设计的有力工具
- 是数据库设计人员和用户之间进行交流的语言
信息世界中的基本概念
实体:客观存在并可相互区别的事务
属性:实体所具有的某一特性,一个实体可以由若干个属性刻画
码:唯一标识实体的属性集
实体型:用实体名及其属性名集合抽象和刻画同类实体
实体集:同一类型实体的集合
联系:实体内部的联系通常指组成实体的各属性之间的联系,实体之间的联系通常指不同实体集之间的联系;实体之间的联系有一对一、一对多和多对多等多种类型
表示方法
实体—联系方法 / E-R 方法 / E-R 模型
层次模型
地位:数据库系统中最早出现的数据模型
层次数据库系统只能处理一对多的实体联系
层次模型像一棵倒立的树,结点的双亲是唯一的
数据结构
- 有且只有一个结点没有双亲结点,这个结点称为根节点
- 根以外的其他结点有且只有一个双亲结点
数据操纵
查询、插入、删除、更新
完整性约束
- 进行插入操作时,若没有相应的双亲结点值,则不能插入它的子女结点值
- 进行删除操作时,若删除双亲结点值,则相应的子女结点值也将被同时删除
优点
- 层次模型的数据结构比较简单清晰
- 层次数据库的查询效率高
- 层次数据模型提供良好的完整性支持
缺点
- 现实世界中很多联系是非层次性的,不适合用层次模型表示
- 若一个结点具有多个双亲结点,用层次模型表示这类联系就很笨拙,只能通过引入冗余数据或创建非自然的数据结构解决。对插入和删除操作的限制比较多,故应用程序的编写比较复杂
- 查询子女结点必须通过双亲结点
- 由于结构严谨,层次命令趋于程序化
网状模型
典型代表:DBTG 系统(CODASYL 系统)
数据结构
- 允许一个以上的结点无双亲
- 一个结点可以有多于一个的双亲
层次模型中子女结点与双亲结点的联系是唯一的,而在网状模型中这种联系可以不唯一
优点
- 能够更为直接地描述现实世界
- 具有良好的性能,存取效率较高
缺点
- 结构比较复杂,且随着应用环境的扩大,数据库的结构变得越来越复杂,不利于最终用户掌握
- 网状模型的 DDL 、DML 复杂,并且要嵌入某一种高级语言中,用户不容易掌握,不容易使用
- 由于记录之间的联系是通过存取路径实现的,应用程序在访问数据时必须选择适当的存取路径,因此用户必须了解系统结构的细节,加重编写应用程序的负担
关系模型
地位:关系模型是最重要的一种数据模型
关系模型要求关系必须是规范化的,关系的每一个分量必须是一个不可分的数据项
术语
关系:一个关系对应通常说的一张表
元组:表中的一行即为一个元组
属性:表中的一列即为一个属性,给每一个属性起一个名称即属性名
码:也称为码键,表中的某个属性组,可以唯一确定一个元组
域:一组具有相同数据类型的值的集合,属性的取值范围来自某个域
分量:元组中的一个属性值
关系模式:对关系的描述,表示 关系名(属性1,属性2,...,属性n)
数据操纵
操作对象和操作结果都是关系
关系模型把存取路径向用户隐蔽起来,用户只要指明“干什么”或“找什么”,不必详细说明“怎么干”或“怎么找”
完整性约束
关系的完整性约束条件包括实体完整性、参照完整性和用户定义的完整性
优点
- 关系模型与格式化模型不同,建立在严格的数学概念的基础上
- 关系模型的概念单一
- 关系模型的存取路径对用户透明
数据库系统的结构
数据库开发人员——三级模式结构——数据库系统内部的系统结构
数据库最终用户——单用户结构、主从式结构、分布式结构、客户-服务器、浏览器-应用服务器/数据库服务器——数据库系统外部的体系结构
数据库系统模式的概念
型:对某一类数据的结构和属性的说明
值:型的一个具体赋值
模式:数据库中全体数据的逻辑结构和特征的描述,仅涉及型的描述,不涉及具体的值
模式是相对稳定的,实例时相对变动的
三级模式结构
模式
别称:全局模式、逻辑模式
介绍:是数据库中全体数据的逻辑结构和特征的描述,是所有用户的公共数据视图,是数据库系统模式结构的中间层,既不涉及数据的物理存储细节和硬件环境,又与具体的应用程序、所使用的应用开发工具及高级程序设计语言无关
数量:一个数据库只有一个模式
外模式
别称:子模式、用户模式、局部模式
介绍:是数据库用户能够看见和使用的局部数据的逻辑结构和特征的描述,是数据库用户的数据视图,是与某一应用有关的数据的逻辑表示
数量:一个数据库可以有多个外模式
内模式
别称:物理模式、存储模式
介绍:是数据物理结构和存储方式的描述,是数据在数据库内部的组织方式
数量:一个数据库只有一个内模式
二级映像
外模式 / 模式 映像
当模式改变时,由数据库管理员对各个外模式/模式的映像作相应改变,可以使外模式保持不变。应用程序是依据数据的外模式编写的,从而应用程序不必修改,保证了数据与程序的逻辑独立性,简称数据的逻辑独立性
模式 / 内模式 映像
当数据库的存储结构改变时,由数据库管理员对模式/内模式映像作相应改变,可以使模式保持不变,从而应用程序也不必改变。保证了数据与程序的物理独立性,简称数据的物理独立性
数据库系统的组成
数据库系统一般由数据库、数据库管理系统、应用程序和数据库管理员组成
硬件平台及数据库
- 有足够大的内存
- 有足够大的外存
- 有较高的通道能力,以提高数据传送率
软件
- 数据库管理系统
- 支持数据库管理系统运行的操作系统
- 具有与数据库接口的高级语言及其编译系统
- 以数据库管理系统为核心的应用开发工具
- 为特定应用环境开发的数据库应用系统
人员
数据库管理员 DBA
具体职责:
- 决定数据库中的信息内容和结构
- 决定数据库的存储结构和存取策略
- 定义数据的安全性要求和完整性约束条件
- 监控数据的使用和运行
- 数据库的改进和重组、重构
系统分析员
具体指责:
- 负责应用系统的需求分析和规范说明
- 和用户及数据库管理员相结合,确定系统的硬件软件配置
- 参与数据库系统的概要设计
数据库设计人员
具体职责:
- 负责数据库中数据的确定及数据库各级模式的设计
- 参与用户需求调查和系统分析
应用程序员
具体职责:负责设计和编写应用系统的程序模块,并进行调试和安装
用户
最终用户:通过应用系统的用户接口使用数据库
最终用户分类:
- 偶然用户:每次访问数据库需要不同的数据库信息
- 简单用户:查询和更新数据库
- 复杂用户:能够直接使用数据库语言访问数据库,甚至能够基于数据库管理系统的应用程序接口编制自己的应用程序
第二章 关系数据库
关系
关系模型的数据结构非常简单,只包含单一的数据结构——关系
关系模型中数据的逻辑结构是一张扁平的二维表
域
定义:一组具有相同数据类型的值的集合
笛卡儿积
定义:
关系
定义:
类型:基本关系(基本表或基表)、查询表和视图表
- 基本表:实际存在的表,是实际存储数据的逻辑表示
- 查询表:查询结果对应的表
- 视图表:由基本表或其他视图表导出的表,是虚表,不对应实际存储的数据
当关系作为关系数据模型的数据结构时,需要给予如下的限定和扩充:
- 无限关系在数据库系统中是无意义的,故限定关系数据模型中的关系必须是有限集合
- 通过为关系的每个列附加一个属性名的方法取消关系属性的有效性
基本关系的性质:
- 列是同质的,即每一列中的分量是同一类型的数据,来自同一个域
- 不同的列可出自同一个域,称其中的每一列为一个属性,不同的属性要给予不同的属性名
- 列的顺序无所谓,即列的次序可以任意交换
- 任意两个元组的候选码不能取相同的值
- 行的顺序无所谓,即行的次序可以任意交换
- 分量必须取原子值,即每一个分量都必须是不可分的数据项
关系模式
关系模式是型,关系是值
关系模式是静态的、稳定的,而关系是动态的、随时间不断变化的,因为关系操作在不断地更新着数据库中的数据
定义:关系的描述
形式化地表示:R(U,D,DOM,F)
简记:R(U)
或 R(A1,A2,...,An)
关系数据库
定义:在一个给定地应用领域中,所有关系的集合构成一个关系数据库
关系数据库的型称为关系数据库模式,是对关系数据库的描述
关系数据库的值是关系模式在某一时刻对应的关系的集合,称为关系数据库
关系操作
基本的关系操作
关系模型中常用的关系操作包括查询操作和插入、删除、修改操作两大部分
- 查询操作可分为选择、投影、连接、除、并、差、交、笛卡儿积等
5 种基本操作:选择、投影、并、差、笛卡儿积
关系操作的特点:集合操作方式,操作的对象和结果都是集合
关系数据语言的分类
SQL
结构化查询语言 SQL
SQL 的功能:
- 查询功能
- 数据定义和数据控制功能
SQL 是集查询、数据定义语言、数据操纵语言和数据控制语言于一体的关系数据语言
SQL 语言是一种高度非过程化的语言
关系的完整性
关系模型中有三类完整性约束:
- 实体完整性
- 参照完整性
- 用户定义的完整性
实体完整性和参照完整性是关系模型必须满足的完整性约束条件,故称为关系的两个不变性
实体完整性
保证关系数据库中每个元组是可区分的,是唯一的
实体完整性规则:若属性 A 是基本关系 R 的主属性,则 A 不能取空值
说明:
- 实体完整性规则是针对基本关系而言的,一个基本表通常对应现实世界的一个实体集
- 现实世界中的实体是可区分的,即他们具有某种唯一性标识
- 关系模型中以主码作为唯一性标识
- 主码中的属性不能取空值
参照完整性
参照完整性规则:若属性(或属性组)F 是基本关系 R 的外码,它与基本关系 S 的主码 KS 相对应,则对于 R 中的每个元组在 F 上的值必须:
- 或者取空值
- 或者等于 S 中某个元组的主码值
关系代数
定义:一种抽象的查询语言,用对关系的运算表达查询
运算的三大要素:运算对象、运算符、运算结果
运算对象:关系
运算结果:关系
运算符:
- 集合运算符:交、并、差、笛卡儿积 —— 传统的集合运算
- 专门的关系运算符:选择、投影、连接、除 —— 专门的关系运算
传统的集合运算
传统的集合运算是二目运算,包括交、并、差、笛卡儿积
运算前提:关系 R 和关系 S 具有相同的目 n(即两个关系都有 n 个属性),且相应的属性取自同一个域
并
记作:R∪S={t|t∈R∨t∈S}
结果:n 目关系,由属于 R 或属于 S 的元组组成
交
记作:R∩S={t|t∈R∧t∈S}
结果:n 目关系,由既属于 R 又属于 S 的元组组成
用差表示:R ∩ S = R-(R-S)
差
记作:R-S={t|t∈R∧t∉S}
结果:n 目关系,由属于 R 且不属于 S 的元组组成
笛卡儿积
两个分别为 n 目和 m 目的关系 R 和 S 的笛卡儿积是一个(n+m)列的元组的集合
若 R 有 k1 个元组,S 有 k2 个元组,则关系 R 和关系 S 的笛卡儿积有 k1*k2 个元组
记作:
专门的关系运算
专门的关系运算包括选择、投影、连接和除运算等
选择
别称:限制
记作:
F 表示选择条件,是一个逻辑表达式,去逻辑值“真”或“假”
逻辑表达式 F 的基本形式:X1θX2
投影
关系 R 上的投影是从 R 中选择出若干属性列组成新的关系
记作:
A 为 R 中的属性列
投影操作是从列的角度进行的运算
投影之后不仅取消了原关系中的某些列,而且还可能取消某些元组,因为取消某些属性列后,可能出现重复行,应取消这些完全相同的行
连接
别称:θ 连接
作用:从两个关系的笛卡儿积中选取属性间满足一定条件的元组
记作:
等值连接:θ 为“=”的连接运算
自然连接:一种特殊的等值连接,要求两个关系中进行比较的分量必须是同名的属性组,并且在结果中去掉重复的属性列
悬浮元组:被舍弃的元组
外连接:把悬浮元组保存在结果关系中,在其他属性上填空值
左外连接:只保留左边关系 R 中的悬浮元组
右外连接:只保留右边关系 S 中的悬浮元组
除运算
设关系 R 除以关系 S 的结果为关系 T,则 T 包含所有在 R 但不在 S 中的属性及其值,且 T 的元组与 S 的元组的所有组合都在 R 中
用象集定义除法:
第三章 关系数据库标准语言 SQL
结构化查询语言 SQL 是关系数据库的标准语言,也是一个通用的、功能极强的关系数据库语言
SQL 概述
SQL 的特点
- 综合统一
SQL 集数据定义语言、数据操纵语言、数据控制语言的功能于一体,语言风格统一,可以独立完成数据库生命周期中的全部活动,包括:
-
- 定义和修改、删除关系模式,定义和删除视图,插入数据,建立数据库
- 对数据库中的数据进行查询和更新
- 数据库的重构和维护
- 数据库安全性、完整性控制,以及事务控制
- 嵌入式 SQL 和动态 SQL 定义
- 高度非过程化
- 面向集合的操作方式
非关系数据模型采用的是面向记录的操作方式,操作对象是一条记录
- 以同一种语法结构提供多种使用方式
SQL 既是独立的语言,又是嵌入式语言
- 语言简洁,易学易用
SQL 的基本概念
外模式包括若干视图和部分基本表,模式包括若干基本表,内模式包括若干存储文件
基本表是本身独立存在的表,在数据库管理系统中一个关系就对应一个基本表,一个或多个基本表对应一个存储文件,一个表可以带若干索引,索引也存放在存储文件中
存储文件的逻辑结构组成了关系数据库的内模式,存储文件的物理结构对最终用户是隐蔽的
视图是从一个或几个基本表导出的表。它本身不独立存储在数据库中,即数据库中只存放视图的定义而不存放视图对应的数据。这些数据仍存放在导出视图的基本表中,因此视图是一个虚表。视图在概念上与基本表等同,用户可以在视图上再定义视图
数据定义
一个关系数据库管理系统的实例中可以建立多个数据库,一个数据库中可以建立多个模式,一个模式下通常包括多个表、视图和索引等数据库对象
模式
定义模式
create schema <模式名> authorization <用户名>
若未指定模式名,则模式名隐含为用户名
创建模式,调用该命令的用户必须拥有数据库管理员权限,或者获得了数据库管理员授予的 create schema
的权限
定义模式实际上定义了一个命名空间,在这个空间中可以进一步定义该模式包含的数据库对象
用户可以在创建模式的同时在这个模式定义中进一步创建基本表、视图,定义授权
删除模式
drop schema <模式名> cascade|restrict
- cascade:级联
- restrict:限制,默认
基本表
定义基本表
create table <表名>(
<列明> <数据类型> [完整性约束条件]
......
)
主码:primary key
唯一:unique
非空:not null
候选码:foreign key (列名) references 表名(列名)
修改基本表
alter table <表名>
添加新的一列:add [column] <新列名> <数据类型> [完整性约束]
添加完整性约束:add <表级完整性约束>
删除列:drop [column] <列名> [cascade|restrict]
,新增加的列一律为空值
删除完整性约束:drop constraint <完整性约束名> [cascade|restrict]
修改数据类型:alter column <列名> <数据类型>
修改列名:增加新列,删除原来的一列
删除基本表
drop table <表名> cascade|restrict
默认 restrict
索引
建立索引是加快查询速度的有效手段
建立和删除索引由数据库管理员或表的属主,即建立表的人,负责完成
关系数据库管理系统在执行查询时会自动选择合适的索引作为存取路径,用户不必也不能显式地选择索引
建立索引
create [unique] [cluster] index 索引名
on <表名> (<列名> [<次序>],...)
升序 asc,降序 desc,默认 asc
unique 表明此索引的每一个索引值只对应唯一的数据记录
cluster 建立的是聚簇索引,聚簇索引一个表只建立一个
修改索引
重新命名:alter index <旧索引名> rename to <新索引名>
删除索引
drop index <索引名>
数据查询
数据查询是数据库的核心操作
group by 出现时,having 可能不出现;但 having 出现时,group by 一定出现
聚簇函数
统计元组个数:count(*)
统计一列中值的个数:count([distinct|all] <列名>)
计算一列值的总和(此列必须是数值型):sum([distinct|all] <列名>)
计算一列值的平均值(此列必须是数值型):avg([distinct|all] <列名>)
求一列值中的最大值:max([distinct|all] <列名>)
求一列值中的最小值:min([distinct|all] <列名>)
数据更新
数据更新操作有三种:向表中添加若干行数据、修改表中的数据和删除表中的若干行数据
插入数据
插入语句 insert 通常有两种形式,一种是插入元组,另一种是插入子查询结果
插入元组
insert
into <表名> (属性列1,属性列2,...)
values (常量1,常量2,...);
into 子句中没有出现的属性列,新元组在这些列上将取空值,在表定义时说明 not null 的属性列不能取空值
若 into 子句中没有指明任何属性列,则新插入的元组必须在每个属性列上均有值
插入子查询结果
insert
into <表名> (属性列1,属性列2,...)
子查询;
修改数据
update <表名>
set <列名>=<表达式>,...
where;
删除数据
delete
from <表名>
where;
空值的处理
空值的产生
插入、外连接
空值的判断
is null , is not null
空值的约束条件
- 存在约束条件 not null 时,不可以取空值
- 主码不可以取空值
空值的运算
视图
定义:从一个或几个基本表或视图导出的表
与基本表不同,是一个虚表
数据库中只存放视图的定义,而不存放视图对应的数据,这些数据仍存放在原来的基本表中,一旦基本表中的数据发生变化,从视图中查询出的数据就随之改变
定义视图
建立视图
create view <视图名> (列名1,列名2,...)
as <子查询>
with check option;
表示对视图进行 update、insert、delete 操作时要保证更新、插入或删除行满足视图定义中的谓词条件
组成视图的属性列或者全部省略或者全部指定
若省略了视图的各个属性列名,则隐含该视图由子查询中 select 子句目标列中的诸字段组成
以下情况必须明确指定组成视图的所有列名:
- 某个目标列不是单纯的属性名,而是聚集函数或列表达式
- 多表连接时选出几个同名列作为视图的字段
- 需要在视图中为某个列启用新的更合适的名字
关系数据库管理系统执行 create view 语句的结果只是把视图的定义存入数据字典,并不执行其中的 select 语句,在对视图查询时,才按视图的定义从基本表中将数据查出
行列子集视图:从单个基本表导出的视图,并且只是去掉了基本表的某些行和某些列,但保留了主码
视图不仅可以建立在一个或多个基本表上,也可以建立在一个或多个已定义好的视图上,或定义在基本表与视图上
分组视图:带有聚集函数和 group by 子句的查询定义的视图
删除视图
drop view <视图名> [cascade];
视图删除后视图的定义将从数据字典中删除
基本表删除后,由该基本表导出的所有视图均无法使用了,但是视图的定义没有从字典中清除。删除这些视图定义需要显式地使用 drop view 语句
查询视图
关系数据库管理系统执行对视图地查询时,首先进行有效性检查。检查查询中涉及的表、视图等是否存在。如果存在,则从数据字典中取出视图的定义,把定义中的子查询和用户的查询结合起来,转换成等价的对基本表的查询,然后在执行修正了的查询,这一转换过程称为视图消解
where 子句中不能用聚集函数作为条件表达式
定义视图并查询视图与基于派生表的查询是有区别的,视图一旦定义,其定义将永久保存在数据字典中,之后的所有查询都可以直接引用该视图。而派生表只是在语句执行时的临时定义,语句执行后该定义即被删除
更新视图
由于视图是不实际存储数据的虚表,因此对视图的更新最终要转换为对基本表的更新
一般地,行列子集视图是可更新的
视图的作用
- 视图能够简化用户的操作
- 视图使用户能以多种角度看待同一数据
- 视图对重构数据库提供了一定程度的逻辑独立性
- 视图能够对机密数据提供安全保护
- 适当利用视图可以更清晰地表达查询
第四章 数据库安全性
数据库安全性概述
数据库的安全性是指保护数据库以防止不合法使用所造成的数据泄露、更改或破坏
数据库的不安全因素
- 非授权用户对数据库的恶意存取和破坏
- 数据库中重要或敏感的数据被泄露
- 安全环境的脆弱性
安全标准简介
从 4 个方面描述安全性级别划分的标准,即安全策略、责任、保证和文档
4 组 7 个等级
D 级
最低级别
保留 D 级的目的是为了将一切不符合更高标准的系统统统归于 D 组
C1 级
只提供了非常初级的自主安全保护,能够实现对用户和数据的分离,进行自主存取控制,保护或限制用户权限的传播
C2 级
实际上是安全产品的最低档,提供受控的存取保护,将 C1 级的自主存取控制进一步细化,以个人身份注册负责,并实施审计和资源隔离
产品名称往往不突出“安全”这一特色
B1 级
标记安全保护
对统计的数据加以标记,并对标记的主体和客体实施强制存取控制以及审计等安全机制
B1 级别的产品才被认为是真正意义上的安全产品
产品冠以“安全”或“可信的”字样
B2 级
结构化保护
建立形式化的安全策略模型,并对系统内的所有主体和客体实施自主存取控制和强制存取控制
B3 级
安全域
TCB 满足访问监控器的要求,审计跟踪能力更强,并提供系统恢复过程
A1 级
验证设计,即提供 B3 级保护的同时给出系统的形式化设计说明和验证,以确信各安全保护真正实现
数据库安全性控制
用户身份鉴别
用户身份鉴别是数据库管理系统提供的最外层安全保护措施
静态口令鉴别
当前最常用的鉴别方法
静态口令一般由用户自己设定,鉴别时只要按要求输入正确的口令,系统将允许用户使用数据库管理系统
口令是静态不变的
数据库管理系统从口令的复杂度,口令的管理、存储及传输等方面保障口令的安全可靠
动态口令鉴别
目前较为安全的鉴别方式
口令是动态变化的
每次鉴别时均需使用动态产生的新口令登录数据库管理系统,即采用一次一密的方法
生物特征鉴别
是一种通过生物特征进行认证的技术,生物特征是指生物体唯一具有的,可测量、识别和验证的稳定生物特性
智能卡鉴别
智能卡是一种不可复制的硬件,内置集成电路的芯片,具有硬件加密功能
存取控制
存取控制机制主要包括定义用户权限和合法权限检查两部分
- 定义用户权限,并将用户权限登记到数据字典中
用户对某一数据对象的操作权力称为权限
数据库管理系统必须提供适当的语言来定义用户权限,这些定义经过编译后存储在数据字典中,被称做安全规则或授权规则
- 合法权限检查
定义用户权限和合法权限检查机制一起组成了数据库管理系统的存取控制子系统
C2 级的数据库管理系统支持自主存取控制,B1 级的数据库管理系统支持强制存取控制
自主存取控制:用户对于不同的数据库对象有不同的存取权限,不同的用户对同一对象也有不同的权限,而且用户还可以将其拥有的存取权限转授给其他用户
强制存取控制:每一个数据库对象被标以一定的密级,每一个用户也被授予某一个级别的许可证,对于任意一个对象,只有具有合法许可证的用户才可以存取
自主存取控制方法
主要通过 SQL 的 grant 语句和 revoke 语句实现
用户权限的组成要素:数据库对象和操作类型
授权:定义存取权限
授权:授予与收回
grant
一般格式:
grant <权限>,...
on 对象类型 对象名,...
to 用户,...
with grant option;
获得某种权限的用户还可以把这种权限再授予其他的用户
不允许循环授权,即被授权者不能把权限再授回给授权者或其祖先
revoke
一般格式:
revoke <权限>,...
on 对象类型 对象名,...
from 用户,...
只能收回自己给出的权限,对于别人给出的权限,无法收回
数据库管理员拥有对数据库中所有对象的所有权限,并可以根据实际情况将不同的权限授予不同的用户
用户对自己建立的基本表和视图拥有全部的操作权限,并且可以用 grant 语句把其中某些权限授予其他用户。被授权的用户如果有“继续授权”的许可,还可以把获得的权限再授予其他用户
用户可以“自主”地决定将数据的存取权限授予何人、决定是否也将“授权”的权限授予别人,故这样的存取控制是自主存取控制
创建数据库模式的权限
创建数据库模式一类的数据库对象的授权由数据库管理员在创建用户时实现
create user <username> [with] [DBA|RESOURCE|CONNECT];
说明:
- 只有系统的超级用户才有权创建一个新的数据库用户
- 新创建的数据库用户有三种权限:connect、resource、dba
- create user 命令中如果没有指定创建的新用户的权限,默认该用户拥有 connect 权限。拥有 connect 权限的用户不能创建新用户,不能创建模式,也不能创建基本表,只能登录数据库。由数据库管理员或其他用户授予他应有的权限,根据获得的授权情况他可以对数据库对象进行权限范围内的操作
- 拥有 resource 权限的用户能创建基本表和视图,成为所创建对象的属主,但不能创建模式,不能创建新的用户。数据库对象的属主可以使用 grant 语句把该对象上的存取权限授予其他用户
- 拥有 DBA 权限的用户是系统中的超级用户,可以创建新的用户、创建模式、创建基本表和视图等;DBA 拥有对所有数据库对象的存取权限,还可以把这些权限授予一般用户
数据库角色
数据库角色是被命名的一组与数据库操作相关的权限,角色是权限的集合
可以为一组具有相同权限的用户创建一个角色,使用角色来管理数据库权限可以简化授权的过程
角色的创建
create role <角色名>
刚创建的角色是空的,没有任何内容
给角色授权
grant 权限,...
on <对象类型> 对象名,...
to 角色1,...
数据库管理j员和用户可以利用 grant 语句将权限授予某一个或某几个角色
将一个角色授予其他的角色或用户
grant 角色1,...
to 角色2,...
with admin option;
获得某种权限的角色或用户可以把这种权限再授予其他的角色
一个角色包含的权限包括直接授予这个角色的全部权限加上其他角色授予这个角色的全部权限
角色权限的回收
revoke 权限
on 对象类型 对象名
from 角色1,...
用户可以收回角色的权限,从而修改角色拥有的权限
revoke 动作的执行者或者是角色的创建者,或者拥有在这些角色上的 admin option
强制存取控制方法
强制存取控制不是用户能直接感知或进行控制的,适用于对数据有严格而固定密级分类的部门
在强制存取控制中,数据库管理系统所管理的全部实体被分为主体和客体两大类
主体是系统中的活动实体,既包括数据库管理系统所管理的实际用户,也包括代表用户的各进程
客体是系统中的被动实体,是受主体操纵的,包括文件、基本表、索引、视图等
对于主体和客体,数据库管理系统为它们每个实例指派一个敏感度标记
敏感度标记被分成若干级别,例如绝密 TS、机密 S、可信 C、公开 P 等
密级的次序:TS>=S>=C>=P
主体的敏感度标记称为许可证级别
客体的敏感度标记称为密级
强制存取控制机制就是通过对比主体的敏感度标记和客体的敏感度标记,最终确定主体是否能够存取客体
规则:
- 仅当主体的许可证级别大于或等于客体的密级时,该主体才能读取相应的客体【用户读同级或低级数据】
- 仅当主体的许可证级别小于或等于客体的密级时,该主体才能写相应的客体【用户写同级或高级数据】
强制存取控制是对数据本身进行密级标记,无论数据如何复制,标记与数据是一个不可分的整体,只有符合密级标记要求的用户才可以操纵数据,从而提供了跟高级别的安全性
视图机制
为不同的用户定义不同的视图,把数据对象限制在一定的范围内,即通过视图机制把要保密的数据对无权存取的用户隐藏起来,从而自动对数据提供一定程度的安全保护
审计
审计功能是数据库管理系统达到 C2 以上安全级别不可少的一项指标
审计功能把用户对数据库的所有操作自动记录下来放入审计日志中,审计员可以利用审计日志监控数据库中的各种行为,重现导致数据库现有状况的一系列事情,找出非法存取数据的人、时间和内容等
审计功能很费时间和空间,数据库管理系统往往将审计设置为可选特征,运行数据库管理员根据具体应用对安全性的要求灵活地打开或关闭审计功能
审计功能主要用于安全性要求较高的部门
审计事件
审计事件的类别:
- 服务器事件:审计数据库服务器发生的事件,包括数据库服务器的启动、停止、数据库服务器配置文件的重新加载
- 系统权限:对系统拥有的结构或模式对象进行操作的审计,要求该操作的权限是通过系统权限获得的
- 语句事件:对 SQL 语句及 DCL 语句的审计
- 模式对象事件:对特定模式对象上进行的 select 或 DML 操作的审计,模式对象包括表、视图、存储过程、函数等,模式对象不包括依附于表的索引、约束、触发器、分区表等
审计功能
- 基本功能,提供多种审计查阅方式:基本的、可选的、有限的……
- 提供多套审计规则,审计规则一般在数据库初始化时设定,以方便审计员管理
- 提供审计分析和报表功能
- 审计日志管理功能,包括为防止审计员误删审计记录,审计日志必须先转储后删除;对转储的审计记录文件提供完整性和保密性保护;只允许审计员查阅和转储审计记录,不允许任何用户新增和修改审计记录
- 系统提供查询审计设置及审计记录信息的专门视图,对于系统权限级别、语句级别及模式对象级别的审计记录也可通过相关的系统表直接查看
audit 语句和 noaudit 语句
audit 语句用来设置审计功能
audit 操作1,...
on 表名;
noaudit 语句取消审计功能
noaudit 操作1,...
on 表名;
审计一般分为用户级审计和系统级审计
- 用户级审计是任何用户可设置的审计,主要是用户针对自己创建的数据库表或视图进行审计,记录所有用户对这些表或视图的一切成功和不成功的访问要求以及各种类型的 SQL 操作
- 系统级审计只能由数据库管理员设置,用以监测成功或失败的登录要求、监测授权和收回操作以及其他数据库级权限下的操作
数据库安全审计系统提供了一种事后检查的安全机制
数据加密
数据加密是防止数据库数据在存储和传输中失密的有效手段
加密的基本思想:根据一定的算法将原始数据——明文变换为不可直接识别的格式——密文,从而使得不知道解密算法的人无法获知数据的内容
数据加密主要包括存储加密和传输加密
存储加密
对于存储加密,一般提供透明和非透明两种存储加密方式
- 透明存储加密是内核级加密保护方式,对用户完全透明
-
- 透明存储加密是数据在写到磁盘时对数据进行加密,授权用户读取数据时再对其进行解密
- 由于数据加密对用户透明,数据库的应用程序不需要做任何修改,只需在创建表语句中说明需加密的字段即可
- 当对加密数据进行增、删、改、查询操作时,数据库管理系统将自动对数据进行加、解密工作
- 基于数据库内核的数据存储加密、解密方法性能良好,安全完备性较高
- 非透明存储加密则是通过多个加密函数实现的
传输加密
常用的传输加密方式如链路加密和端到端加密
- 链路加密:对传输数据在链路层进行加密,其传输信息由报头和报文两部分组成,前者是路由选择信息,而后者是传送的数据信息,这种方式对报头和报文均加密
- 端到端加密:对传输数据在发送端加密,接收端解密,只加密报文,不加密报头;与链路加密相比,端对端加密只在发送端和接收端需要密码设备,而中间节点不需要密码设备,因此它所需密码设备数量相对较少;但这种方式不加密报头,从而容易被非法监听者发生并从中获取敏感信息
其他安全性保护
推理控制
处理对象:强制存取控制未解决的问题
目的:避免用户利用其能够访问的数据推知更高密级的数据
隐蔽信道
处理对象:强制存取控制未解决的问题
数据隐私
目的:控制不愿被他人知道或他人不便知道的个人数据的能力
第五章 数据库完整性
数据库的完整性是指数据的正确性和相容性
数据的正确性:指数据是符合现实世界语义、反映当前实际状况的
数据的相容性:指数据库同一对象在不同关系表中的数据是符合逻辑的
数据的完整性和安全性是两个既有联系又不尽相同的概念
数据的完整性是为了防止数据库中存在不符合语义的数据,也是防止数据库中存在不正确的数据
数据的安全性是保护数据库防止恶意破坏和非法存取
完整性检查和控制的防范对象是不合语义的、不正确的数据,防止它们进入数据库
安全性控制的防范对象是非法用户和非法操作,防止他们对数据库数据的非法存取
为维护数据库的完整性,数据库管理系统必须实现的功能:
- 提供定义完整性约束条件的机制
完整性约束条件也称为完整性规则,是数据库中的数据必须满足的语义约束条件
- 提供完整性检查的方法
一般在 insert 、update 、delete 语句执行后开始检查,也可以在事务提交时检查
- 进行违约处理
实体完整性
定义实体完整性
- 单个属性构成的码:可定义为列级约束条件或表级约束条件
- 多个属性构成的码:只可定义为表级约束条件
实体完整性检查和违约处理
自动检查:
- 检查主码值是否唯一,如果不唯一则拒绝插入或修改
- 检查主码的各个属性是否为空,只要有一个为空就拒绝插入或修改
检查记录中主码值是否唯一的一种方法是进行全表扫描,依次判断表中的每一条记录的主码值与将插入记录的主码值是否相同
为了避免对基本表进行全表扫描,关系数据库管理系统一般都在主码上自动建立一个索引
参照完整性
定义参照完整性
foreign key 属性名 references 表名(属性名)
参照完整性检查和违约处理
对被参照表和参照表进行增、删、改操作时有可能破坏参照完整性
处理方法:
- 拒绝执行
不允许该操作执行,默认策略
- 级联操作
当删除或修改被参照表的一个元组导致参照表的不一致时,删除或修改参照表中的所有导致不一致的元组
- 设置为空值
当删除或修改被参照表的一个元组时造成了不一致,则将参照表中的所有造成不一致的元组的对应属性设置为空值
用户定义的完整性
属性上的约束条件
属性上约束条件的定义
- 非空:not null
- 列值唯一:unique
- 检查列值是否满足一个条件表达式(check 短语)
属性上约束条件的检查和违约处理
插入元组或修改属性的值时,关系数据库管理系统检查属性上的约束条件是否被满足,不满足则拒绝执行
元组上的约束条件
元组上约束条件的定义
元组级的限制可以设置不同属性之间的取值的相互约束条件
元组上约束条件的检查和违约处理
插入元组或修改属性的值时,关系数据库管理系统检查元组上的约束条件是否被满足,不满足则操作被拒绝执行
完整性约束命名子句
constraint 完整性约束条件名 完整性约束条件
断言
断言创建以后,任何对断言中所涉及关系的操作的都会触发关系数据库管理系统对断言的检查,任何使断言不为真的操作都会被拒绝执行
创建断言的语句格式
create assertion 断言名 check子句
删除断言的语句格式
drop assertion 断言名
触发器
定义:触发器是用户定义在关系表上的一类由事件驱动的特殊过程
保存:触发器一旦定义,将被保存在数据库服务器中
激活:任何用户对表的增、删、改操作均由服务器自动激活相应的触发器,在关系数据库管理系统核心层进行集中的完整性控制
定义触发器
触发器又叫做事件-条件-动作规则,当特定的系统事件发生时,对规则的条件进行检查,如果条件成立则执行规则中的动作,否则不执行该动作
建立触发器:
create trigger 触发器名
{before|after} 触发事件 on 表名
referencing new|old row as 变量
for each{row|statement}
[when 触发条件] 触发动作体
详细说明:
- 只有表的拥有者,即创建表的用户才可以在表上创建触发器,并且一个表上只能创建一定数量的触发器。触发器的具体数量由具体的关系数据库管理系统在设计时确定
- 触发器名:触发器名可以包含模式名,也可以不包含模式名,同一模式下,触发器名必须是唯一的,并且触发器名和表名必须在同一模式下
- 表名:触发器只能定义在基本表上,不能定义在视图上,当基本表的数据发生变化时,将激活定义在该表上相应触发事件的触发器,因此此表也称为触发器的目标表
- 触发事件:触发事件可以是
insert
、delete
、update
,也可以是这几个事件的组合,还可以是update of 触发列
进一步指明修改哪些列时激活触发器;after/before
是触发的时机,after
表示在触发事件的操作执行之后激活触发器,before
表示在触发事件的操作执行之前激活触发触发器 - 触发器类型:触发器按照所触发动作的间隔尺寸可以分为行级触发器
for each row
和语句级触发器for each statement
- 触发条件:触发器被激活时,只有当触发条件为真时出发动作体才执行,否则触发动作体不执行。如果省略
when
触发条件,则触发动作体在触发器激活后立即执行 - 触发动作体:触发动作体既可以是一个匿名 PL/SQL 过程块,也可以是对已创建存储过程的调用。如果是行级触发器,用户可以在过程体中使用
new
和old
引用update/insert
事件之后的新值和update/delete
事件之前的旧值;如果是语句级触发器,则不能在触发动作体中使用new
或old
进行引用。如果触发动作体执行失败,激活触发器的事件就会终止执行,触发器的目标表或触发器可能影响的其他对象不发生任何变化
激活触发器
触发器的执行是由触发事件激活,并由数据库服务器自动执行的。一个数据表上可能定义了多个触发器,同一个表上的多个触发器激活时遵循如下的执行顺序:
- 执行该表上的 before 触发器
- 激活触发器的 SQL 语句
- 执行该表上的 after 触发器
- 对于同一个表上的多个 before / after 触发器,遵循“谁先创建谁先执行”的原则,即按照触发器创建的时间先后顺序执行。有些关系数据库管理系统是按照触发器名称的字母排序顺序执行触发器
删除触发器
drop trigger 触发器名 on 表名
触发器必须是一个已经创建的触发器,并且只能由具有相应权限的用户删除
第六章 关系数据理论
范式
规范化:一个低一级范式的关系模式通过模式分解可以转换为若干个高一级范式的关系模式的集合,此过程叫做模式分解
第一范式 1NF
定义:每一个分量必须是不可分的数据项
第二范式 2NF
定义:若 R ∈ 1NF,且每一个非主属性完全函数依赖于任何一个候选码,则 R ∈ 2NF
不满足第二范式,会产生的问题:
- 插入异常
- 删除异常
- 修改复杂
第三范式 3NF
定义:设关系模式 R<U,F> ∈ 1NF,若 R 中不存在这样的码 X,属性组 Y 及非主属性 Z(Z 不包含于 Y)使得 X—>Y,Y—>Z 成立,Y—/—>X,则称 R<U,F> ∈ 3NF
若 R ∈ 3NF,则每一个非主属性既不传递依赖于码,也不部分依赖于码
BCNF
定义1:关系模式 R<U,F> ∈ 1NF,若 X—>Y 且 Y 不包含于 X 时 X 必含有码,则 R<U,F> ∈ BCNF
定义2:关系模式 R<U,F> 中,若每一个决定因素都包含码,则 R<U,F> ∈ BCNF
定义3:
- 所有非主属性对每一个码都是完全函数依赖
- 所有主属性对每一个不包含它的码也是完全函数依赖
- 没有任何属性完全依赖于非码的任何一组属性