《SQL Server 基础教程及上机指导》课件第7章.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《《SQL Server 基础教程及上机指导》课件第7章.ppt》由用户(kld)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- SQL Server 基础教程及上机指导 SQL Server 基础教程及上机指导课件第7章 SQL 基础教程 上机 指导 课件
- 资源描述:
-
1、1 1第7章 触 发 器u7.1 触发器简介触发器简介u7.2 触发器的工作原理触发器的工作原理u7.3 创建和管理触发器创建和管理触发器u7.4 上机实验上机实验u 习题习题2 2触发器是一种特殊类型的存储过程,它并不同于第6章中所介绍过的存储过程。触发器主要是通过事件自动触发而被执行的,而存储过程是通过存储过程名字来显式调用的。在以下各节中我们将对触发器的概念、功能以及使用方法作详细介绍。3 3本章学习目标:本章学习目标:(1)掌握创建、修改和删除触发器的方法。(2)充分理解触发器的工作原理以及inserted表和deleted表的使用方法。(3)能够灵活运用触发器来解决实际问题。4 4触
2、发器实际上就是一种特殊类型的存储过程,它的特殊性就体现在:它是在执行某些特定的T-SQL语句时自动被触发而执行的,这些特定的T-SQL语句通常包括INSERT、DELETE 和UPDATE等。7.1 触触发发器器简简介介5 51触发器的主要功能触发器的主要功能可以利用触发器来完成很多功能,常见的如下:(1)对数据库进行强化约束,完成比约束更复杂的数据约束。(2)执行级联操作。触发器可以监视数据库内的操作,并自动地级联影响整个数据库的相关数据。(3)进行存储过程的嵌套调用。触发器本身就是一种存储过程,而存储过程是可以嵌套使用的,所以触发器也可以调用一个或多个存储过程。6 62触发器对数据库完整性
3、的扩展触发器对数据库完整性的扩展Microsoft SQL Server 2005 提供了两种主要机制来强制执行业务规则和数据完整性:约束和触发器。约束和触发器在特殊情况下各有优点。触发器的主要优点在于它们可以包含使用 T-SQL代码的复杂处理逻辑。因此,触发器可以支持约束的所有功能;但触发器对于给定的功能并不总是最好的方法。7 7实体完整性总应在最低级别上通过索引进行强制,这些索引应是PRIMARY KEY和UNIQUE约束的一部分,或者是独立于约束而创建的。域完整性应通过CHECK约束进行强制,而引用完整性(RI)则应通过FOREIGN KEY约束进行强制,假设这些约束的功能满足应用程序的
4、功能需求。8 83触发器种类触发器种类SQL Server 2005包括两大类触发器:数据操作语言(Data Manipulation Language,DML)触发器和数据定义语言(Data Definition Language,DDL)触发器。DML触发器在数据库中发生数据操作语言(DML)事件时将启用。DML事件包括在指定表或视图中修改数据的INSERT语句、UPDATE语句或DELETE语句。DML触发器可以查询其他表,还可以包含复杂的T-SQL语句。触发器和触发它的语句可作为在触发器内回滚的单个事务对待。如果检测到错误,则整个事务自动回滚。SQL Server 2005的DML触发
5、器又可分为两类:9 9(1)After触发器:这类触发器在记录已经改变完之后(after)才会被激活执行。(2)Instead Of触发器:这类触发器一般用来取代原本的操作,在记录变更之前发生。DDL触发器是SQL Server 2005的新增功能。当服务器或数据库中发生数据定义语言(DDL)事件时将调用这些触发器。10 10在创建和使用触发器前,有必要先了解触发器的工作原理,而了解触发器工作原理的关键又在于了解两个特殊的表:inserted表和deleted表。这两个表是在运行触发器的时候临时被创建的,而且是驻留在数据库服务器的内存中的。它们是由系统管理的逻辑表,而不是真正存储在数据库中的物
6、理表,其具有以下几个特点:7.2 触发器的工作原理触发器的工作原理11 11(1)它们在结构上和触发器所在的表的结构相同。(2)它们只是临时驻留在内存里,当触发器的工作完成之后,这两个表也将会从内存中删除。(3)对于这两个表,用户只能够引用它们的数据,但没有修改的权限。假设某个表在INSERT、DELETE和UPDATE语句上定义了触发器,那么下面分三种情况来讲解inserted表和deleted表中的记录。当执行的是INSERT语句时,inserted表里存放的是要插入的记录,而deleted表中没有记录。12 12当执行的是DELETE语句时,deleted表里存放的是要删除的记录,而in
7、serted表中没有记录。当执行的是UPDATE语句时,可以将更新操作看成是有两个操作组成:首先将要更新的记录删除,然后再根据要更新的数据生成一条新记录插回表中,所以deleted表里存放的是更新前原来的记录,而inserted表里存放的是已被更新后的记录。13 137.3.1 创建触发器的语法创建触发器的语法创建触发器的语句是CREATE TRIGGER,具体语法如下:CREATE TRIGGER trigger_name ON table|view WITH ,.n FOR|AFTER|INSTEAD OF 7.3 创建和管理触发器创建和管理触发器14 14 INSERT ,UPDATE
8、,DELETE AS sql_statement ;其中各个参数的含义如下:trigger_name:触发器的名称。每个trigger_name必须遵循标识符规则。table|view:对其执行DML触发器的表或视图,有时称为触发器表或触发器视图。AFTER:指定DML触发器仅在触发SQL语句中指定的所有操作都已成功执行时才被激发。15 15INSTEAD OF:指定DML触发器是“代替”SQL语句执行的,因此其优先级高于触发语句的操作。DELETE,INSERT,UPDATE:指定数据修改语句,这些语句可在DML触发器对此表或视图进行尝试时激活该触发器。在触发器定义中必须至少指定一个选项,允
9、许使用上述选项的任意顺序组合。sql_statement:触发条件和操作,触发器条件指定其他标准,用于确定尝试的 DML 或 DDL 语句是否导致执行触发器操作。16 167.3.2 触发器的创建与使用触发器的创建与使用1INSERT触发器触发器首先创建一个INSERT触发器,用于对插入TestInformation表的记录进行检查,规定Score字段的值只能处于0100之间,如果不符合这个条件,将回滚事务(ROLLBACK TRANSACTION),并且给出错误信息,具体代码如代码清单7-1所示。17 1718 18上面的代码所创建的触发器名称为“CheckScore”,它是一个INSERT
10、触发器(FOR INSERT),当对TestInformation表执行INSERT语句时,触发器就会被触发而执行。首先声明了一个整型变量score,用来存放所插入记录的Score字段的值,接下来的语句值得注意:SELECT score=Score FROM inserted19 19这里FROM inserted子句中所指定的就是在7.2节中所介绍的inserted表,所插入的记录会复制一份副本在inserted表中,然后就可以对它进行引用。在IF语句中,判断所插入记录的Score字段值是否处于0100之间,如果不是,将采取的方法是:利用ROLLBACK TRANSACTION语句将事务回滚
11、到插入记录前的状态。在这里解释一下事务的概念,事务是单个的工作单元。如果某一事务成功,则在该事务中进行的所有数据修改均会提交,成为数据库中的永久组成部分。如果事务遇到错误且必须取消或回滚,则所有数据修改均被清除。其实,在触发器中,ROLLBACK TRANSACTION语句的使用非常普遍。2020当调用ROLLBACK TRANSACTION语句时,就会将本次事务中所做的更改全部取消,在这里也就是将已经插入到TestInformation表中的记录予以清除。接下来使用语句RAISERROR(成绩的有效范围是-100,16,1)给出错误信息,RAISERROR的功能是将系统错误或警告消息返回到应
12、用程序中。运行上述代码之后,就可以看到CheckScore触发器了,如图7-1所示。21 21图7-1 新创建的CheckScore触发器2222测试触发器的执行效果时,将执行两条INSERT语句(记住:触发器是没有显式的调用命令,而是由相应的语句触发的,CheckScore触发器是INSERT触发器,是由INSERT语句触发),一条包含正确的数据,另一条的数据并不符合条件,比较两条语句的执行结果,具体代码如代码清单7-2所示,执行结果如图7-2所示。2323图7-2 执行两条INSERT语句的不同结果2424从图7-2可以看到,两条INSERT语句返回的消息是不同的,第一条INSERT语句成
13、功地被执行了,返回了“1行受影响”的消息,而第二条INSERT语句所插入的记录的Score值为105,所以操作被回滚,并得到了预期的错误消息“成绩的有效范围是-100”。同时打开TestInformation表来验证结果,可以在图7-3中看到最后的一条记录正是刚刚插入的记录。2525图7-3 第一条INSERT语句成功把记录插入TestInformation表2626再如向TestInformation表插入记录的时候,除了进行Score的判断之外,还要根据所插入记录的StudentID字段的值,到student表中去检查一个字段IsLost,这个字段是字符型数据,表示的是这个学生是否已经退学
14、。如果它的值为“是”,则这个学生已经退学,如果为“否”,则这个学生是在读的。很明显,当这个学生是在读学生时,就允许记录被插入到TestInformation表,否则将回滚事务。在这种情况下,通过在TestInformation表建立约束的方法是无法实现这种逻辑判断的,因为约束只能指定表内的数据,无法引用另外表的数据。而触发器可以完成比约束更复杂的数据约束,根据上述的逻辑创建触发器CheckIsLost,具体代码如代码清单7-3所示。27272828在上面的代码中,判断所插入记录的学生是否已经退学时,声明了两个变量studentID和isLost,其中studentID用来存放所插入的新记录的学
15、号,isLost用来存放根据studentID变量的值查找到的学生是否已经退学的信息。studentID的值从inserted表由下面的语句获得:SELECT studentID=StudentID FROM inserted而isLost的值从student表由下面的语句获得:SELECT isLost=IsLost FROM student WHERE studentID=ststudent2929接下来仍然执行两条INSERT语句,比较两条语句的执行结果,具体代码如代码清单7-4所示,执行结果如图7-4所示。3030图7-4 执行两条INSERT语句的不同结果31 31从图7-4可以看到
16、,两条INSERT语句返回的消息是不同的,第一条INSERT语句成功地被执行了,返回了“1行受影响”的消息,而第二条INSERT语句所插入的记录的StudentID值为“20020866”,而在Student表StudentID值为“20020866”的记录的IsLost字段值为“是”,所以操作被回滚,并得到了预期的错误消息“该生已经退学!”。32322UPDATE触发器触发器上面的两个例子介绍了怎样创建INSERT触发器,接下来介绍UPDATE触发器。UPDATE触发器是当对表执行UPDATE语句完毕后被触发执行的,在UPDATE触发器中可以同时利用inserted表和deleted表的记录
17、。考虑下面的情况,TestInformation表中存放有代表级别的Degree字段和代表学分的字段Credit,而且Credit字段的值与Degree有关。当对TestInformation表进行修改Degree字段之后,若成绩合格(60分以上),如果是一级,获得的学分就是1分;如果是二级,获得的学分就是4分。3333当我们修改TestInformation表中的记录时,要根据所修改的情况修改相应的学分,具体代码如代码清单7-5所示。34343535在上面的代码中,首先声明了4个变量,其中infoID用来存放deleted表中记录的InfoID值,(请记住deleted表中的记录是修改前的记
展开阅读全文