数据库完整性教学课件

PPT
  • 阅读 150 次
  • 下载 0 次
  • 页数 57 页
  • 大小 1.065 MB
  • 2022-12-05 上传
  • 收藏
  • 违规举报
  • © 版权认领
下载文档30.00 元 加入VIP免费下载
此文档由【小橙橙】提供上传,收益归文档提供者,本网站只提供存储服务。若此文档侵犯了您的版权,欢迎进行违规举报版权认领
数据库完整性教学课件
可在后台配置第一页与第二页中间广告代码
数据库完整性教学课件
可在后台配置第二页与第三页中间广告代码
数据库完整性教学课件
可在后台配置第三页与第四页中间广告代码
数据库完整性教学课件
数据库完整性教学课件
还剩10页未读,继续阅读
【这是免费文档,您可以免费阅读】
/ 57
  • 收藏
  • 违规举报
  • © 版权认领
下载文档30.00 元 加入VIP免费下载
文本内容

【文档说明】数据库完整性教学课件.ppt,共(57)页,1.065 MB,由小橙橙上传

转载请保留链接:https://www.ichengzhen.cn/view-92458.html

以下为本文档部分文字说明:

2022/12/51数据库系统概论AnIntroductiontoDatabaseSystem第五章数据库完整性第五章数据库完整性什么是数据库的完整性1)数据的正确性和相容性2)防止不合语义的数据进入数据库。例:学生的年龄必须是整数,取值范围为

14--29;学生的性别只能是男或女;学生的学号一定是唯一的;学生所在的系必须是学校开设的系;3)完整性:是否真实地反映现实世界完整性控制机制1.完整性约束条件定义机制2.完整性检查机制一般在INSER

T,UPDATE,DELETE执行后开始检查,也可以在事务提交时检查。3.违约处理拒绝或级联执行等。第五章数据库完整性5.1实体完整性5.2参照完整性5.3用户定义的完整性5.4完整性约束命名子句5.6触发器5.7小结5.1实体完整性

•5.1.1实体完整性定义–PRIMARYKEY定义,表级完整性约束或列级完整性约束•5.1.2实体完整性检查和违约处理每当用户程序对基本表插入一条记录或者对主码列进行更新操作时,按照实体完整性规则,系统将进行检查:•主码值是否唯一,如果不唯一则拒绝插入或修改•主

码各属性是否为空,只要有一个为空就拒绝插入或修改方法:全表扫描或者索引查找(一般在主码上自动建立一个索引)5.2参照完整性•5.2.1参照完整性定义–创建表时,FOREIGNKEY定义•5.2.2参照完整性检查和违约处理–以SC和S为例,四种情况:•SC中增加一个元组,而在student中找不到

相应的元组•修改SC中的一个元组……•从student删除一个元组……•修改student中的一个元组……5.2.2参照完整性检查和违约处理•当上述的不一致发生时,系统可以采用以下的策略:1拒绝(NoAction)执行不允许该操作执行。

该策略一般设置为默认策略。2级联(Cascade)操作当删除或修改被参照表(Student)的一个元组造成了与参照表(SC)的不一致,则删除或修改参照表中的所有造成不一致的元组。例如:删除Student表中的

元组,Sno的值为200215121,则从要SC表中级联删除SC.Sno=‘200215121’的所有元组。5.2.2参照完整性检查和违约处理•3设置为空值•当删除或修改被参照表的一个元组时造成了不一致,则将参照表中的所有造成不一致的元组对应属性设置为空值

。例:5.2.2参照完整性检查和违约处理因此,对于参照完整性,除了应该定义外码,还应定义外码列是否允许空值。一般,当对参照表和被参照表的操作违反了参照完整性,系统选用默认策略,即拒绝执行。如果想让系统采用其他

的策略则必须在创建表的时候显示地加以说明。显示说明参照完整性的违约处理•[ONDELETE{NOACTION|CASCADE|SETNULL|SETDEFAULT}]•[ONUPDATE{NOACTION|CASCADE|SETNULL|SETD

EFAULT}]5.3用户定义的完整性•5.3.1属性上的约束条件的定义–列值非空(NotNull);–列值唯一(Unique);–检查列值是否满足布尔表达式(CHECK);•5.3.2属性上的约束条件检查和违约处理当往表中插入元

