DBMS对DB的监控,称为数据库的管理,有事也称为数据库的保护。对数据库的管理主要通过四个方面实现:数据库的恢复、并发控制、完整性控制和安全性控制。
DBS运行的最小逻辑工作单位是“事务”,所有对数据库的操作,都要以事务作为一个整体单位来执行或撤销。
6.1 事务
6.1.1 事务的定义
定义6.1 事务(Transation)是构成单一逻辑工作单元的操作集合,要么完整地执行,要么完全不执行。不论发生何种情况,DBS必须保证事务能正确、完整地执行。
6.1.2 事务的ACID性质
1.原子性(Atomicity)
一个事务对数据库的所有操作,是一个不可分割的工作单元。这些操作要么全部执行,要么什么也不做(就对DB的效果而言)。
2.一致性(Consistency)
一个事务独立执行的结果,应保持数据库的一致性,即数据不会因事务的执行而遭到破坏。
3.隔离性(Isolation)
在多个事务并发执行时,系统应保证与这些事务先后单独执行时的结果一样,此时称事务达到了隔离性要求。
4.持久性(Durability)
一个事务一旦完成全部操作后,它对数据库的所有更新应永久地反映在数据库中,不会丢失。
6.2 数据库的恢复
定义6.2 系统能把数据库从被破坏、不正确的状态,恢复到最近一个正确的状态,DBMS的这种能力成为数据库的可恢复性(Recovery)。
6.2.1 典型的恢复策略
6.2.2 故障类型和恢复方法
常见的故障分成下面三类。
1.事务故障
2.系统故障
3.介质故障
6.2.3 检查点技术
1.检查点方法
2.检查点方法的恢复算法
采用检查点方法的基本恢复算法分成两步。
(1)根据日志文件建立事务重做队列和事务撤销队列
(2)对重做队列中的事务进行REDO处理,对撤销队列中的事务进行UNDO处理。
6.2.4 SQL对事务的支持
6.3 数据库的并发控制
6.3.1 并发操作带来的三个问题
1.丢失更新问题
2.读脏数据问题
在数据库技术中,把未提交的随后被撤销的数据称为“脏数据”。
3.不可重复读问题
6.3.2 封锁技术
定义6.3 锁(Lock)是一个与数据项相关的变量,对可能应用于该数据项上的操作而言,锁描述了该数据项的状态。
1.排他型封锁(Exclusive Lock,简称X锁)
定义6.4 如果事务T对某个数据R(可以是数据项、记录、数据集乃至整个数据库)实现了X锁,那么在T对数据R解除封锁之前,不允许其他事务T再对该数据加任何类型的锁。这种锁称为“X锁”。
使用X锁的操作有两个:
(1)申请X锁操作“XFIND R”:表示事务对数据R申请加X锁,若成功,则可以读或写数据R;如果不成功,那么这个事务将进入等待队列,一直到获准X锁,事务才能继续做下去。
(2)解除X锁操作“XRELEASE R”:表示事务要解除对数据R的X锁。
2.共享型封锁(Shared Lock,简称S锁,又称为读锁)
定义6.5 如果事务T对某诗句加上S锁后,仍允许其他事务再对该数据加S锁,但在该数据的所有S锁都解除之前决不允许任何事务对该数据加X锁。
使用S锁的操作有三个:
(1)申请S锁操作“SFIND R”:表示事务对数据R申请加S锁,若成功,则可以读数据R,但不可以写数据R;如果不成功,那么这个事务将进入等待队列,一直到获准S锁,事务才能继续做下去。
(2)升级和写操作“UPDX R”:表示事务要把对数据R的S锁升级为X锁,若成功则更新数据R,否则这个事务进入等待队列。
(3)解除S锁操作“SRELEASE R”:表示事务要解除对数据R的S锁。
3.封锁的相容矩阵
4.封锁的粒度
定义6.6 封锁对象的大小称为封锁的粒度(Granularity)。
5.封锁协议
6.3.3 并发操作的调度
1.事务的调度、串行调度和并发调度
定义6.7 事务的执行次序称为“调度”。如果多个事务依次执行,则称为事务的串行调度(Serial Schedule)。如果利用分时的方法,同时处理多个事务,则称为事务的并发调度(Concurrent Schedule)。
2.可串行化概念
定义6.8 每个事务中,语句的先后顺序在各种调度中始终保持一致,在这个前提下,如果一个并发调度的执行结果与某一串行调度的执行结果等价,那么这个并发调度称为“可串行化的调度”,否则是不可串行化的调度。
6.3.4 SQL对并发处理的支持
SQL2对事务的存取模式(Access Model)和隔离级别(Isolation Level)做了具体的规定,并提供语句让用户使用,以控制事务的并发执行。
1.事务的存取模式
SQL2允许事务有两种模式:
(1)READ ONLY(只读型):事务对数据库的操作只能是读操作。定义这个模式后,表示随后的事务均是只读型。
(2)READ WRITE(读写型):事务对数据库的操作可以是读操作,也可以是写操作。定义这个模式后,表示随后的事务均是读写型。在程序开始时默认这种模式。
2.事务的隔离级别
SQL2提供事务的四种隔离级别让用户选择。这四个级别从高到低如下所述:
(1)SERIALIZABLE(可串行化):允许事务与其他事务并发执行,但系统必须保证并发调度室可串行化,不致发生错误。在程序开始时默认这个级别。
(2)REPEATABLE READ(可重复读):只允许事务读已提交的数据,并且在两次读同一数据时不允许其他事务修改此数据。
(3)READ COMMITTED(读提交数据):允许事务读已提交的数据,但不要求“可重复读”。
(4)READ UNCOMMITTED(可以读取未提交数据):允许事务读已提交或未提交的数据。这是SQL2中所允许的最低一致性级别。
6.4 数据库的完整性
6.4.1 完整性子系统
定义6.9 数据库中完整性(Integrity)一词是指数据的正确性(Correctness)、有效性(Validity)和相容性(Consistency),防止错误的数据进入数据库。
所谓正确性是指数据的合法性;所谓的有效性是指数据是否属于所定义的有效范围;所谓的相容性是指表示同一事实的两个数据应相同,不一致就是不相容。
检查数据库中数据是否满足规定的条件称为“完整性检查”。数据库中数据应该满足的条件称为“完整性约束条件”,有时也称为完整性规则。
完整性规则集是由DBA或应用程序员事先向完整性子系统提供的有关数据约束的一组规则。
6.4.2 SQL中的完整性约束
SQL中的完整性约束分为三大类:域约束、基本表约束和断言。
1.域约束
SQL可以用“CREATE DOMAIN”语句定义新的域,并且还可以出现CHECK子句。
2.基本表约束
SQL的基本表约束主要有三种形式:候选键定义、外键定义和“检查约束”定义。这些定义都可以在前面加“CONSTRAINT<约束名>”,由此为新约束起个名字。
(1)候选键的定义
候选键的定义形式为:
UNIQUE (<列名序列>) 或PRIMARY KEY (<列名序列>)
(2)外键的定义
外键的定义形式为:
FOREIGN KEY (<列名序列>)
REFERENCES <参照表> [(<列名序列>) ]
[ON DELETE <参照动作>]
[ON UPDATE<参照动作>]
此处,第一个列名序列是外键,第二个列名序列是参照表中的主键或候选键。参照动作可以有五种方式:NO ACTION(默认)、CASCADE、RESTRICT、SET NULL、SET DEFAULT。
在实际应用中,作为主键的关系成为参照表,作为外键的关系称为依赖表。
(3)“检查约束”的定义
这种约束是对单个关系的元组加以约束。方法是在关系定义中的任何所需地方加上关键字CHECK和约束的条件:
CHECK(<条件表达式>)
在条件中还可以提及本关系的其他元组或其他关系的元组。这个子句也称为检查子句。
3.断言
如果完整性约束牵涉面较广,与多个关系有关,或者与聚合操作有关,那么,SQL2提供“断言”(Assertions)机制让用户书写完整性约束。断言可以像关系一样,用CREATE语句定义,其句法如下:
CHECK ASSERTION <断言名> CHECK(<条件>)
这里<条件>与SELECT 语句中WHERE 子句中的条件表达式一样。
撤销断言的句法是:
DROP ASSERTION <断言名>
但是撤销断言的句法中不提供RESTRICT和CASCADE选项。
6.4.3 SQL3的触发器
1.触发器结构
定义6.10 触发器(Trigger)是一个能由系统自动执行对数据库修改的语句。触发器有事也称为主动规则(Active Rule)或事件——条件——动作规则(Event—Condition—Action Rule,ECA规则)。
2.SQL2的触发器实例
触发器的撤销语句为“DROP TRIGGER <触发器名>”
3.触发器结构的组成
6.5 数据库的安全性
6.5.1 安全性问题
1.数据库安全性的定义
定义6.11 数据库的安全性(Security)是指保护数据库,防止不合法的使用,以免数据库的泄密、更改或破坏。
安全性是保护数据以防止非法用户故意造成的破坏;而完整性是保护数据以防止合法用户无意中造成的破坏。也就是安全性确保用户被限制在做其想做的事情;而完整性确保用户所做的事情是正确的。
2.安全性级别
为了保护数据库,防止故意的破坏,可以在从低到高的五个级别上设置各种安全措施。
(1)环境级:计算机系统的机房和设备应加以保护,防止有人进行物理破坏。
(2)职员级:工作人员应清正廉洁,正确授予用户访问数据库的权限。
(3)OS级: 应防止未经授权的用户从OS处着手访问数据库。
(4)网络级:由于大多数DBS都允许用户通过网络进行远程访问,因此,网络软件内部的安全性是很重要的。
(5)DBS级: DBS的职责是检查用户的身份是否合法以及使用数据的权限是否正确。
3.权限问题
定义6.12 用户(或应用程序)使用数据库的方式称为“权限”(Authorization)。
权限有两种:访问数据的权限和修改数据库结构的权限。
(1)访问数据的权限有四个:
① 读(Read)权限: 允许用户读数据,但不能修改数据。
② 插入(Insert)权限: 允许用户插入新的数据,但不能修改数据。
③ 修改(Update)权限: 允许用户修改数据,但不能删除数据。
④ 删除(Delete)权限: 允许用户删除数据。
(2)修改数据库模式的权限也有四个:
① 索引(Index)权限: 允许用户创建和删除索引。
② 资源(Resourse)权限: 允许用户创建新的关系。
③ 修改(Alteration)权限:允许用户在关系结构中加入或删除属性。
④ 撤销(Drop)权限: 允许用户撤销关系。
6.5.2 SQL中的安全性机制
SQL中有四个机制提供了安全性:视图(View)、权限(Authorization)、角色(Role)和审计(Audit)。
1.视图
视图是从一个或多个基本表导出的表。
视图机制使系统具有三个优点:数据安全性、逻辑数据独立性和操作简便性。
2.权限
DBMS的授权子系统允许有特定存取权限的用户有选择地和动态地把这些权限授予其他用户。
(1)用户权限
SQL2定义了六类权限供用户选择使用:
SELECT INSERT DELETE UPDATE REFERENCES USAGE
前四类权限分别允许用户对关系或视图执行查、插、删、修操作。
REFERENCES 权限允许用户定义新关系,引用其他关系的主键作为外键。
USAGE 权限允许用户使用已定义的域。
(2)授权语句
授予其他用户使用关系和视图的权限的语句格式如下:
GRANT <权限表> ON <数据库元素> TO <用户名表> [WITH GRANT OPTION]
这里权限表中的权限可以是前面提到的六种权限。如果权限表中包括全部六种权限,那么,可用关键字“ALL PRIVILEGES”代替。数据库元素可以是关系、视图或域,但是在域名前要加关键字DOMAIN。短语WITH GRANT OPTION表示获得权限的用户还能获得传递权限,把获得的权限转授给给其他用户。
(3)回收语句
如果用户U1已经将权限P授予其他用户,那么用户U1随后也可以用回收语句REVOKE从其他用户回收权限P。回收语句格式如下:
REVOKE <权限表> ON <数据库元素> FROM <用户名表> [RESTRICT|CASCADE]
该语句中袋CASCADE,表示回收权限时要引起连锁回收。即用户Ui从用户Uj回收权限是,要把用户Uj转授出去的同样的权限同时回收。如果语句中袋RESTRICT,则当不存在连锁回收现象时,才能回收权限,否则系统拒绝回收。
另外,回收语句中“REVOKE”可用“REVOKE GRANT OPTION FOR”代替,其意思是回收转授出去的转让权限,而不是回收转授出去的权限。
3.角色
定义6.13 在SQL中,用户(User)是实际的人或是访问数据库的应用程序。而角色(Role)是一组具有相同权限的用户,实际上角色是属于目录一级的概念。
可以把数据库的权限用GRANT语句授予角色,再把角色授予用户,这样用户也就拥有了使用数据库的权限,其语句格式如下:
GRANT <权限列表> ON <基本表名或视图名> TO <角色名>
GRANT <角色名> TO <用户名>
反之,也可以用REVOKE语句把权限或角色收回。
角色之间也可能存在一个角色链。即可以把一个角色授予另一个角色,则后一个角色也就拥有了前一个角色的权限。
GRANT <角色1> TO <角色2>
4.审计
定义6.14 用于安全性目的的数据库日志,称为审计追踪(Audit Trail)。
6.5.3 常用的安全性措施
1.强制存取控制(Mandatory Access Control)
2.统计数据库的安全性
3.自然环境的安全性
<!--EndFragment-->