第八章 数据库保护
数据保护主要包括:数据的安全性、完整性、并发控制和数据
库恢复。
8.1 安 全 性
数据库的安全性是指保护数据库以防止不合法的使用所造成的
数据泄露、更改或破坏。系统安全保护措施是否有效是数据库系统
的主要性能指标之一。
用户 DBMS OS DB
用户标识和鉴定
8.1.1 安全性控制的一般方法
存取控制 操作系统安全保护 密码存储
图 8-1
一, 用户标识和鉴定
1,用一个户用名或者用户标识符号来标明用户身份,
2,口令 (Password).
3,计算结果,
二,存取控制
1.用户权限
2,与数据无关的授权定义
用户名 数据对象名 允许的操作类型
WANGPIN 关系 S SELECT
ZHANGMIN 关系 S UPDATE
ZHANGMIN 关系 C ALL
ZHANGMIN SC.G UPDATE
ZHANGMIN SC.S# SELECT
ZHANGMIN SC.C# SELECT
…… …… ……
表 8-2 一个可能的授权定义表的形式
3.依赖于数据对象的内容的授权
用户名 数据对象名 允许的操作类型 存取谓词
WANGPIN 关系 S SELECT SD=‘CS’
ZHANGMIN 关系 S UPDATE SN=‘ZHANGMIN’
ZHANGMIN 关系 C ALL 空
…… …… …… ……
表 8-3
8.1.2 两个系统的安全性方法
一, DBTG 系统
DBTG系统向用户提供了子模式,所有用户程序通过子模式
存取数据库数据。由于子模式只是模式的一部分,所以它自动地将
存取的对象限制在一定范围内,从而提供了安全性。
除开用子模式外,DBTG系统还提供了一整套以存取控制锁与
存取控制码为基础的安全设施。
1,存取控制锁子句格式
ACCESS CONTROL LOCK [FOR || 某些 DML 语句 || ]IS
literal-1 literal-2
lock-name-1 OR lock-name-2 ……
PROCEDURE db-proc-1 PROCEDURE db-proc-2
2,有关说明:
(1).格式中的 DML语句按条目而异。如:
①对于域来说 DML语句为 READY;
②对于记录则 DML语句为 STORY;
③对于系则 DML语句为 CONNECT,DISCONNECT。
(2),LOCK 有三种形式
3.存取控制码的作用
KEY值是在用户程序中给出的,
如在模式中对记录 S有如下规定,
RECORD NAME IS S.
…..
ACCECC CONTROL LOCK FOR ERASE IS ‘ENRMT’.
…….
那么在用户程序中就要提供相同的 KEY值,
PROCEDURE DIVISION.
DECLARATIVE S
……USE FOR ACCESS CONTROL ON ERASE FOR S.
MOVE ‘ENRMT’ TO DB-ACCESS-CONTROL-KEY
END DECLARATIVE S.
……
MOVE ‘S5’ TO SNO IN S.
FIND ANY S,
ERASE S
……
二, QBE系统
QBE系统可授予用户四种权限,即插入 (I)、删除 (D)、更新 (U)和
检索 (P).系统同样用表格的形式规定安全性约束条件,某一关系的所
有者在关系框架中输入一个元组,
1,授权格式,
I, AUTR (<表 >),<名字 > I,
2.举例,
a,将检索关系 S的权限授予用户 WP.
S S# SN SA SD
I.AUTR(P.).WP I,N A M D
b,将对关系 S的四种存取权限授予用户 WP.
S S# SN SA SD
I.AUTR.WP I,N A M D
SC S# C# G
I.AUTR(P.),Z I,Z CZ GZ
c,任意一个学生可以读 SC关系中关于自己的元组,
d,用户可以插入成绩在 90分以上的 SC元组,
SC S# C# G
I.AUTR(I.),WP I,N C >90
8.2 完 整 性
数据库的完整性是指数据的正确性和相容性,
8.2.1 完整性约束条件
一,值的约束和结构约束
1.关于对数据值的约束
这类约束条件是指对数据取值类型、范围、精度等的规定。
2.关于数据之间联系的约束
同一关系的不同属性之间可以有一定的联系,从而应满足一定
的约束条件, 不同的关系之间也可以有联系,因而不同关系的属性之
间也可满足一定的约束条件,
二, 静态约束和动态约束
1.静态约束
2.动态约束
三, 立即执行约束和延时执行约束
1.立即执行约束
2.延时执行约束
完整性的实现应包括两个方面,一是系统要提供定义完整性约束
条件的功能,二是提供检查完整性约束条件的方法,
8.2.2 两个系统的完整性方法
一, QBE系统
1,定义关系 S中各属性值的类型、长度,定义关系的码是哪个
(些)属性:
S S# SN SD
I,TYPE,I.
I,LENGTH,I.
I,KEY,I.
CHAR
5
K
CHAR
20
NK
CHAR
15
NK
图 8-6
2,对于其它的约束条件则在关系名下输入,
I,CONSTR (<条件表 >) I.
条件表可以包括 I.(插入 ),D.(删除 ),U.(更新 )中的任何一个或全部,
3.举例
(1),在执行插入、更新操作时要保证所有学生年龄不小于 15岁,
S S# SN SA SD
I,CONSTR( I.U.) I,≥15
(2),所插入的学生选课元组中学生所选的课程必须为学校开设
的课程,
SC S# C# G
I,CONSTR( I.) I,ALL.CX
C C# CN PC#
ALL.CX
图 8-7
图 8-8
二, ORACLE 系统
ORACLE系统中实现完整性控制的两个途径
1,字段的有效性说明
2,定义触发器
(1)触发器的三个级别
(2)触发的五种事件
①,进入时
②,查询
③,修改
④,退出
⑤,按键
(3),触发器中所用的 SELECT语句格式
SELECT 目标列
[INTO,[块名,]字段 ]
FROM 表名
[WHERE 子句 ]
[GROUP BY 子句 ]
比标准的 SELECT语句有两点扩充,
例 1,每当在学生选课 SC表中加入一个记录时,保证 C#与课程表
C中的某个 C#相同,S#与学生表 S中的某个 S#相同,
在 SC表对应的块上定义一个 pre-insert触发器,
SELECT ‘X’
FROM S,C
WHERE S.S# =:SC.S# AND C.C# =:SC.C#;
例 2,只能删除没有选课的学生,
在 S表对应的块上定义一个 pre-delete触发器,
SELECT ‘X’
FROM SC
WHERE SC.S# =:S.S#
例 3,计算机系的学生年龄在 16岁到 25岁之间,
在 S表对应块的年龄字段上定义一个 post-change触发器,
SELECT ‘X’
FROM DUAL
WHERE,S.SD =‘CS’ AND,S.SA BETWEEN 16 AND 25;
8.3 并 发 控 制
8.3.1 基本概念
一, 事务的概念
二, 数据一致性级别的概念
T1 T2 T1 T2 T1 T2
① 读 A=16