组或修改属性的值时,检查属性上的约束是否被满足,如果不满足则操作被拒绝执行。•5.3.3元组上的约束条件的定义–CHECK短语(同属性值限制相比,元组级的限制可以设置不同属性之间的取值的相互约束条件)•5.3.4元组上的约束条件检查和违约处理当往表中插入元组或修改属性

的值时,检查属性上的约束是否被满足,如果不满足则操作被拒绝执行。5.3用户定义的完整性5.3用户定义的完整性5.6触发器触发器的基础知识触发器是一种特殊的存储过程,是SQLServer为保证数据完整性、确保系

统正常工作而设置的一种高级技术。触发器在特定的表上定义,该表也称为触发器表。当触发器所保护的数据发生变化时,触发器就会自动运行,以保证数据的完整性与正确性。1.触发器有如下作用:1)可以对数据库进行级联修改。2)可以完成比CHECK更复杂的

约束。与CHECK约束不同,在触发器中可以引用其他的表。3)根据改变前后表中不同的数据进行相应的操作。4)对于一个表上的不同的操作(INSERT、UPDATE或DELETE)可以采用不同的触发器,即使是对相同的语句也可以调用不

同的触发器完成不同的操作。•在创建数据表时,已经定义了各字段的类型及其他约束条件,比如主键、外键关系等。这些作为预选过滤,在数据写入数据库之前就会被校验,只有当这些校验全都通过后,触发器才会执行。如果前面的这些校验没有全部通过,触发器

就不会执行。因为触发器是在操作之后才执行。2.触发器具有以下特点:1)它是在操作有效后才执行的,即其他约束优先于触发器。2)它与存储过程的不同之处在于存储过程可以由用户直接调用,而触发器不能被直接调用,是由事件触发的。3)一个表可以有多个触发器,在不同表上同一种

类型的触发器也可以有多个。4)触发器允许嵌套,最多为32层。5)触发器可以提高对表及表行有级联操作的应用程序的性能。触发器定义之后,其名称存储于sysobjects表中,定义语句存储在syscomments表中。定义触发器的Transact-SQL语句中

不能出现以下语句,否则SQLServer将拒绝编译、存储这些语句相关的触发器。·所有的CREATE命令·所有的DROP命令·ALTERTABLE和ALTERDATABASE命令·TRUNCATETABLE命令(删除表中所有行)·GRANT和REVOKE

命令·UPDATESTATISTICS命令·SELECTINTO命令等。(创建表将结果集填充)在创建触发器时,还要遵循以下原则:(1)触发器的定义必须是批处理的第一条命令。(2)触发器只能在表上定义。(3)触发器不能

处理TEXT和IMAGE数据类型的大型二进制对象表列。(4)建议不要使用触发器返回一个结果集。3.触发器的类型在SQLServer2008中,根据激活触发器执行的T-SQL语句类型,可以把触发器分为两类:•DML触发器当数据库服务器中

发生数据操作语言(DataManipulationLanguage)事件(Insert,Update,Delete)时执行的存储过程。•DDL触发器•响应数据定义语言(DataDefinitionLanguage)事件(Create,Alter,Drop)时执行的存储过程。DML触发器•DML

触发器根据引起触发时间的不同可分为After触发器(后触发器)和InsteadOf触发器(替代触发器)•After触发器(后触发器)在记录已经改变完后(执行完insert,update或delete和处理完约束后)才被激活执行,主要用于记录变更后的处理或检查,一旦发现错误,也可以用Rollba

ckTransaction语句来回滚本次操作。•InsteadOf触发器(替代触发器)用来取代原本要进行的操作,在记录变更之前发生的,不执行原来SQL语句里的操作,而是代替insert,update,delete语句去执行触发器本身所定义的操作。DML触发器•D

