数据库实验3-触发器报告

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

数据库技专题训练I(2014年春)序号:数据库专题训练------触发器实验报告系别:计算机科学与技术班级:计11-3班姓名:黄娟娟学号:11101020324成绩:评语:指导教师签字:日期:实验二触发器一、实验环境及要求触发器是一种特殊的存储过程,不能被用户直接调用。可以包含复杂的SQL语句。在特定事件发生时自动触发执行,通常用于实现强制业务规则和数据完整性。DML触发器分为两种类型:AFTER触发器和INSTEADOF触发器。通过本次实验掌握触发器的创建方法以及使用方法。二、实验步骤及结果1)创建一个名为tri_Insert_S的触发器,测试改触发器的执行情况,并给出实验结果。当插入的新记录中Sage的值不是18至25之间的数值时,就激活该触发器,撤销该插入操作,并给出错误提示。useSXCJgocreatetriggertri_Insert_SonSafterinsertasifexists(select*frominsertedwhereSage=18andSage=25)print'添加成功!'elsebeginprint'无法添加!'rollbacktransactionendgoinsertintoSvalues('S8','黄丽','女',26,'计算机')insertintoSvalues('S8','黄丽','女',20,'计算机')select*fromSgo显示如下:insertintoSvalues('S8','黄丽','女',26,'计算机')insertintoSvalues('S8','黄丽','女',20,'计算机')2)创建一个名为tri_Update_SC的触发器,要求:(1)首先判断数据库中是否已经存在名为tri_Update_SC的触发器,如果存在,首先删除,再创建。(2)当试图修改SC表中的学生成绩时,给出不能随便修改成绩的信息提示。useSXCJgoifexists(selectnamefromsysobjectswherename='tri_Update_SC'andtype='TR')begindroptriggertri_Update_SCendelseprint'不存在该触发器,可新建。'Go显示如下:createtriggertri_Update_SConSCafterupdateasifupdate(Score)beginprint'不能随意修改成绩!'rollbacktransactionendgoupdateSCsetscore=90Go显示如下:3)使用系统存储过程sp_help,sp_helptext,sp_helptrigger查看触发器相关信息。给出显示结果。useSXCJgoexecsp_help'tri_Insert_S'execsp_helptext'tri_Insert_S'execsp_helptrigger'S'go显示如下:4)禁用tri_Update_SC触发器,并演示禁用该触发器后Update的执行情况。useSXCJgoaltertableSCdisabletriggertri_Update_SCupdateSCsetScore='95'whereSno='S1'andCno='C3'print'修改成功!'select*fromSCGo显示如下:5)在SC表上创建一个insteadof类型的触发器,触发器名称为:tri__Insert_SC。实现:当向表SC插入记录时检查分数的合理性,分数必须在0到100之间,如果不合理就拒绝插入,并给出信息提示,useSXCJgoifexists(selectnamefromsysobjectswherename='tri__InseCrt_SC'andtype='TR')begindroptriggertri__InseCrt_SCendelsebegincreatetriggertri__InseCrt_SConSCinsteadofinsertasifexists(select*frominsertedwhereScore=0andScore=100)begininsertintoSCselect*frominsertedprint'插入成功!'endelsebeginrollbacktransactionprint'分数必须在到之间,插入数据失败!'endendgoinsertintoSCvalues('S3','C3',110)go显示如下:6)创建一个名为tir_Update_S的触发器,实现:当学生基本表S中的学号Sno发生变化时,SC选课记录中对应的学号也发生改变。并通过测试数据验证该触发器的执行情况。useSXCJgoifexists(selectnamefromsysobjectswherename='tir_Update_S'andtype='TR')begindroptriggertir_Update_Sendgocreatetriggertir_Update_SonSafterupdateasdeclare@OldSnovarchar(20),@newSnovarchar(20)select@OldSno=Snofromdeletedselect@newSno=Snofrominsertedif(update(Sno))beginupdateSCsetSC.Sno=@newSnowhereSC.Sno=@OldSnoendelserollbacktransactiongoupdateSsetSno='S11'whereSno='S1'select*fromSselect*fromSC显示如下:S表:SC表:7)创建一个名为tri_Delete_C的触发器,实现:删除一门课程时候,首先判断该课程有否有人选,如果有人选,则不能删除并通过测试数据验证该触发器的执行情况。useSXCJgocreatetriggertri_Delete_ConCinsteadofdeleteasif(exists(select*fromSC,deletedwhereSC.Cno=deleted.Cno))beginrollbacktransactionprint'该课程无法删除!'endelsebegindeletefromCwhereCnoin(selectCnofromdeleted)endgodeletefromCwhereCno='C1'go显示如下:三、实验中的问题及解决方法问题:对update触发器不是很熟悉,在建立此触发器的时候,对于deleted表和inserted表调用的不当,导致老出现问题。解决方法:通过查询资料,了解到deleted表是存放更新前的数据,而inserted表是存放更新后的数据。通过定义变量,先把表内的数据赋值到变量上,然后能够灵活应用。四、实验总结通过实验大概学习了AFTER触发器和INSTEADOF触发器。实践了触发器的创建方法以及使用方法。其中,AFTER触发器又称为后触发器,该类触发器是在引起触发器执行的修改语句成功完成之后执行。如果修改语句因错误(如违反约束或语法错误)而失败,触发器将不会执行。此触发器只能定义在表上,不能创建在视图上。可以为每个触发操作(INSERT、UPDATE或DELETE)创建多个AFTER触发器。INSTEADOF触发器(又称为替代触发器)当引起触发器执行的修改语句停止执行时,该类触发器代替触发操作执行。该类触发器既可在表上定义,也可在视图上定义。对于每个触发操作(INSERT、UPDATE和DELETE)只能定义一个INSTEADOF触发器。由于对INSTEADOF触发器掌握不是很牢固,在建立过程中出现问题。而且对于update触发操作使用的不是很好。在实验过程,通过老师上课的ppt以及在网上查询资料都能够顺利的解决在实验中发生的问题。

1 / 8
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功