③ A=A-1
写回 A=15

读 A=16
A=A-1
写回 A=15
① 读 A=50
读 B=100
求和 =150

③ 读 A=50
读 B=200
求和 =250
读 B=100
求 B=B*2
写回 B
① 读 C=100
C=C*2
写回 C


ROLLBACK
C恢复为 100
读 C=200
(a) 丢失修改 (b) 不能重复读 (c) 读脏数据
图 8-10
8.3.2 封锁 (Locking)
一,基本的封锁类型
1.排它锁 (Exclusive locks),简记为 X锁
2.共享锁 (Share locks),简记为 S锁
可以用相容矩阵 (图 8-11)来表示这些控制方式,
T1 T2 X S —
X N N Y
S N Y Y
— Y Y Y
图 8-11 封锁类型的相容矩阵
二,利用封锁机制解决事务并发操作带来的相关问题
1.封锁机制执行并发控制时的约定
(1).事务 T在读、写数据对象 R时首先要发出 Slock或 Xlock请求,
事务 T获得所要的锁后才能读、写 R.
(2).事务 T结束时才释放锁,
2.利用封锁机制解决图 8-10中的三个问题,(图 8-12)
三,建立不同的约定,形成不同级别的封锁协议
X锁 S锁 一致性保证








不丢失
修改
事务可
恢复
不读
‘脏’
数据
可重复

1 √ √ √
2 √ √ √ √ √
3 √ √ √ √ √ √
表 8-5 不同级别的封锁协议
四,封锁尺度 (granularity)
8.3.3 活锁和死锁
一,活锁产生的原因和解决方法
1.活锁产生的原因
2.避免活锁的方法
二,产生死锁的原因及解决方法
1.产生死锁的原因
2.解决死锁的方法
(1).要求每个事务一次就将所有要使用的数据全部加锁,否则
就不能执行,
(2).预先规定一个封锁顺序,所有的事务都必须按这个顺序对
数据执行封锁,
(3).诊断死锁,解除死锁,
注意时间
8.3.4 可 串 行 性
计算机系统对并行操作的调度是随机的,不同的调度会
产生不同的结果,哪个结果是正确的呢?
事务 T1,读 B; A=B+1; 写回 A;
事务 T2,读 A; B=A+1; 写回 B;
设 A,B初值均为 2,
按 T1-T2次序串行的执行它们时,结果是 A=3,B=4.
若按 T2-T1次序串行的执行它们时,结果是 A=4,B=3.
1.串行调度
2,可串行化
8.3.5 两段锁协议
一,基本概念
二, 两段锁协议规定所有的事务应遵循的规则,
1.在对任何数据进行读写之前,事务首先要获得对该数据的封锁,
2,在释放一个封锁之后,事务不在获得任何其他封锁,
例如, T1的封锁序列是,
S lock A…S lock B…X lock C…Un lock B…Un lock A…Un lock C;
T2的封锁序列是,
S lock A…Un lock A…S lock B…X lock C…Un lock C…Un lock B;
定理, 若所有事务均遵守两段协议,则这些事务的所有
交叉调度都是可串行化的,
8.4 恢 复
8.4.1 故障的种类
一,事务内部的故障
事务故障意味着事务没有达到预期的终点,因此数据
库可能处于不正确状态,系统就要滚回此事务,即撤销该事
务已经作出的任何对数据库的修改,使得该事务好象根本
没有启动一样,
二,系统范围内的故障
三,介质故障
四,计算机病毒
8.4.2 转储和恢复
转储是数据库恢复中采用的基本技术。所谓转储,即 DBA定期
将数据库复制的磁带或另一个磁盘上保存起来的过程。
一、静态转储
二、动态转储
8.4.3 日志文件
日志文件是用来记录对数据库每次更新活动的文件,
一, 登记日志文件
“先写日志文件”,然后写数据库的原则,
二, 事务恢复