ML触发器与表和视图是不能分开的,触发器定义在表和视图中,当表或视图中执行insert,update,delete操作时触发器被触发并自动执行。•当表或视图被删除时与它关联的触发器也一同被删除。•一个表或视图可以定义多个After触发器,一个表或视图只可以定义

一个Instead触发器。创建DML触发器的语法格式为:CREATETRIGGER触发器名ON表名或视图名{[FOR|AFTER]|[INSTEADOF]}{[DELETE][,][INSERT][,][UPDATE]}ASSQL语句[...n]注:不能在视图或临时表上建立触发器,但是在触发器定

义中可以引用视图或临时表。当触发器引用视图或临时表时,产生两个特殊的表:deleted表和inserted表。这两个表的结构总与激活触发器的表的结构相同,触发器执行完成后,与该触发器相关的这两个临时表也会被自动删除。用户可以用SELECT语句查询临时表的内容,但不能对它们进行修

改。可以用于触发器的条件测试。例:对stju库中s表的DELETE操作定义触发器。USEstjuGOIFEXISTS(SELECTnameFROMsysobjectsWHEREname='reader_d'ANDtype='TR')DROPTRIG

GERreader_dGOCREATETRIGGERreader_dONsFORDELETEASPRINT'数据被删除!'GOINSERT触发器和DELETE触发器当向表中插入数据时,所有数据约束都通过之后,INSERT触发器就会执行。新的记录不但加到触发器表中,而且还会有副本加入inserted

表中。同样,DELETE触发器会将删除的内容保存在deleted表中。INSERTED表与DELETED表一样,它们的记录是可读的,可以进行比较,以便确认这些数据是否正确。UPDATE触发器利用UPDATE修改一条记录时,相当于删除一

条记录然后再增加一条新记录。所以UPDATE操作使用inserted和deleted两个表。当使用UPDATE操作时,触发器表中原来的记录被移到deleted表中,修改过的记录插入到inserted表中,触发器可以检查这两个表,以便确定应执行什么样的操作。例1•例

:创建触发器“T_学生删除”,从“学生”表中删除数据时,相应地从“成绩”表中删除数据。CreatetriggerT_学生删除On学生AfterdeleteAsDelete成绩Where学生编号=(select学生编号fromdeleted)例2•例:创建触发器“T

_教师添加”,向“辅导员”表中添加数据时,相应地向“教师”表中添加数据。CreatetriggerT_教师添加On辅导员AfterinsertAsInsert教师(编号,姓名,出生年月)Select编号,姓名,出生年月fro

minserted例3•例:创建触发器“T_教师修改”,向“辅导员”表中修改“姓名”列时,相应地修改“教师”表中的对应数据。CreatetriggerT_教师修改On辅导员AfterupdateAsIfupdate(姓名)BeginUpdate教师Set姓名=(sel

ect姓名frominserted)Where编号=(select编号fromdeleted)End•局部变量局部变量是用户自定义的变量。使用范围是定义它的批、存储过程或触发器。局部变量前面通常加上@标记。–DECLARE定义局部变量,并指明此变量的数据类型–SET或S

ELECT命令对其赋值。局部变量的数据类型可以是用户自定义的数据类型,也可以是系统数据类型,但不能将其定义为TEXT或IMAGE数据类型。–定义局部变量的语法如下:DECLARE@local_variabledata_type[,@local_variabledata_type]…

DECLARE命令可以定义多个局部变量,之间用逗号分隔。局部变量与全局变量用SELECT为局部变量赋值的语法如下:SELECT@variable_name=expressionselectstatement[,@vari

able_name=expressionselectstatement][FROMlistoftables][WHEREexpression][GROUPBY...][HAVING...][ORDERBY]说明:(1)SELECT命令可以将一个表达式的值赋给一个局

部变量,也可以将一个SELECT查询的结果赋给一个局部变量。(2)SELECT命令通常返回一个值给局部变量。当返回多个值,则变量的值为最后一个返回值。【例4】多个返回值的赋值。–DECLARE@varlvarchar(8)–SELE

CT@varl='学生姓名'–SELECT@varl=sname–FROMs–Select@varlAS'学生姓名'执行结果为:学生姓名---------------------返回最后一名学生的姓名(注意顺序)【例5】DECLARE@var1varchar(8)--声

