1、2019/7/14,1,第六章 数据库管理,6.1 事务 6.2 数据库恢复 6.3 数据库的并发控制 6.4 数据库的完整性 6.5 数据库的安全性,2019/7/14,2,6.1 事务,一、什么是事务 二、如何定义事务 三、事务的特性,2019/7/14,3,一、什么是事务,事务(Transaction)是用户定义的一个数据库操作序列,这些操作要么全做,要么全不做,是一个不可分割的工作单位事务和程序是两个概念 在关系数据库中,一个事务可以是一条SQL语句,一组SQL语句或整个程序 一个应用程序通常包含多个事务事务是恢复和并发控制的基本单位,2019/7/14,4,二、如何定义事务,显式定义
2、方式BEGIN TRANSACTION BEGIN TRANSACTIONSQL 语句1 SQL 语句1SQL 语句2 SQL 语句2。 。COMMIT ROLLBACK 隐式方式 当用户没有显式地定义事务时, DBMS按缺省规定自动划分事务,2019/7/14,5,事务结束,COMMIT 事务正常结束 提交事务的所有操作(读+更新) 事务中所有对数据库的更新永久生效 ROLLBACK 事务异常终止 事务运行的过程中发生了故障,不能继续执行 回滚事务的所有更新操作 事务滚回到开始时的状态,2019/7/14,6,三、事务的特性(ACID特性),事务的ACID特性: 原子性(Atomicity)
3、 一致性(Consistency) 隔离性(Isolation) 持续性(Durability ),2019/7/14,7,1. 原子性,事务是数据库的逻辑工作单位 事务中包括的诸操作要么都做,要么都不做,2019/7/14,8,2. 一致性,事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态 一致性状态: 数据库中只包含成功事务提交的结果 不一致状态: 数据库中包含失败事务的结果,2019/7/14,9,一致性与原子性,银行转帐:从帐号A中取出一万元,存入帐号B。 定义一个事务,该事务包括两个操作这两个操作要么全做,要么全不做 全做或者全不做,数据库都处于一致性状态。 如果只做
4、一个操作,数据库就处于不一致性状态。,2019/7/14,10,3. 隔离性,对并发执行而言 一个事务的执行不能被其他事务干扰 一个事务内部的操作及使用的数据对其他并发事务是隔离的 并发执行的各个事务之间不能互相干扰,2019/7/14,11,T1的修改被T2覆盖了!,2019/7/14,12,4. 持续性,持续性也称永久性(Permanence) 一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。 接下来的其他操作或故障不应该对其执行结果有任何影响。,2019/7/14,13,事务的特性,保证事务ACID特性是事务处理的任务 破坏事务ACID特性的因素 多个事务并行运行时,不同事务的
5、操作交叉执行 事务在运行过程中被强行停止,2019/7/14,14,第六章 数据库管理,6.1 事务 6.2 数据库恢复 6.3 数据库的并发控制 6.4 数据库的完整性 6.5 数据库的安全性,2019/7/14,15,6.2 数据库的恢复,故障是不可避免的 计算机硬件故障 系统软件和应用软件的错误 操作员的失误 恶意的破坏 故障的影响 运行事务非正常中断 破坏数据库,2019/7/14,16,数据库恢复(续),数据库管理系统对故障的对策 DBMS提供恢复子系统 保证故障发生后,能把数据库中的数据从错误状态恢复到某种逻辑一致的状态 保证事务ACID恢复技术是衡量系统优劣的重要指标,2019/
6、7/14,17,恢复操作的基本原理,恢复操作的基本原理:冗余 利用存储在系统其它地方的冗余数据来重建数据库中已被破坏或不正确的那部分数据 恢复的实现技术:复杂 一个大型数据库产品,恢复子系统的代码要占全部代码的10%以上,2019/7/14,18,6.2.1 恢复的实现技术,恢复机制涉及的关键问题 1. 如何建立冗余数据 数据转储(backup) 记录日志文件(logging) 2. 如何利用这些冗余数据实施数据库恢复,2019/7/14,19,数据转储,一、什么是转储 二、转储的用途,2019/7/14,20,一、什么是转储,转储是指DBA将整个数据库复制到磁带或另一个磁盘上保存起来的过程。
7、这些备用的数据文本称为后备副本或后援副本。,2019/7/14,21,二、转储用途,故障发生点转储 运行事务 正常运行 Ta Tb Tf重装后备副本 重新运行事务 恢复 ,2019/7/14,22,登记日志文件,一、日志文件的内容 二、日志文件的用途 三、登记日志文件的原则,2019/7/14,23,一、日志文件的内容,1. 什么是日志文件 日志文件(log)是用来记录事务对数据库的 更新操作的文件2. 日志文件的格式 以记录为单位的日志文件 以数据块为单位的日志文件,2019/7/14,24,日志文件的内容(续),3. 日志文件内容 各个事务的开始标记(BEGIN TRANSACTION)
8、各个事务的结束标记(COMMIT或ROLLBACK) 各个事务的所有更新操作 与事务有关的内部更新操作 日志文件中的一个日志记录 (log record),2019/7/14,25,4. 基于记录的日志文件,每条日志记录的内容 事务标识 操作类型(插入、删除或修改) 操作对象(记录ID、Block NO.) 更新前数据的旧值(对插入操作而言,此项为空值) 更新后数据的新值(对删除操作而言, 此项为空值),2019/7/14,26,二、日志文件的用途,1用途 进行事务故障恢复 进行系统故障恢复 协助后备副本进行介质故障恢复,2019/7/14,27,三、登记日志文件的原则,为保证数据库是可恢复的
9、,登记日志文件时必须遵循两条原则 登记的次序严格按并行事务执行的时间次序 必须先写日志文件,后写数据库 写日志文件操作:把表示这个修改的日志记录写到日志文件 写数据库操作:把对数据的修改写到数据库中,2019/7/14,28,登记日志文件的原则(续),为什么要先写日志文件 写数据库和写日志文件是两个不同的操作 在这两个操作之间可能发生故障 如果先写了数据库修改,而在日志文件中没有登记下这个修改,则以后就无法恢复这个修改了 如果先写日志,但没有修改数据库,按日志文件恢复时只不过是多执行一次不必要的UNDO操作,并不会影响数据库的正确性,2019/7/14,29,6.2.2 故障的种类,事务故障
10、系统故障 介质故障,2019/7/14,30,一、事务故障,什么是事务故障 某个事务在运行过程中由于种种原因未运行至正常终止点就夭折了 事务故障的常见原因 输入数据有误 运算溢出 违反了某些完整性限制 某些应用程序出错 并行事务发生死锁 。,2019/7/14,31,事务故障的恢复,发生事务故障时,夭折的事务可能已把对数据库的部分修改写回磁盘 事务故障的恢复:撤消事务(UNDO) 强行回滚(ROLLBACK)该事务 清除该事务对数据库的所有修改,使得这个事务象根本没有启动过一样,2019/7/14,32,二、系统故障,什么是系统故障 整个系统的正常运行突然被破坏 所有正在运行的事务都非正常终止
11、 内存中数据库缓冲区的信息全部丢失 外部存储设备上的数据未受影响,2019/7/14,33,系统故障的常见原因,操作系统或DBMS代码错误 操作员操作失误 特定类型的硬件错误(如CPU故障) 突然停电,2019/7/14,34,系统故障的恢复,清除尚未完成的事务对数据库的所有修改 系统重新启动时,恢复程序要强行撤消(UNDO)所有未完成事务 将缓冲区中已完成事务提交的结果写入数据库 系统重新启动时,恢复程序需要重做(REDO)所有已提交的事务,2019/7/14,35,三、介质故障,硬件故障使存储在外存中的数据部分丢失或全部丢失 介质故障比前两类故障的可能性小得多,但破坏性大得多,2019/7
12、/14,36,介质故障的常见原因,硬件故障 磁盘损坏 磁头碰撞 操作系统的某种潜在错误 瞬时强磁场干扰,2019/7/14,37,介质故障的恢复,装入数据库发生介质故障前某个时刻的数据副本 重做自此时始的所有成功事务,将这些事务已提交的结果重新记入数据库,2019/7/14,38,6.2.3 检查点技术,一、问题的提出 二、检查点技术 三、利用检查点的恢复策略,2019/7/14,39,一、问题的提出,两个问题 搜索整个日志将耗费大量的时间 REDO处理:重新执行,浪费了大量时间,2019/7/14,40,解决方案,具有检查点(checkpoint)的恢复技术 在日志文件中增加检查点记录(ch
13、eckpoint) 增加重新开始文件 恢复子系统在登录日志文件期间动态地维护日志,2019/7/14,41,二、检查点技术,检查点记录的内容 1. 建立检查点时刻所有正在执行的事务清单 2. 这些事务最近一个日志记录的地址重新开始文件的内容 记录各个检查点记录在日志文件中的地址,2019/7/14,42,2019/7/14,43,在检查点 维护日志文件,1.将当前日志缓冲区中的所有日志记录写入磁盘的日志文件上。 2.在日志文件中写入一个检查点记录。 3.将当前数据缓冲区的所有数据记录写入磁盘的数据库中。 4.把检查点记录在日志文件中的地址写入一个重新开始文件。,2019/7/14,44,三、利
14、用检查点的恢复策略,当事务T在一个检查点之前提交T对数据库所做的修改已写入数据库 在进行恢复处理时,没有必要对事务T执行REDO操作,2019/7/14,45,利用检查点的恢复策略(续),2019/7/14,46,利用检查点的恢复步骤,1. 从重新开始文件中找到最后一个检查点记录在日志文件中的地址 2 由该地址在日志文件中找到最后一个检查点记录,2019/7/14,47,利用检查点的恢复策略(续),2.由该检查点记录得到检查点建立时刻所有正在执行的事务清单ACTIVE-LIST 建立两个事务队列 UNDO-LIST REDO-LIST 把ACTIVE-LIST暂时放入UNDO-LIST队列,R
15、EDO队列暂为空。,2019/7/14,48,利用检查点的恢复策略(续),3.从检查点开始正向扫描日志文件,直到日志文件结束 如有新开始的事务Ti,把Ti暂时放入UNDO-LIST队列 如有提交的事务Tj,把Tj从UNDO-LIST队列移到REDO-LIST队列4.对UNDO-LIST中的每个事务执行UNDO操作, 对REDO-LIST中的每个事务执行REDO操作,2019/7/14,49,第六章 数据库管理,6.1 事务 6.2 数据库恢复 6.3 数据库的并发控制 6.4 数据库的完整性 6.5 数据库的安全性,2019/7/14,50,6.3.1并发操作带来的数据不一致性,丢失修改(lo
16、st update) 不可重复读(non-repeatable read) 读“脏”数据(dirty read),2019/7/14,51,1. 丢失修改,丢失修改是指事务1与事务2从数据库中读 入同一数据并修改 事务2的提交结果破坏了事务1提交的结果, 导致事务1的修改被丢失。,2019/7/14,52,(a) 丢失修改,飞机订票系统,2019/7/14,53,2. 不可重复读,不可重复读是指事务1读取数据后,事务2 执行更新操作,使事务1无法再现前一次读 取结果。,2019/7/14,54,(b) 不可重复读,2019/7/14,55,3. 读“脏”数据,事务1修改某一数据,并将其写回磁盘
17、 事务2读取同一数据后 事务1由于某种原因被撤消,这时事务1已修改过 的数据恢复原值 事务2读到的数据就与数据库中的数据不一致, 是不正确的数据,又称为“脏”数据。,2019/7/14,56,(c) 读“脏”数据,2019/7/14,57,6.3.2 封锁技术,一、什么是封锁 二、基本封锁类型 三、基本锁的相容矩阵 四、封锁粒度 五、封锁协议,2019/7/14,58,一、什么是封锁,封锁就是事务T在对某个数据对象(例如表、记录等)操作之前,先向系统发出请求,对其加锁 加锁后事务T就对该数据对象有了一定的控制,在事务T释放它的锁之前,其它的事务不能更新此数据对象。 封锁是实现并发控制的一个非常
18、重要的技术,2019/7/14,59,6.3.2 封锁技术,一、什么是封锁 二、基本封锁类型 三、基本锁的相容矩阵 四、封锁粒度 五、封锁协议,2019/7/14,60,二、基本封锁类型,DBMS通常提供了多种类型的封锁。一个事务对某个数据对象加锁后究竟拥有什么样的控制是由封锁的类型决定的。基本封锁类型 排它锁(eXclusive lock,简记为X锁) 共享锁(Share lock,简记为S锁),2019/7/14,61,排它锁,排它锁又称为写锁 若事务T对数据对象A加上X锁,则只允许T读取和修改A,其它任何事务都不能再对A加任何类型的锁,直到T释放A上的锁,2019/7/14,62,共享锁
19、,共享锁又称为读锁 若事务T对数据对象A加上S锁,则其它事务只能再对A加S锁,而不能加X锁,直到T释放A上的S锁,2019/7/14,63,6.3.2 封锁技术,一、什么是封锁 二、基本封锁类型 三、基本锁的相容矩阵 四、封锁粒度 五、封锁协议,2019/7/14,64,三、锁的相容矩阵,2019/7/14,65,6.3.2 封锁技术,一、什么是封锁 二、基本封锁类型 三、基本锁的相容矩阵 四、封锁粒度 五、封锁协议,2019/7/14,66,一、什么是封锁粒度 二、选择封锁粒度的原则,2019/7/14,67,一、什么是封锁粒度,X锁和S锁都是加在某一个数据对象上的 封锁的对象:逻辑单元,物
20、理单元 例:在关系数据库中,封锁对象: 逻辑单元: 属性值、属性值集合、元组、关系、索引项、整个索引、整个数据库等 物理单元:页(数据页或索引页)、物理记录等,2019/7/14,68,什么是封锁粒度(续),封锁对象可以很大也可以很小例: 对整个数据库加锁对某个属性值加锁封锁对象的大小称为封锁的粒度(Granularity)多粒度封锁(multiple granularity locking) 在一个系统中同时支持多种封锁粒度供不同的事务选择,2019/7/14,69,8.7.1 封锁粒度,一、什么是封锁粒度 二、选择封锁粒度的原则,2019/7/14,70,二、选择封锁粒度的原则,封锁的粒度
21、越 大,小, 系统被封锁的对象 少,多, 并发度 小,高, 系统开销 小,大, 选择封锁粒度: 考虑封锁机构和并发度两个因素 对系统开销与并发度进行权衡,2019/7/14,71,选择封锁粒度的原则(续),需要处理多个关系的大量元组的用户事务:以数据库为封锁单位; 需要处理大量元组的用户事务:以关系为封锁单元; 只处理少量元组的用户事务:以元组为封锁单位,2019/7/14,72,6.3.2 封锁技术,一、什么是封锁 二、基本封锁类型 三、基本锁的相容矩阵 四、封锁粒度 五、封锁协议,2019/7/14,73,6.3.2 封锁技术,在运用X锁和S锁对数据对象加锁时,需要约定一些规则:封锁协议(
22、Locking Protocol) 何时申请X锁或S锁 何时释放不同的封锁协议,在不同的程度上为并发操作的正确调度提供一定的保证 常用的封锁协议:三级封锁协议,2019/7/14,74,1级封锁协议,事务T在修改数据R之前必须先对其加X锁,直到事务结束才释放 正常结束(COMMIT) 非正常结束(ROLLBACK) 1级封锁协议可防止丢失修改 在1级封锁协议中,如果是读数据,不需要加锁的,所以它不能保证可重复读和不读“脏”数据。,2019/7/14,75,1级封锁协议,没有丢失修改,2019/7/14,76,1级封锁协议,读“脏”数据,2019/7/14,77,1级封锁协议,不可重复读,201
23、9/7/14,78,2级封锁协议,1级封锁协议+事务T在读取数据R前必须先加S锁,读完后即可释放S锁 2级封锁协议可以防止丢失修改和读“脏”数据。 在2级封锁协议中,由于读完数据后即可释放S锁,所以它不能保证可重复读。,2019/7/14,79,1级封锁协议,没有读“脏”数据,2019/7/14,80,2级封锁协议,不可重复读,2019/7/14,81,3级封锁协议,1级封锁协议 + 事务T在读取数据R之前必须先对其加S锁,直到事务结束才释放3级封锁协议可防止丢失修改、读脏数据和不可重复读。,2019/7/14,82,3级封锁协议,可重复读,2019/7/14,83,3级封锁协议,不读“脏”数
24、据,2019/7/14,84,4封锁协议小结,三级协议的主要区别 什么操作需要申请封锁 何时释放锁(即持锁时间),2019/7/14,85,封锁协议小结(续),2019/7/14,86,6.3.3 并发操作的调度,一、什么样的并发操作调度是正确的 二、如何保证并发操作的调度是正确的,2019/7/14,87,一、什么样的并发操作调度是正确的,计算机系统对并行事务中并行操作的调度是的随机的,而不同的调度可能会产生不同的结果。 将所有事务串行起来的调度策略一定是正确的调度策略。 如果一个事务运行过程中没有其他事务在同时运行,也就是说它没有受到其他事务的干扰,那么就可以认为该事务的运行结果是正常的或
25、者预想的,2019/7/14,88,以不同的顺序串行执行事务也有可能会产生不同的结果,但由于不会将数据库置于不一致状态,所以都可以认为是正确的。几个事务的并发执行是正确的,当且仅当其结果与按某一次序串行地执行它们时的结果相同。这种并行调度策略称为可串行化(Serializable)的调度。,2019/7/14,89,什么样的并发操作调度是正确的(续),可串行性是并行事务正确性的唯一准则 例:现在有两个事务,分别包含下列操作:事务1:读B;A=B+1;写回A;事务2:读A;B=A+1;写回B;假设A的初值为2,B的初值为2。,2019/7/14,90,什么样的并发操作调度是正确的(续),对这两个
26、事务的不同调度策略 串行执行 串行调度策略1 串行调度策略2 交错执行 不可串行化的调度 可串行化的调度,2019/7/14,91,(a) 串行调度策略,正确的调度,Slock B Y=B=2 Unlock B Xlock A A=Y+1 写回A(=3) Unlock A,Slock A X=A=3 Unlock A Xlock B B=X+1 写回B(=4) Unlock B,T1,T2,2019/7/14,92,(b) 串行调度策略,正确的调度,Slock B Y=B=3 Unlock B Xlock A A=Y+1 写回A(=4) Unlock A,SlockA X=A=2 Unlock
27、 A Xlock B B=X+1 写回B(=3) Unlock B,T1,T2,2019/7/14,93,(c) 不可串行化的调度,Slock B Y=B=2Unlock BXlock A A=Y+1 写回A(=3)Unlock A,Slock A X=A=2Unlock AXlock B B=X+1 写回B(=3)Unlock B,T1,T2,2019/7/14,94,(c) 不可串行化的调度(续),由于其执行结果与(a)、(b)的结果都不同,所以是错误的调度。,2019/7/14,95,(d) 可串行化的调度,Slock B Y=B=2 Unlock B Xlock AA=Y+1 写回A(
28、=3) Unlock A,Slock A等待等待等待 X=A=3 Unlock A Xlock B B=X+1 写回B(=4) Unlock B,T1,T2,2019/7/14,96,(d) 可串行化的调度(续),由于其执行结果与串行调度(a)的执行结果相同,所以是正确的调度。,2019/7/14,97,一、什么样的并发操作调度是正确的 二、如何保证并发操作的调度是正确的,2019/7/14,98,二、如何保证并发操作的调度是正确的,为了保证并行操作的正确性,DBMS的并行控制机制必须提供一定的手段来保证调度是可串行化的。从理论上讲,在某一事务执行时禁止其他事务执行的调度策略一定是可串行化的调
29、度,这也是最简单的调度策略,但这种方法实际上是不可行的,因为它使用户不能充分共享数据库资源。,2019/7/14,99,保证并发操作调度正确性的方法 封锁方法:两段锁(Two-Phase Locking,简称2PL)协议,2019/7/14,100,两段锁协议的内容 1. 在对任何数据进行读、写操作之前,事务首先要获得对该数据的封锁 2. 在释放一个封锁之后,事务不再获得任何其他封锁。,2019/7/14,101,两段锁协议(续),“两段”锁的含义 事务分为两个阶段第一阶段是获得封锁,也称为扩展阶段;第二阶段是释放封锁,也称为收缩阶段。,2019/7/14,102,两段锁协议(续),例: 事务
30、1的封锁序列: Slock A . Slock B . Xlock C . Unlock B . Unlock A . Unlock C;事务2的封锁序列: Slock A . Unlock A . Slock B . Xlock C . Unlock C . Unlock B;事务1遵守两段锁协议,而事务2不遵守两段协议。,2019/7/14,103,两段锁协议(续),并行执行的所有事务均遵守两段锁协议,则对这些事务的所有并行调度策略都是可串行化的。所有遵守两段锁协议的事务,其并行执行的结果一定是正确的 事务遵守两段锁协议是可串行化调度的充分条件,而不是必要条件 可串行化的调度中,不一定所有
31、事务都必须符合两段锁协议。,2019/7/14,104,两段锁协议(续),T1 Slock B 读B=2 Y=B Xlock AA=Y+1 写回A=3 Unlock B Unlock A,T2Slock A等待等待等待等待等待 Slock A 读A=3 Y=A Xlock B B=Y+1 写回B=4 Unlock B Unlock A,T1 Slock B 读B=2 Y=B Unlock B Xlock AA=Y+1 写回A=3 Unlock A,T2Slock A 等待 等待 等待 等待 Slock A 读A=3 X=A Unlock A Xlock B B=X+1 写回B=4 Unlock
32、 B,(a) 遵守两段锁协议,(b) 不遵守两段锁协议,T1Slock B 读B=2 Y=B Unlock BXlock A A=Y+1 写回A=3 Unlock A,T2Slock A 读A=2 X=A Unlock AXlock B 等待 Xlock B B=X+1 写回B=3 Unlock B,(c) 不遵守两段锁协议,2019/7/14,105,两段锁协议(续),遵守两段锁协议的事务可能发生死锁,T1 Slock B 读B=2Xlock A 等待 等待,T2Slock A 读A=2Xlock B 等待,2019/7/14,106,两段锁协议(续),两段锁协议与三级封锁协议 两类不同目的
33、的协议 两段锁协议 保证并发调度的正确性 三级封锁协议 在不同程度上保证数据一致性 遵守第三级封锁协议必然遵守两段协议,2019/7/14,107,第六章 数据库管理,6.1 事务 6.2 数据库恢复 6.3 数据库的并发控制 6.4 数据库的完整性 6.5 数据库的安全性,2019/7/14,108,完整性约束是加在数据库模式上的一个具体条件,它规定什么样的数据能够存储到数据库系统当中 例: 学生的年龄必须是整数,取值范围为14-29;学生的性别只能是男或女;学生的学号一定是唯一的;学生所在的系必须是学校开设的系;,2019/7/14,109,6.4.1 完整性子系统,完整性约束条件定义机制
34、完整性约束条件:数据模型的组成部分,约束数据库中数据的语义DBMS应提供定义数据库完整性约束条件的机制,并把它们作为模式的一部分存入数据库中 完整性检查机制检查用户发出的操作请求是否违背了完整性约束条件 违约反应 如果发现用户的操作请求使数据违背了完整性约束条件,则采取一定的动作来保证数据的完整性,2019/7/14,110,6.4.2 SQL中的完整性约束,一 、域约束二、基本表约束三、断言,2019/7/14,111,CREATE DOMAIN rfee decimal(18,2) CONSTRAINT rfee_test CHECK(VALUE 0)CREATE DOMAIN mtype
35、 varchar(10) CONSTRAINT mtype_test CHECK(VALUE in(西药, 中成药),一、域约束,2019/7/14,112,CREATE DOMAIN SexVal CHAR(2) CHECK (VALUE IN(男, 女);CREATE TABLE Patient Pno VARCHAR(10), Pname VARCHAR(50) NOT NULL, Psex SexVal, Page INT, Pino VARCHAR(50), Pid VARCHAR(18), PRIMARY KEY(Pno),一、 域约束,2019/7/14,113,二、基本表约束,
36、候选键定义 外键定义 检查约束,2019/7/14,114,CREATE TABLE dept DeptNo VARCHAR(10) PRIMARY KEY, DeptName VARCHAR(50) UNIQUE, ParentDeptNo VARCHAR(10), Manager VARCHAR(10),候选键定义,2019/7/14,115,在一个关系中,PRIMARY KEY只有一个,而UNIQUE可以声明多个 PRIMARY KEY要求属性取值不能为NULL,而UNIQUE允许属性取空值,允许多个空值同时存在 在定义了UNIQUE,PRIMARY KEY 约束的属性上建立索引是十分必
37、要的,它可以使约束的检查执行起来更有效,候选键定义,2019/7/14,116,CREATE TABLE Doctor Dno VARCHAR(10), Dname VARCHAR(50) NOT NULL, Dsex VARCHAR(2), Dage INT, Ddeptno VARCHAR(10), Dlevel VARCHAR(50), Dsalary decimal(18,2), PRIMARY KEY(Dno), CHECK( Dsex IN (男, 女) ,CHECK约束,2019/7/14,117,CREATE TABLE Fee Fno VARCHAR(10) PRIMARY
38、KEY, Rno VARCHAR(10) NOT NULL, Fdatetime DATETIME, Fsum decimal(18,2), CHECK(Fsum0) ,CHECK约束,2019/7/14,118,CREATE TABLE Patient Pno VARCHAR(10), Pname VARCHAR(50) NOT NULL, Psex VARCHAR(2), Page INT, Pino VARCHAR(30), Pid VARCHAR(18), PRIMARY KEY(Pno), CHECK( Psex IN (男, 女), CHECK(Psex=女 AND test_id
39、(Pid)= 0) ,CHECK约束,2019/7/14,119,CREATE TABLE RecipeDetail Rno VARCHAR(10), Mno VARCHAR(10) NOT NULL, Mamount DECIMAL(18,0), PRIMARY KEY(Rno,Mno), CHECK (Mno IN (SELECT Mno FROM Medicine) ,CHECK约束,2019/7/14,120,设F是基本关系R的一个或一组属性,但不是关系R的码。如果F与基本关系S的主码K相对应,则称F是基本关系R的外码(Foreign-Key)R中每个元组在F上的值必须为:取空值;等于
40、S中某个元组的主码值。,外键的定义,2019/7/14,121,CREATE TABLE Doctor Dno VARCHAR(10), Dname VARCHAR(50) NOT NULL, Dsex VARCHAR(2), Dage INT, Ddeptno VARCHAR(10) REFERENCES Dept(DeptNo), Dlevel VARCHAR(50), Dsalary decimal(18,2), PRIMARY KEY(Dno), CHECK( Dsex IN (男, 女) ,外键的定义,2019/7/14,122,CREATE TABLE RecipeDetail R
41、no VARCHAR(10), Mno VARCHAR(10) NOT NULL, Mamount DECIMAL(18,0), PRIMARY KEY(Rno,Mno), FOREIGN KEY(Mno)REFERENCES Medicine(Mno) ,外键的定义,2019/7/14,123,参照完整性实现需考虑的问题,RDBMS实现参照完整性时需要考虑 外码是否可以接受空值的问题 在被参照关系中删除元组时的问题 在参照关系中插入元组时的问题 修改关系中主码的问题,2019/7/14,124,受限策略(RESTRICTED)这是系统的默认方式。当出现违背参照完整性规则的更新操作请求时,系统
42、拒绝执行该操作。,参照完整性约束的保证,2019/7/14,125,置空策略(SET-NULL)依照参照完整性规则,外码是可以取空值的。但具体能否取空值,要根据应用环境的语义来定。,2019/7/14,126,CREATE TABLE Doctor Dno VARCHAR(10) PRIMARY KEY, Dname VARCHAR(50) NOT NULL, Dsex VARCHAR(2), Dage INT, Ddeptno VARCHAR(10) REFERENCES Dept(DeptNo) ON DELETE SET NULL , Dlevel VARCHAR(50), Dsalar
43、y decimal(18,2) ,2019/7/14,127,在Doctor关系中包含有外码Deptno某元组的这一列若为空值,表示这个职工尚未分配到任何具体的部门工作,和应用环境的语义是相符,2019/7/14,128,级联策略(CASCADE),2019/7/14,129,CREATE TABLE RecipeDetail Rno VARCHAR(10), Mno VARCHAR(10) NOT NULL, Mamount DECIMAL(18,0), PRIMARY KEY(Rno,Mno), FOREIGN KEY(Mno)REFERENCES Medicine(Mno) ON DEL
44、ETE CASCADE ON UPDATE CASCADE ,2019/7/14,130,在有些RDBMS中,修改关系主码的操作是不允许的。只能先删除该元组,然后再把具有新主码值的元组插入到关系中。若RDBMS允许修改关系主码,则必须保证主码的唯一性和非空,否则拒绝修改。,2019/7/14,131,参照完整性的实现,RDBMS在实现参照完整性时 需要向用户提供定义主码、外码的机制 向用户提供按照自己的应用要求选择处理依赖关系中对应的元组的方法,2019/7/14,132,CREATE ASSERTION CHECKCreate assertion salarycheck CHECK( Not
45、 exists( Select * from Doctor x Where Dsalary = some ( select Dsalary from Doctor y Where x.Deptno=y.Deptno and y.Dno =( Select Manager from Dept Where x.Deptno =Dept.Deptno),三、 断言,2019/7/14,133,Create assertion ASSE1 check (10=all(select count(C#)from Cgroup by T#),2019/7/14,134,约束命名的方式:CONSTRAINT
46、约束名称,四 约束的命名,2019/7/14,135,CREATE TABLE RecipeDetail Rno VARCHAR(10), Mno VARCHAR(10) CONSTRAINT Mno_notnull NOT NULL, Mamount DECIMAL(18,0), CONSTRAINT rno_mnokey PRIMARY KEY(Rno,Mno), CONSTRAINT mnoforeignkey FOREIGN KEY(Mno)REFERENCES Medicine(Mno) ON DELETE CASCADE ON UPDATE CASCADE ,2019/7/14,1
47、36,6.4.3 触发器,一 、触发器结构二、触发器结构的组成三、实例,2019/7/14,137,一、触发器的结构,触发器(Trigger)是数据库模式的一个元素。它是一个能由系统自动执行的对数据库修改的语句,2019/7/14,138,一个触发器由3部分组成:事件。事件是指对数据库的插入、删除、修改等操作。触发器在这些事件开始发生时将开始工作。 条件。触发器将测试条件是否成立。如果条件成立,就执行相应动作,否则什么也不做。 动作。如果触发器测试满足预定的条件,那么就由DBMS执行这些动作,即对数据库的操作。,2019/7/14,139,CREATE TRIGGER trigger_name
48、 ON table|view WITH ENCRYPTION FOR|AFTER|INSTEAD OFINSERT,UPDATE,DELETE AS IF UPDATE(column_name) AND|ORUPDATE(column_name) sql_statement,触发器结构的组成,2019/7/14,140,触发器操作,CREATE TRIGGER delete_dept_message ON DEPT FOR DELETE AS Declare dept_no char(4) Select dept_no=DeptNo from Dept s,deleted d Where s.
49、DeptNo=d. DeptNo IF EXISTS (select * from Doctor where DdeptNo= dept_no) DELETE FROM Doctor where DdeptNo= dept_no,2019/7/14,141,第六章 数据库管理,6.1 事务 6.2 数据库恢复 6.3 数据库的并发控制 6.4 数据库的完整性 6.5 数据库的安全性,2019/7/14,142,1、什么是数据库的安全性数据库的安全性是指保护数据库,防止因用户非法使用数据库造成数据泄露、更改或破坏。什么是数据的保密数据保密是指用户合法地访问到机密数据后能否对这些数据保证不泄密。通过制订法律道德准则和政策法规来保证。,