数据的完整性_第1页
数据的完整性_第2页
数据的完整性_第3页
数据的完整性_第4页
数据的完整性_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

数据的完整性第一页,共二十五页,2022年,8月28日为了维护数据库的完整性,DBMS必须提供如下功能:

1.定义功能:提供定义完整性约束条件的机制。

2.检查功能:检查用户发出的操作请求是否违背了完整性约束条件。完整性检查的时机:

(1)立即执行约束:在一条语句执行完后立即检查是否违背完整性约束。(2)延迟执行约束:有时完整性检查需要延迟到整个事务执行结束后再进行,检查正确方可提交,称这类约束为延迟执行约束。

3.违约处理:如果发现用户的操作请求使数据违背了完整性约束条件,则采取一定的操作,以保证数据的完整性。第二页,共二十五页,2022年,8月28日

8.1实体完整性的定义

P152实体完整性的检查及违约处理P153

8.2参照完整性的定义

P154参照完整性的检查及违约处理P154

第三页,共二十五页,2022年,8月28日实现参照完整性要考虑的几个问题P155表5.11.在被参照关系中删除元组的问题

当删除被参照关系的某个元组,而参照关系存在若干元组,其外码值与被参照关系删除元组的主码值相同,这时可有三种不同的策略:

(1)级联删除(CASCADES)

将参照关系中所有外码值与被参照关系中要删除元组主码值相同的元组一起删除。

(2)受限删除仅当参照关系中没有任何元组的外码值与被参照关系中要删除元组的主码值相同时,系统才执行删除操作,否则拒绝此删除操作。

(3)置空值删除删除被参照关系的元组,并将参照关系中相应元组的外码值置空值。第四页,共二十五页,2022年,8月28日

2.在参照关系中插入元组时的问题

当参照关系插入某个元组,而被参照关系不存在相应的元组,其主码值与参照关系插入元组的外码值相同,这时可有以下策略:

(1)受限插入仅当被参照关系中存在相应的元组,其主码值与参照关系插入元组的外码值相同时,系统才执行插入操作,否则拒绝此操作。

(2)递归插入首先向被参照关系中插入相应的元组,其主码值等于参照关系插入元组的外码值,然后向参照关系插入元组。第五页,共二十五页,2022年,8月28日3.修改被参照表主码值的问题

(1)不允许修改主码值在有些RDBMS中,不允许修改被参照表的主码值。

(2)允许级联修改或外码值置空在有些RDBMS中,允许修改关系主码,但必须保证主码值与对应外码值一致。第六页,共二十五页,2022年,8月28日4.外码是否允许空值的问题实现参照完整性时,系统除了应提供定义外码的机制,还应提供定义外码列是否允许空值的机制。

例:部门表与职工—部门表,职工—部门表中部门可取空值;但学生表与学生—选课表,学生—选课表不能取空值。第七页,共二十五页,2022年,8月28日8.3用户定义的完整性P156——P1598.4完整性约束命名子句P158第八页,共二十五页,2022年,8月28日5.5用触发器实现数据的完整性1.触发器简介

触发器是定义在表或视图上的一类特殊的子程序,用于维护表中的数据,当有操作影响到触发器关联的数据时,触发器自动执行,例如:通过触发器维护多个表间数据的一致性。一般情况下,对表数据的操作有:插入、修改、删除,因而维护数据的触发器也可分为三种类型:INSERT、UPDATE和DELETE触发器。同一个表可定义多个触发器。第九页,共二十五页,2022年,8月28日2.Oracle触发器的定义P161-163第十页,共二十五页,2022年,8月28日

3.SQLSERVER触发器的定义

利用触发器可以方便地实现数据库中数据的完整性。例如,对于图书管理数据库xsbook如下:

xs(借书证号,姓名,专业名,性别,出生时间,借书数,照片)Book(ISBN,书名,作者,出版社,价格,复本数,库存数)JY(借书证号,ISBN,索书号,借书日期)

第十一页,共二十五页,2022年,8月28日SQLServer触发器定义的语法CREATETRIGGERtrigger_nameON{table|view}

/*指定触发器名及操作对象*/{FOR|AFTER|INSTEADOF}{[DELETE][,][INSERT][,][UPDATE]}

/*定义触发器的类型*/

AS

sql_statements

/*T-SQL语句序列*/第十二页,共二十五页,2022年,8月28日触发器中使用的特殊表

执行触发器时,系统创建了两个特殊的逻辑表:inserted表和deleted表,inserted逻辑表:当向表中插入数据时,INSERT触发器触发执行,新的记录插入到触发器表和inserted表中。deleted逻辑表:用于保存已从表中删除的记录,当触发一个DELETE触发器时,被删除的记录存放到deleted逻辑表中。第十三页,共二十五页,2022年,8月28日

修改一条记录等于插入一新记录,同时删除旧记录。当对定义了UPDATE触发器的表记录修改时,表中原记录移到deleted表中,修改过的记录插入到inserted表中。触发器可检查deleted表、inserted表及被修改的表。例如,若要检索deleted、inserted表中的所有记录,可使用如下语句:SELECT*FROMdeletedSELECT*FROMinserteddeleted、inserted逻辑表的查询方法与数据库用户表的查询方法相同。第十四页,共二十五页,2022年,8月28日使用触发器的限制