明局部变量SELECT@var1='学生姓名'--为局部变量赋初值Print@var1--显示局部变量结果SELECT@var1=snameFROMsWHEREsno=200215121SELECT@var1AS'学生姓名'用SET为局

部变量赋值用SET为局部变量赋值的常用语法格式为:SET@local_variable=expression【例6】使用SET命令赋值的变量。USEstjuGODECLARE@novarchar(10)SET@no=‘200215122'SELECTsno,snameFR

OMsWHEREsno=@noGO执行结果为:snosname-----------------------200215122李亚茜全局变量全局变量是一组特殊的函数,他们的名称以@@开头,而且不需要任何参数,在调用时也无需在函数

名后面加上一对(),这些函数又称为“无参函数”•使用全局变量时请注意以下规则:1)全局变量是由SQLServer系统提供并赋值的,是在服务器级定义的变量。用户不能建立全局变量,也不能用SET语句修改全局变量的值。但可以将全局变量的值赋给局部变量,以便保存和

处理。2)用户只能使用系统预定义的全局变量。3)引用全局变量时,前面一定加上@@标记。4)用户不能定义与系统全局变量同名的局部变量,否则将产生不可预测的结果。例如:•@@ERROR保存最近执行操作的错误状态,即返回最后一

次执行SQL语句的错误代码;•@@MAX_CONNECTIONS返回SQLServer上允许用户同时连接的最大数;•@@CONNECTIONS返回SQLServer最近一次启动后连接或尝试连接的次数。•@@ROWCOUNT,是返回最近一次数据库操作所涉及到的行数。【例7】使用全局变量@@R

OWCOUNT,查询命令影响的行数。UPDATEReadersSET已借数量=2SELECT@@ROWCOUNTAS‘行数’GO执行结果为行数5例8•例:在“成绩”上创建触发器,检查插入的成绩是否在0到100之间。Createtriggercheck_成绩On成绩Forinse

rt,updateAsDeclare@scoreintSelect@score=成绩frominsertedIf@score<0or@score>100BeginPrint‘成绩必须在0到100之间!’RollbackEnd例9•在“学生”表中创建触

发器,当有人试图修改学生表中的数据时,利用下述触发器可以跳过修改数据的SQL语句(防止数据被修改),并向客户端显示提示信息。CreatetriggerT_学生_updateOn学生InsteadofupdateAsB

eginraiserror(‘对不起,学生表的数据不允许修改’,16,10)End(考虑:如何用after触发器改写?)例10CreatetriggerT_学生_update2AfterupdateAsBeginprint‘对不起,学生表的数据不允许修改’RollbackEnd•Rea

ders(读者编号,读者类型,姓名,单位,已借图书数量)•Books(图书编号,数量,出版社名)•borrowinf(读者编号,图书编号,借书日期,还书日期)•当在表borrowinf中插入借阅信息记录时,得到该书的应还日期。CREATETRIGGERT_return

_dateONborrowinfforINSERTASDECLARE@typevarchar(8)SELECT@type=读者类型FROMreadersWHERE编号=(select读者编号fromINSERTED)updateborrowinfset还书日期=getd

ate()+casewhen@type=3then45when@type=2then60when@type=1then90endwhere读者编号=(select读者编号fromINSERTED)例11触发器创建之后,用户执行一条命令:insertintoborrowinf(读者编号,图书编

号)values('2004060002','F33.33')CREATETRIGGERs_dONscFORDELETEASDECLARE@data_yjintSELECT@data_yj=gradeFROMdeletedIF@data_yj>0begin

PRINT'成绩为'+RTRIM(@data_yj)rollbackendELSEPRINT'该学生选课记录已被删除!'触发器创建之后,用户执行一条命令:DELETEscWHEREsno=200215125例122022/12/5长春理工大学计算机科学技术学院•下面那条命令能使数据库数据

发生变化()•USECollegeMIS•GO•CREATETRIGGERUpdate_TeacherONTeacher•FORUPDATE•AS•IFUPDATE(TeaID)•BEGIN•PRINT'不

