版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第六章数据库的保护6.1 数据的安全性 数据库的安全性是指保护数据库中的数据不因用户的非法使用而造成破坏、更改和泄露机密。也就是数据库中的数据不允许受到任何的恶意侵害或未经授权的存取和修改。安全性的问题一般采用如下的处理办法:(1)用户标识和鉴定(2)存取控制 (3)定义视图 (4)审计 (5)数据加密有关利用SQL语句实现视图定义和存取控制内容,可参考3.5节和3.6节。6.2 数据的完整性 数据库的完整性是指数据的正确性、一致性及相容性。 为了维护数据的完整性,DBMS必须提供一种机制来检查数据库的数据,看其是否符合语义规定的条件。这些加在数据库数据之上的语义约束条件称为数据库完整性约束条
2、件,它们作为模式的一部分存入数据库中。而DBMS中检查数据是否满足完整性条件的机制称为完整性检查。6.2.1 完整性约束条件完整性约束条件作用的对象可以有列级、元组级和关系级三种粒度:列级的约束:主要是对其取值类型、范围、精度等的约束条件。元组的约束:是指对记录中各个字段之间的联系的约束。关系的约束:是指对若干记录间、关系之间的联系的约束。 完整性约束条件涉及的以上三类对象,其状态可以是静态的,也可以是动态的:静态对象是反映数据库状态合理性的约束。动态对象的约束是反映数据状态变迁的约束。 1. 静态列级约束 静态列级约束是对一个列(字段)的取值域的说明. 对数据类型的约束,包括数据的类型、长度
3、、单位、精度等。 对取值范围或取值集合的约束。 对空值的约束:空值表示未定义或未知的值,它与零值和空格不同。2. 静态元组约束静态元组约束就是规定组成一个元组的各个列之间的约束关系。例如,若一个人的职称为正教授,则其基本工资必须在1000元以上,当输入工资时,必须考虑其职称的值以确定其输入的合理性。3. 静态关系约束在一个关系中的各个元组之间或若干关系之间常常存在着各种联系和约束。(1) 实体完整性约束(2) 参照完整性约束(3) 函数依赖约束(4) 统计约束:某个字段值与一个关系多个元组统计值之间的约束关系。4. 动态列级约束动态列级约束是修改列定义或列值时应满足的约束条件,包括下面的几方面
4、。(1) 修改列定义时的约束(2) 修改列值时的约束5. 动态元组约束动态元组约束是指修改某个元组的值时需要参考其旧值,并且在新旧值之间需要满足某种约束条件。例如:工资调整时的规则是在原工资基础上增加原工资的10%。6. 动态状态约束动态关系约束是加在关系变化前后状态上的限制条件。动态关系在实现时系统开销较大。6.2.2 完整性控制 DBMS的完整性控制机制有三方面的功能:(1) 定义功能,即提供定义完整性约束条件的机制。(2) 检查功能,即检查用户发出的操作请求是否违背了完整性约束条件。(3) 如果发现用户的操作请求使数据违背了完整性约束条件,则采取一定的动作来保证数据的完整性。根据对检查是
5、否违背控制机制时机可以将约束分为两类:(1) 立即执行约束:这类约束是指在招待用户事务时,对事务中的某一更新语句招待完毕后,马上对此数据进行完整性检查。(2) 延迟执行约束:这类约束是指在整个事务执行完毕后才进行完整性检查。6.3 并发控制 数据库是一个共享资源,可以供多个用户使用。允许多个用户同时使用的数据库系统称为多用户数据库系统。 在多用户共享系统中,如果多个事务同时对同一数据进行操作称为并发操作。若对并发操作不加控制就可能会存取和存储不正确的数据,破坏数据库的一致性。所以数据库管理系统必须提供并发控制机制。 6.3.1 并发控制概述1. 事务所谓事务是用户定义的一个数据库操作序列,这些
6、操作要么全做,要么全不做,是一个不可分割的工作单位。事务是并发控制的基本单位,保证事务ACID特性是事务处理的重要任务,而事务ACID特性可能遭到破坏的原因之一是多个事务对数据库的并发操作造成的。 2. 事务的ACID特性原子性(Atomicity) :原子性是指事务处理是有或无的命题,一旦启动,整个事务或者提交,或者放弃。 一致性(Consistency) :一致性是指事务处理的所有进程都不能违背规定的商务规则。而这些商务规则规定了数据的一致性。 隔离性(Isolation) :隔离性是指多个事务处理之间的并发控制,即保证各个事务之间不互相影响。 持久性(Durability) :持久性是指
7、一旦完成了事务处理,事务处理的结果就应该得到维持。3. 并发操作带来的数据的不一致性问题 例如,考虑飞机订票系统中的一个活动序列: 甲售票点(甲事务)读出某航班的机票余额A,设A=16; 乙售票点(乙事务)读出同一航班的机票余额A,也为16; 甲售票点卖出一张机票,修改余额AA-1,所以A为15,把A写回数据库; 乙售票点也卖出一张机票,修改余额AA-1,所以A为15,把A写回数据库;简单分析结果可知,订票系统分明卖出了两张机票,数据库中的机票余额只减少1。并发操作带来的不一致性包括三类:(1)丢失修改(Lost Updata):两个事务T1和T2读入同一数据并修改,T2提交的结果破坏了T1提
8、交的结果,导致T1的修改被丢失 (2)不可重复读(Non-Repeatable Read):事务T1读取数据后,实务T2执行更新操作,使T1无法再现前一次读取结果 (3)读“脏”数据(Dirty Read):事务T1修改某一数据,将其写回磁盘,事务T2读取同一数据后,T1由于某种原因被撤消,这时T1已修改过的数据恢复原值,T2读到的数据就与数据库中的数据不一致,则T2读到的数据为“脏”数据,即不正确数据。 封锁是实现并发控制的一个非常重要的技术。所谓封锁就是事务T在对某个数据对象例如表、记录等操作之前,先向系统发出请求,对其加锁。加锁后事务T就对该数据对象有了一定的控制,在事务T释放它的锁之前
9、,其他的事务不能更新此数据对象。 6.3.2 封锁和封锁协议基本的封锁类型有两种:排它锁(X锁)和共享锁(S锁) (1)排它锁:若事务T对数据对象A加X锁,则只允许T读取和修改A,其他任何事务都不能再对A加任何锁,直到T释放A上的锁。这就保证了其他事务在T释放A上的锁之前不能再读取和修改A。(2)共享锁:若事务T对数据对象A加S锁,则事务T可以读取A但不能修改A,其他事务只能再对A加S锁,而不能加X锁,直到T释放A上的S锁。这就保证了其他事务可以读A,但在T释放A上的S锁之前不能对A做任何修改。 T2T1XSXSNNYNYYYYYY:相容请求N:不相容请求封锁类型的相容矩阵在运用X锁和S锁两种
10、基本封锁对数据对象加锁,还需要约定一些规则,例如何时申请X锁或S锁、封锁时间、何时释放等。称这些规则为封锁协议(Locking Protocol)。对封锁方式规定不同的规则,就形成了各种不同的封锁协议。(1) 一级封锁协议:事务T在修改数据R之前必须先对其加X锁,直到事务结束才释放。事务结束包括正常结束(COMMIT)和非正常结束(ROLLBACK)。一级封锁协议可防止丢失修改,并保证事务T是可恢复的。 (2) 二级封锁协议:一级封锁协议加上事务T在读取数据R之前必须先对其加S锁,读完后即可释放S锁。二级封锁协议除防止了丢失修改,还可以进一步防止读“脏”数据。(3) 三级封锁协议:一级封锁协议
11、加上事务T在读取数据R之前必须先对其加S锁,直到事务结束才释放。三级封锁协议除防止了丢失修改和不读“脏”数据外,还进一步防止了不可重复读。X锁S锁一致性保证操作结束释放事务结束释放操作结束释放事务结束释放不丢失修改不读“脏”数据可重复读一级封锁协议二级封锁协议三级封锁协议不同级别的封锁协议 1. 活锁 如果事务T1封锁了数据R,事务T2又请求封锁R,于是T2等待。T3也请求封锁R,当T1释放了R上的封锁之后系统首先批准了T3的请求,T2仍然等待。然后T4又请求封锁R,当T3释放了R上的封锁之后系统又批准了T4的请求T2有可能永远等待,这就是活锁的情形。避免活锁的简单方法是采用先来先服务的策略,
12、当多个事务请求封锁同一数据对象时,封锁子系统按请求封锁的先后次序对事务排队,数据对象上的锁一旦释放就批准申请队列中第1个事务获得锁。6.3.3 活锁和死锁 2. 死锁 如果事务T1封锁了数据R1,T2封锁了数据R2,然后T1又请求封锁R2,因T2已封锁了R2,于是T1等待T2释放R2上的锁。接着T2又申请封锁R1,因T1已封锁了R1,T2也只能等待T1释放R1上的锁。这样就出现了T1在等待,而T2又在等待T1的局面,T1和T2两个事务永远不能结束,形成死锁。 在数据库中解决死锁问题主要有两类方法,一类方法是采取一定措施来预防死锁的发生,另一类方法是允许发生死锁,采用一定手段定期诊断系统中有无死
13、锁,若有则解除之。 (1) 死锁的预防 一次封锁法 :要求每个事务必须一次将所有要使用的数据全部加锁,否则就不能继续执行。 顺序封锁法:预先对数据对象规定一个封锁顺序,所有事务都按这个顺序实行封锁。 (2) 死锁的诊断与解除 超时法:如果一个事务的等待时间超过了规定的时限,就认为发生了死锁 等待图法:等待图是一个有向图,并发控制子系统周期性地检测事务等待图,如果发现图中存在回路,则表示系统中出现了死锁。 定义 多个事务的并发执行是正确的,当且仅当其结果与按某一次序串行地执行它们的结果相同,我们称这种调度策略为可串行化(Serializable)的调度。可串行性(Serializability)
14、是并发事务正确性的准则。按这个准则规定,一个给定的并发调度,当且仅当它是可串行化的,才认为是正确调度。为了保证并发操作的正确性,DBMS的并发控制机制必须提供一定的手段来保证调度是可串行化的。两段锁(Two-Phase Locking, 简称2PL)协议就是保证并发调度可串行性的封锁协议。6.3.4 并发调度的可串行性两段锁协议是指所有事务必须分两个阶段对数据项加锁和解锁。 在对任何数据进行读、写操作之前,首先要申请并获得对该数据的封锁。这一阶段也称为扩展阶段。 在释放一个封锁之后,事务不再申请和获得任何其他封锁。这一阶段称为收缩阶段。事务遵守两段锁协议是可串行化调度的充分条件,而不是必要条件
15、。6.3.5 两段锁协议封锁对象的大小称为封锁粒度(Granularity)。封锁对象可以是逻辑单元,也可以是物理单元 。以关系数据库为例,封锁对象可以是属性值、属性值的集合、元组、关系、索引项、整个索引直至整个数据库;也可以是这样一些物理单元: 页(数据页或索引页)、块等。 封锁的粒度越大,数据库所能够封锁的数据单元就越少,并发度就越小,系统开销也越小;反之,封锁的粒度越小,并发度较高,但系统开销也就越大。6.3.6 封锁的粒度 1. 多粒度封锁多粒度树的根结点是整个数据库,表示最大的数据粒度。叶结点表示最小的数据粒度。 多粒度封锁协议允许多粒度树中的每个结点被独立地加锁。对一个结点意味着这
16、个结点的所有后裔结点也被加以同样类型的锁。在多粒度封锁中一个数据对象可能以两种方式封锁:显式封锁和隐式封锁。 2. 意向锁 如果对一个结点加意向锁,则说明该结点的下层结点正在被加锁;对任一结点加锁时,必须先对它的上层结点加意向锁。 有三种常用的意向锁:(1)意向共享锁( IS锁):如果对一个数据对象加IS锁,表示它的后裔结点拟(意向)加S锁。(2)意向排它锁(IX锁):如果对一个数据对象加IX锁,表示它的后裔结点拟(意向)加X锁。(3)共享意向排它锁:如果对一个数据对象加SIX锁,表示对它先加S锁,再加IX锁,即SIX =S+IX。例如对某个表加SIX锁,则表示该事务要读整个表(所以要对该表加
17、S锁),同时会更新个别元组(所以要对该表加IX锁)。6.4 备份与恢复 为了保证各种故障发生后,数据库中的数据能从一种错误状态恢复到某种逻辑一致的状态,数据库系统必须提供恢复功能。 6.4.1 恢复的原理 数据库运行过程中,可能发生的故障主要有三类,不同的故障其恢复的方法也不一样。事务故障 :事务在运行过程中由于种种原因,使事务未运行至正常终止点而被迫停止,这种情况称为事务故障。系统故障:是指系统在运行时,由于某种原因,致使所有正在运行的事务都以非正常方式停止。这时内存中的数据缓冲区的信息全部丢失,但存储在外部存储器上的数据未受影响。介质故障:系统在运行中,由于硬件故障,使存储在外存中的数据部
18、分丢失或全部丢失。 6.4.2 恢复的实现技术 数据转储转储是指DBA将整个数据库复制到磁带或另一个磁盘上保存起来的过程。这些备用的数据文本称为后备副本或后援副本。重装后备副本只能将数据恢复到转储时的状态,要想恢复到故障发生时的状态,必须重新运行自转储以后的所有更新事务。 2登录日志(logging)文件日志文件是用来记录事务对数据库的更新操作的文件。 登录日志文件遵循两条原则: (1)登录的次序严格按并行事务执行的时间次序。(2)必须先写日志文件,后写数据库文件。6.4.3 恢复策略1事务故障的恢复发生事务故障时,恢复程序应撤销(UNDO)此事务已对数据库进行的修改,做法如下: 反向扫描文件
19、日志(即从后向前扫描日志文件),查找事务的更新操作。 对该事务的更新操作执行逆操作 继续反向扫描日志文件,查找该事务的其他更新操作,并做同样处理。 如此处理下去,直到读到此事务开始标记,事务故障恢复完毕。 2系统故障的恢复 正向扫描文件日志,找出故障发生前已经提交的事务,将其事务标记为重做队列。同时还要找出故障发生时尚未完成的事务,将其标记入撤销队列。 对撤销队列中的各个事务进行撤销(UNDO)处理,即反向扫描日志文件,对每一个UNDO事务的更新操作执行逆操作。 对重做队列中的各个事务进行重做(REDO)处理,即正向扫描日志文件,对每一个REDO事务的更新执行操作 3介质故障的恢复 发生介质故
20、障后,磁盘上的物理数据和日志文件被破坏。恢复方法是重装数据库,然后重做已完成的事务。具体做法如下: 装入最新的后备数据库副本,使数据库恢复到最近一次转储时的一致性状态。 装入有关的日志文件副本,重做已完成的事务。6.5 SQL Server的保护技术 6.5.1 安全性 SQL Server 的安全模型中包括以下几部分: SQL Server 登录认证 数据库用户账号管理 权限管理 角色管理1SQL Server 登录认证 (1)Windows 认证模式 (2) SQL Server 认证模式 (3) 混合认证模式 2用户账号管理 创建新数据库用户账号 3权限管理 (1)对象权限 (2)语句权
21、限 4角色管理 (1)服务器角色 (2) 数据库角色 6.5.2 数据库完整性1SQL Server完整性概述 (1) 实体完整性:把数据表中每条记录看作一个实体,要求所有的记录都有唯一的标识,即主键。表中定义的UNIQUE、PRIMARY KEY 和IDENTITY 约束就是实体完整性的体现。(2) 域完整性:指数据库表中的列必须满足某种特定的数据类型或约束。其中约束又包括取值范围、精度等规定。表中的CHECK、FOREIGN KEY 约束和DEFAULT、NOT NULL定义都属于域完整性的范畴。(3) 参照完整性:指两个表的主关键字和外关键字的数据应对应一致,它是建立在外关键字和主关键字
22、之间或外关键字和惟一性关键字之间的关系上。(4) 用户定义的完整性:用户定义的完整性即是针对某个特定关系数据库的约束条件,它反映某一具体应用所涉及的数据必须满足的语义要求。 2约束 约束是自动保持数据库完整性的一种方法,定义了可输入表或表的单个列中的数据的限制条件。 (1) 主关键字约束:指定表的一列或几列的组合的值在表中具有惟一性。 (2) 外关键字约束:当一个表中的一个列或多个列的组合和其它表中的主关键字定义相同时,就可以将这些列或列的组合定义为外关键字。 (3) 惟一性约束:指定一个或多个列的组合的值具有惟一性,以防止在列中输入重复的值。(4) 检查约束:对输入列或整个表中的值设置检查条
23、件,以限制输入值保证数据库的数据完整性。(5) 缺省约束:通过定义列的缺省值或使用数据库的缺省值对象绑定表的列,来指定列的缺省值。3规则 规则就是数据库中对存储在表的列或用户自定义数据类型中的值的规定和限制。可以用CREATE RULE 命令创建规则,用DROP RULE 命令删除规则。 创建规则后,规则仅仅只是一个存在于数据库中的对象,并未发生作用。因此需要将规则与数据库表或用户自定义对象联系起来,从而达到创建规则的目的。这个过程叫做“绑定”。存储过程Sp_bindrule 可以绑定一个规则到表的一个列或一个用户自定义数据类型上。 4缺省值 缺省值是往用户输入记录时没有指定具体数据的列中自动插入的数据。可以利用CREATE DEFAULT和DROP DEFAULT命令创建和删除缺省值。同规则一样,需要将缺省值与数据库表或用户自定义对象绑定。存储过程Sp_bindefault 可以绑定
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论