(1)CREATETRIGGER必须是批处理中的第一条语句,并且只能应用到一个表中。(2)触发器只能在当前的数据库中创建。(3)在同一CREATETRIGGER语句中,可以为多种操作(如INSERT和UPDATE)定义相同的触发器操作。第十五页,共二十五页,2022年,8月28日(4)如果一个表的外键在DELETE、UPDATE操作上定义了级联,则不能在该表上定义INSTEADOFDELETE、INSTEADOFUPDATE触发器。(5)在触发器内可以指定任意的SET语句,所选择的SET选项在触发器执行期间有效,并在触发器执行完后恢复到以前的设置。(6)触发器中不允许包含以下T-SQL语句:

CREATEDATABASE、ALTERDATABASE、LOADDATABASE、RESTOREDATABASE、DROPDATABASE、LOADLOG、RESTORELOG、DISKINIT、DISKRESIZE和RECONFIGURE(7)触发器不能返回任何结果,为了阻止从触发器返回结果,不要在触发器定义中包含SELECT语句或给变量赋值。第十六页,共二十五页,2022年,8月28日【例】在数据库XSBOOK中创建一触发器,当向JY表插入一记录时,检查该记录的借书证号在XS表是否存在,检查图书的ISBN号在BOOK表中是否存在,及图书的库存量是否大于0,若有一项为否,则不允许插入,在满足条件的情况下进行插入。第十七页,共二十五页,2022年,8月28日USEXSBOOKIFEXISTS(SELECTnameFROMsysobjectsWHERENAME='tjy_insert'andtype='TR')DROPTRIGGERtjy_insertGOCREATETRIGGERtjy_insertONjyFORINSERTASIFEXISTS(SELECT*FROMinsertedaWHEREa.借书证号NOTIN(SELECTb.借书证号FROMXSb)ORa.ISBNNOTIN(SELECTc.ISBNFROMBOOKc))OREXISTS(SELECT*FROMBOOKWHERE库存量<=0ANDa.ISBN=BOOK.ISBN) BEGINRAISERROR('违背数据的一致性.',16,1)ROLLBACKTRANSACTION END第十八页,共二十五页,2022年,8月28日ELSEBEGINUPDATEXSSET借书数=借书数+1WHEREXS.借书证号IN(SELECTinserted.借书证号

FROMinserted)UPDATEBOOKSET库存量=库存量-1WHEREbook.ISBNIN(SELECTinserted.ISBNFROMinserted)ENDGO第十九页,共二十五页,2022年,8月28日【例】在XSBOOK数据库的JY表上创建一触发器,若对借书证号列和图书的ISBN列修改,则给出提示信息,并取消修改操作,用两种方法实现。第二十页,共二十五页,2022年,8月28日方法1:利用IFUPDATE(column)…子句实现:USEXSBOOKGOCREATETRIGGERupdate_trigger1 ONJYFORUPDATEAS/*检查借书证号列或ISBN列是否被修改,如果有某些列被修改了,则取消修改操作*/IFUPDATE(借书证号)orUPDATE(ISBN) BEGINRAISERROR('违背数据的一致性.',16,1)ROLLBACKTRANSACTIONENDGO第二十一页,共二十五页,2022年,8月28日方法2:调用COLUMNS_UPDATED()函数,检查借书证号列或ISBN列是否被修改。USEXSBOOKGOCREATETRIGGERupdate_trigger2ONJYFORupdateAS/*检查借书证号列(C0)和ISBN列(C1)是否被修改,如果有某些列被修改了,则取消修改操作*/IF(COLUMNS_UPDATED()&3)>0 BEGINRAISERROR('违背数据的一致性.',16,1)ROLLBACKTRANSACTIONENDGO第二十二页,共二十五页,2022年,8月28日JY表INSERT触发器的定义USEXSBOOKGOCREATETRIGGERtjy_insertONdbo.JYFORINSERTASBEGIN UPDATEXS SET借书数=借书数+1WHEREXS.借书证号IN(SELECTinserted.借书证号

FROMinserted)UPDATEBOOKSET库存量=库存量-1WHEREbook.ISBNIN(SELECTinserted.ISBNFROMinserted)END第二十三页,共二十五页,2022年,8月28日JY表DELETE触发器的定义CREATETRIGGERtjy_deleteONjyFORDELETEAS BEGIN declare@sshchar(10),@jszhchar(8),@isbnchar(16) declare@jssjdatetime,@hssjdatetimeUPDATEXSSET借书数=借书数-1WHEREXS.借书证号IN(SELECTdeleted.借书证号

FROMdeleted)UPDATEBOOKSET库存量=库存量+1WHEREBOOK.ISBNIN(SELECTdeleted.ISBNFROMdeleted)SELECT@ssh=索书号,@jszh=借书证号,@isbn=ISBN,@jssj=借书时间FROMdeletedINSERTJYLS(索书号,借书证号,ISBN,借书时间,还书时间)VALUES(@ssh,@j

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论