能修改教师的身份证号'•ROLLBACKTRANSACTION•END•GO•下面程序执行结果()•USECollegeMIS•GO•CREATETRIGGERDelete_TeacherONTeacher•FORDELETE•AS•ROLLBACKTRANSACTION•GO•DELET

EFROMTeacherWHEREage>60•GO•SELECT*FROMTeacherWHEREage>602022/12/5长春理工大学计算机科学技术学院例1:在market数据库中建立一个名为del_goods的

DELETE触发器,存储在goods表中。当用户删除goods表中的某些货品时,这些货品在orders表中的定单全部删除,以实现goods表和orders表的级联删除。•第一步:创建触发器•USEmarket•GO•CREATETR

IGGERdel_goodsONgoods•AFTERDELETE•AS•DELETEordersWHERE货品名称IN•(SELECT货品名称FROMDELETED)•GO实验题目:第二步:检验触发器的作用DELETEgoodsWHERE货品名称=‘pen’IFNOTEXISTS(SELE

CT*FROMOrdersWHERE货品名称=‘pen’)PRINT‘相关记录已从orders表中删除掉!’例2:在market数据库中创建一个名为ins_orders的INSERT触发器,存储在orders表中,当向表orders中插入一条记录时,检查该定

单中的货品是否正在整理中(查看对应货品在goods表中的状态是否为1),如果是在整理中,则不能下定单(该记录不能插入goods表中)。第一步:创建触发器USEmarketGOCREATETRIGGERins_ordersONordersAFTERINSERTASDECLARE@x

char(20),@ybitSELECT@x=货品名称FROMinsertedSELECT@y=状态FROMgoodsWHERE货品名称=@xIF@y=1BEGINPRINT(‘本货品正在整理中,现在不能下定单’)ROLLBACK

TRANSACTIONENDGO第二步:检验触发器的作用INSERTorders(货品名称,客户编号,数量)VALUES(‘desk’,2,5)SELECT*FROMordersWHERE货品名称=‘desk’•例3:创建触发器,当向CJB表中插入一个学生的成绩时,将XSB

表中该学生的总学分加上添加的课程的学分。Createtriggercjb_insertOncjbAfterinsertAsBegindeclare@numchar(6),@kc_numchar(3)Declare@xfintSelect@num=学

号,@kc_num=课程号frominsertedSelect@xf=学分fromkcbwhere课程号=@kc_numUpdatexsbset总学分=总学分+@xfwhere学号=@numPrint‘修改成功’End•例4:向XSCP表插入或修改一记录时,通过触发器检查记录CPBH字

段的值在CP表是否存在,如不存在,则取消插入或修改操作ifexists(selectnamefromsysobjectswherextype=‘TR’andname=‘xscp_tri’)droptriggerxscp_triGoCreatetriggerxsc

p_triondbo.xscpforinsertAsBeginif((selectcpbhfrominserted)notin(selectcpbhfromcp))rollbackEnd禁用DML触发器:Alte

rtable数据表名Disabletrigger触发器名|ALL(如果要禁用所有触发器,用ALL代替触发器名)启用DML触发器:Altertable数据表名Enabletrigger触发器名|ALL删除DML触发器:

Droptrigger触发器名查看DML触发器:sp_help‘触发器名’或sp_helptext‘触发器名’DDL触发器•格式:Createtrigger触发器名on{allserver|database}{for|after}A

sSQL语句DDL触发器•例:建立用于保护“实例数据库”中的数据表不被删除的触发器。Use实例数据库CreatetriggerT_禁止删除表OndatabaseFordrop_tableAsBeginprint‘对不起,表不允许删除!’rollbackEnd

小橙橙
小橙橙
文档分享,欢迎浏览!
  • 文档 25747
  • 被下载 7
  • 被收藏 0
相关资源
广告代码123
若发现您的权益受到侵害,请立即联系客服,我们会尽快为您处理。侵权客服QQ:395972555 (支持时间:9:00-21:00) 公众号
Powered by 太赞文库
×
确认删除?