《《数据的完整性》PPT课件.ppt》由会员分享,可在线阅读,更多相关《《数据的完整性》PPT课件.ppt(25页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第8章 数据库的完整性 P151数数据据库库的的完完整整性性是是指指数数据据的的正正确确性性和和相相容性。容性。例例如如,学学生生的的学学号号必必须须唯唯一一;性性别别只只能能是是男男或或女;等。女;等。数数据据库库是是否否具具备备完完整整性性关关系系到到数数据据库库系系统统能能否否真真实实地地反反映映现现实实世世界界,因因此此维维护护数数据据库库的的完整性是非常重要的。完整性是非常重要的。为了维护数据库的完整性,为了维护数据库的完整性,DBMS必须提供如下功能:必须提供如下功能:1.1.定义功能:定义功能:提供定义完整性约束条件的机制。提供定义完整性约束条件的机制。2.2.检检查查功功能能:
2、检检查查用用户户发发出出的的操操作作请请求求是是否否违违背背了了完完整整性约束条件。性约束条件。完整性检查的时机:完整性检查的时机:(1 1)立立即即执执行行约约束束:在在一一条条语语句句执执行行完完后后立立即即检检查查是是否否违背完整性约束。违背完整性约束。(2 2)延迟执行约束:有时完整性检查需要延迟到整个事)延迟执行约束:有时完整性检查需要延迟到整个事务执行结束后再进行,检查正确方可提交,称这类约束务执行结束后再进行,检查正确方可提交,称这类约束为延迟执行约束。为延迟执行约束。3.3.违违约约处处理理:如如果果发发现现用用户户的的操操作作请请求求使使数数据据违违背背了了完完整整性性约约束
3、束条条件件,则则采采取取一一定定的的操操作作,以以保保证证数数据据的的完完整性。整性。8.1 8.1 实体完整性的定义实体完整性的定义 P152实体完整性的检查及违约处理实体完整性的检查及违约处理 P153P153 8.2 8.2 参照完整性的定义参照完整性的定义 P154参照完整性的检查及违约处理参照完整性的检查及违约处理 P154P154 实现参照完整性要考虑的几个问题实现参照完整性要考虑的几个问题 P155 P155 表表5.15.11 1在被参照关系中删除元组的问题在被参照关系中删除元组的问题 当删除被参照关系的某个元组,而参照关系存在若干当删除被参照关系的某个元组,而参照关系存在若干
4、元组,其外码值与被参照关系删除元组的主码值相同,这元组,其外码值与被参照关系删除元组的主码值相同,这时可有三种不同的策略:时可有三种不同的策略:(1)(1)级联删除级联删除(CASCADES)(CASCADES)将将参参照照关关系系中中所所有有外外码码值值与与被被参参照照关关系系中中要要删删除除元元组组主码值相同的元组一起删除。主码值相同的元组一起删除。(2)(2)受限删除受限删除 仅仅当当参参照照关关系系中中没没有有任任何何元元组组的的外外码码值值与与被被参参照照关关系系中中要要删删除除元元组组的的主主码码值值相相同同时时,系系统统才才执执行行删删除除操操作作,否否则拒绝此删除操作。则拒绝此
5、删除操作。(3)(3)置空值删除置空值删除 删除被参照关系的元组,并将参照关系中相应元组的删除被参照关系的元组,并将参照关系中相应元组的外码值置空值。外码值置空值。2 2在参照关系中插入元组时的问题在参照关系中插入元组时的问题 当参照关系插入某个元组,而被参照关系不存在当参照关系插入某个元组,而被参照关系不存在相应的元组,其主码值与参照关系插入元组的外码值相应的元组,其主码值与参照关系插入元组的外码值相同,这时可有以下策略:相同,这时可有以下策略:(1)(1)受限插入受限插入 仅仅当当被被参参照照关关系系中中存存在在相相应应的的元元组组,其其主主码码值值与与参参照照关关系系插插入入元元组组的的
6、外外码码值值相相同同时时,系系统统才才执执行行插入操作,否则拒绝此操作。插入操作,否则拒绝此操作。(2)(2)递归插入递归插入 首先向被参照关系中插入相应的元组,其主码值首先向被参照关系中插入相应的元组,其主码值等于参照关系插入元组的外码值,然后向参照关系插等于参照关系插入元组的外码值,然后向参照关系插入元组。入元组。3 3修改被参照表主码值的问题修改被参照表主码值的问题 (1)(1)不允许修改主码值不允许修改主码值 在在有有些些RDBMSRDBMS中中,不不允允许许修修改改被被参参照照表表的的主码值。主码值。(2)(2)允许级联修改或外码值置空允许级联修改或外码值置空 在在有有些些RDBMS
7、RDBMS中中,允允许许修修改改关关系系主主码码,但必须保证主码值与对应外码值一致。但必须保证主码值与对应外码值一致。4 4外码是否允许空值的问题外码是否允许空值的问题 实实现现参参照照完完整整性性时时,系系统统除除了了应应提提供供定定义义外外码码的的机机制制,还还应应提提供供定定义义外外码码列列是是否否允许空值的机制。允许空值的机制。例例:部部门门表表与与职职工工部部门门表表,职职工工部部门门表表中中部部门门可可取取空空值值;但但学学生生表表与与学学生生选课表,学生选课表,学生选课表不能取空值。选课表不能取空值。8.3 用户定义的完整性用户定义的完整性P156P1598.4 完整性约束命名子
8、句完整性约束命名子句 P1585.5 用触发器实现数据的完整性用触发器实现数据的完整性1.触发器简介触发器简介触发器是定义在表或视图上触发器是定义在表或视图上的一类特殊的子程的一类特殊的子程序,用于维护表中的数据,序,用于维护表中的数据,当有操作影响到触发器当有操作影响到触发器关联的数据时,触发器自动执行关联的数据时,触发器自动执行,例如:通过触发,例如:通过触发器维护多个表间数据的一致性。器维护多个表间数据的一致性。一般情况下,对表数据的操作有:插入、修改、一般情况下,对表数据的操作有:插入、修改、删除,因而维护数据的触发器也可分为三种类型:删除,因而维护数据的触发器也可分为三种类型:INS
9、ERTINSERT、UPDATEUPDATE和和DELETEDELETE触发器。触发器。同一个表可定义多个触发器。同一个表可定义多个触发器。2.Oracle触发器的定义触发器的定义 P161-1633.SQLSERVER触发器的定义触发器的定义利用触发器可以方便地实现数据库中数据利用触发器可以方便地实现数据库中数据的完整性。的完整性。例如,对于例如,对于图书管理图书管理数据库数据库xsbook如下:如下:xs(借书证号借书证号,姓名姓名,专业名,性别专业名,性别,出生时间出生时间,借书数借书数,照片照片)Book(ISBN,书名书名,作者作者,出版社出版社,价格价格,复本数复本数,库存数库存数
10、)JY(借书证号借书证号,ISBN,索书号索书号,借书日期借书日期)SQL Server 触发器定义的语法触发器定义的语法CREATE TRIGGER trigger_name ON table|view /*指定触发器名及操作对象指定触发器名及操作对象*/FOR|AFTER|INSTEAD OF DELETE,INSERT,UPDATE/*定义触发器的类型定义触发器的类型*/AS sql_statements /*T-SQL语句序列语句序列*/触发器中使用的特殊表触发器中使用的特殊表 执行触发器时,系统创建了两个特殊的逻辑表执行触发器时,系统创建了两个特殊的逻辑表:inserted表和表和d
11、eleted表表,inserted 逻辑表:当向表中插入数据时,逻辑表:当向表中插入数据时,INSERT触发器触发执行,新的记录插入到触发器触发执行,新的记录插入到触发器表和触发器表和inserted表中。表中。deleted逻辑表:用于保存已从表中删除的记逻辑表:用于保存已从表中删除的记录,当触发一个录,当触发一个DELETE触发器时,被删除的触发器时,被删除的记录存放到记录存放到deleted逻辑表中。逻辑表中。修改一条记录等于插入一新记录,同时删除旧记修改一条记录等于插入一新记录,同时删除旧记录。当对定义了录。当对定义了UPDATEUPDATE触发器的表记录修改时,触发器的表记录修改时,
12、表中原记录移到表中原记录移到deleteddeleted表中,修改过的记录插入到表中,修改过的记录插入到insertedinserted表中。表中。触发器可检查触发器可检查deleteddeleted表、表、insertedinserted表及被修改的表。表及被修改的表。例如,若要检索例如,若要检索 deleteddeleted、inserted inserted 表中的所有记录,表中的所有记录,可使用如下语句:可使用如下语句:SELECT*SELECT*FROM deletedFROM deletedSELECT*SELECT*FROM insertedFROM inserteddelete
13、ddeleted、inserted inserted 逻辑表的查询方法与数据库用户表逻辑表的查询方法与数据库用户表的查询方法相同。的查询方法相同。使用触发器的限制使用触发器的限制(1)CREATE TRIGGER 必须是批处理中的第一必须是批处理中的第一条语句,并且只能应用到一个表中。条语句,并且只能应用到一个表中。(2)触发器只能在当前的数据库中创建。触发器只能在当前的数据库中创建。(3)在同一在同一CREATE TRIGGER语句中,可以为语句中,可以为多种操作(如多种操作(如 INSERT 和和 UPDATE)定义相)定义相同的触发器操作。同的触发器操作。(4)(4)如果一个表的外键在如
14、果一个表的外键在 DELETEDELETE、UPDATE UPDATE 操作上定义了操作上定义了级联,则不能在该表上定义级联,则不能在该表上定义 INSTEAD OF DELETEINSTEAD OF DELETE、INSTEAD OF UPDATE INSTEAD OF UPDATE 触发器。触发器。(5)(5)在触发器内可以指定任意的在触发器内可以指定任意的 SET SET 语句,所选择的语句,所选择的 SET SET 选项在触发器执行期间有效,并在触发器执行完后恢复到选项在触发器执行期间有效,并在触发器执行完后恢复到以前的设置。以前的设置。(6)(6)触发器中不允许包含以下触发器中不允许
15、包含以下 T-SQL T-SQL 语句:语句:CREATE DATABASE CREATE DATABASE、ALTER DATABASE ALTER DATABASE、LOAD LOAD DATABASE DATABASE、RESTORE DATABASE RESTORE DATABASE、DROP DROP DATABASEDATABASE、LOAD LOG LOAD LOG、RESTORE LOG RESTORE LOG、DISK DISK INITINIT、DISK RESIZEDISK RESIZE和和RECONFIGURERECONFIGURE(7)(7)触发器不能返回任何结果,为
16、了阻止从触发器返回结果,触发器不能返回任何结果,为了阻止从触发器返回结果,不要在触发器定义中包含不要在触发器定义中包含 SELECT SELECT 语句或给变量赋值。语句或给变量赋值。【例例】在数据库在数据库XSBOOK中创建一中创建一触发器,当向触发器,当向JY表插入一记录时,表插入一记录时,检查该记录的借书证号在检查该记录的借书证号在XS表是表是否存在,检查图书的否存在,检查图书的ISBN号在号在BOOK表中是否存在,及图书的库表中是否存在,及图书的库存量是否大于存量是否大于0,若有一项为否,若有一项为否,则不允许插入,在满足条件的情况则不允许插入,在满足条件的情况下进行插入。下进行插入。
17、USE XSBOOKIF EXISTS(SELECT name FROM sysobjects WHERE NAME=tjy_insert and type=TR)DROP TRIGGER tjy_insertGOCREATE TRIGGER tjy_insert ON jyFOR INSERT ASIF EXISTS(SELECT*FROM inserted a WHERE a.借书证号借书证号 NOT IN(SELECT b.借书证号借书证号 FROM XS b)ORa.ISBN NOT IN(SELECT c.ISBN FROM BOOK c)OR EXISTS(SELECT*FROM
18、BOOK WHERE 库存量库存量 0BEGINRAISERROR(违背数据的一致性违背数据的一致性.,16,1)ROLLBACK TRANSACTIONENDGOJY表表INSERT触发器的定义触发器的定义USE XSBOOKGOCREATE TRIGGER tjy_insert ON dbo.JYFOR INSERT ASBEGINUPDATE XS SET借书数借书数=借书数借书数+1 WHERE XS.借书证号借书证号 IN (SELECT inserted.借书证号借书证号 FROM inserted)UPDATE BOOK SET库存量库存量=库存量库存量-1 WHERE book
19、.ISBN IN (SELECT inserted.ISBN FROM inserted)ENDJY表表DELETE触发器的定义触发器的定义CREATE TRIGGER tjy_delete ON jyFOR DELETE AS BEGINdeclare ssh char(10),jszh char(8),isbn char(16)declare jssj datetime,hssj datetime UPDATE XS SET借书数借书数=借书数借书数-1 WHERE XS.借书证号借书证号 IN (SELECT deleted.借书证号借书证号 FROM deleted)UPDATE BO
20、OK SET库存量库存量=库存量库存量+1 WHERE BOOK.ISBN IN (SELECT deleted.ISBN FROM deleted)SELECT ssh=索书号索书号,jszh=借书证号借书证号,isbn=ISBN,jssj=借书时间借书时间FROM deletedINSERT JYLS(索书号索书号,借书证号借书证号,ISBN,借书时间借书时间,还书时间还书时间)VALUES(ssh,jszh,isbn,jssj,getdate()END CREATE TRIGGER trigger_name ON table|view /*指定触发器名及操作对象指定触发器名及操作对象*/
21、WITH ENCRYPTION /*说明是否采用加密方式说明是否采用加密方式*/FOR|AFTER|INSTEAD OF DELETE,INSERT,UPDATE/*定义触发器的类型定义触发器的类型*/NOT FOR REPLICATION /*说明该触发器不用于复制说明该触发器不用于复制*/AS IF UPDATE(column)AND|OR UPDATE(column).n|IF(COLUMNS_UPDATED()bitwise_operator updated_bitmask)comparison_operator column_bitmask .n /*两个两个IF子句用于说明触发器执行的条件子句用于说明触发器执行的条件*/sql_statements /*T-SQL语句序列语句序列*/