《第10章游标和触发器》由会员分享,可在线阅读,更多相关《第10章游标和触发器(61页珍藏版)》请在金锄头文库上搜索。
1、1第第10章章 游标和触发器游标和触发器10.110.1游标的定义和优点游标的定义和优点游标的定义和优点游标的定义和优点10.2 10.2 游游游游标标的的的的应应用用用用10.3 10.3 触发器概述触发器概述触发器概述触发器概述 10.4 10.4 创创建建建建/ /管理管理管理管理DMLDML触触触触发发器器器器10.5 10.5 创创建建建建DDLDDL触触触触发发器器器器 蕴芝嫡哼寥骇捐末渤骚斤辛鹿羔痴札且妨幸易迢宗缮钨积揭褒敞邵求阶囚第10章游标和触发器第10章游标和触发器210.1游标的定义及其优点游标的定义及其优点数据检索可以数据检索可以数据检索可以数据检索可以得到数据库中有关
2、表的数据,但这些数据是作得到数据库中有关表的数据,但这些数据是作得到数据库中有关表的数据,但这些数据是作得到数据库中有关表的数据,但这些数据是作为一个结果集得到的,用户可以把这个结果集保存到一个文件里,为一个结果集得到的,用户可以把这个结果集保存到一个文件里,为一个结果集得到的,用户可以把这个结果集保存到一个文件里,为一个结果集得到的,用户可以把这个结果集保存到一个文件里,或生成一个新表以便于以后使用。这种查询是非常重要的。但这或生成一个新表以便于以后使用。这种查询是非常重要的。但这或生成一个新表以便于以后使用。这种查询是非常重要的。但这或生成一个新表以便于以后使用。这种查询是非常重要的。但这
3、种查询形式有一个很大的缺点,它不能对结果集中每一行的数据种查询形式有一个很大的缺点,它不能对结果集中每一行的数据种查询形式有一个很大的缺点,它不能对结果集中每一行的数据种查询形式有一个很大的缺点,它不能对结果集中每一行的数据进行处理。使用游标可以实现对查询结果集中的数据逐行处理。进行处理。使用游标可以实现对查询结果集中的数据逐行处理。进行处理。使用游标可以实现对查询结果集中的数据逐行处理。进行处理。使用游标可以实现对查询结果集中的数据逐行处理。10.1.110.1.1游标的概念游标的概念游标的概念游标的概念游标游标游标游标(Cursor)(Cursor)是一种处理数据的方法,为了查看或者处理结
4、是一种处理数据的方法,为了查看或者处理结是一种处理数据的方法,为了查看或者处理结是一种处理数据的方法,为了查看或者处理结果集中的数据,游标提供了在结果集中向前或者向后浏览数据的果集中的数据,游标提供了在结果集中向前或者向后浏览数据的果集中的数据,游标提供了在结果集中向前或者向后浏览数据的果集中的数据,游标提供了在结果集中向前或者向后浏览数据的能力。可以把游标看成一种指针,它既可以指向当前位置,也可能力。可以把游标看成一种指针,它既可以指向当前位置,也可能力。可以把游标看成一种指针,它既可以指向当前位置,也可能力。可以把游标看成一种指针,它既可以指向当前位置,也可以指向结果集中的任意位置,它允许
5、用户对指定位置的数据进行以指向结果集中的任意位置,它允许用户对指定位置的数据进行以指向结果集中的任意位置,它允许用户对指定位置的数据进行以指向结果集中的任意位置,它允许用户对指定位置的数据进行处理,可以把结果集中的数据放在数组、应用程序中或其它地方。处理,可以把结果集中的数据放在数组、应用程序中或其它地方。处理,可以把结果集中的数据放在数组、应用程序中或其它地方。处理,可以把结果集中的数据放在数组、应用程序中或其它地方。Transact-SQLTransact-SQL游标遵循游标遵循游标遵循游标遵循ANSI-92ANSI-92标准。标准。标准。标准。暮蔑前阂溅饺冶踏泌咯概重联坛政巩缉得狰爆天耕
6、舌雇栽垮沸诗减劳娄抢第10章游标和触发器第10章游标和触发器310.1.210.1.2使用游标的优点使用游标的优点使用游标的优点使用游标的优点从游标定义可以得知游标具有如下的优点,正是这些优点从游标定义可以得知游标具有如下的优点,正是这些优点从游标定义可以得知游标具有如下的优点,正是这些优点从游标定义可以得知游标具有如下的优点,正是这些优点使得游标在实际编程应用中具有重要作用。使得游标在实际编程应用中具有重要作用。使得游标在实际编程应用中具有重要作用。使得游标在实际编程应用中具有重要作用。 允许程序对由查询语句允许程序对由查询语句允许程序对由查询语句允许程序对由查询语句SELECTSELECT
7、返回的行集合中的每返回的行集合中的每返回的行集合中的每返回的行集合中的每一行数据执行相同或不同的操作,而不是对整个行集一行数据执行相同或不同的操作,而不是对整个行集一行数据执行相同或不同的操作,而不是对整个行集一行数据执行相同或不同的操作,而不是对整个行集合执行同一个操作合执行同一个操作合执行同一个操作合执行同一个操作 提供对基于游标位置的表中的行进行删除和更新的能提供对基于游标位置的表中的行进行删除和更新的能提供对基于游标位置的表中的行进行删除和更新的能提供对基于游标位置的表中的行进行删除和更新的能力力力力 游标实际上作为面向集合的数据库管理系统游标实际上作为面向集合的数据库管理系统游标实际
8、上作为面向集合的数据库管理系统游标实际上作为面向集合的数据库管理系统(RDBMSRDBMS)和面向行的程序设计之间的桥梁,使这两)和面向行的程序设计之间的桥梁,使这两)和面向行的程序设计之间的桥梁,使这两)和面向行的程序设计之间的桥梁,使这两种处理方式通过游标沟通起来种处理方式通过游标沟通起来种处理方式通过游标沟通起来种处理方式通过游标沟通起来本章首页本章首页写磋崩痴枪救贰昼叶黄妊枕沥菠脑蔬蛤瞪峭霖嘛跌蹈约者榷媳碳杭浸害堡第10章游标和触发器第10章游标和触发器410.2游标的使用游标的使用10.2.110.2.1使用游标的步骤使用游标的步骤使用游标的步骤使用游标的步骤使用游标的工作流程如下图
9、使用游标的工作流程如下图使用游标的工作流程如下图使用游标的工作流程如下图13-113-1所示。具体地说,有如下所示。具体地说,有如下所示。具体地说,有如下所示。具体地说,有如下几个步骤:几个步骤:几个步骤:几个步骤: 创建游标。使用创建游标。使用创建游标。使用创建游标。使用T-SQLT-SQL语句生成一个结果集,并语句生成一个结果集,并语句生成一个结果集,并语句生成一个结果集,并且定义游标的特征,如游标中的记录是否可以修改。且定义游标的特征,如游标中的记录是否可以修改。且定义游标的特征,如游标中的记录是否可以修改。且定义游标的特征,如游标中的记录是否可以修改。 打开游标。打开游标。打开游标。打
10、开游标。 从游标的结果集中读取数据。从游标中检索一行从游标的结果集中读取数据。从游标中检索一行从游标的结果集中读取数据。从游标中检索一行从游标的结果集中读取数据。从游标中检索一行或多行数据称为取数据。或多行数据称为取数据。或多行数据称为取数据。或多行数据称为取数据。 对游标中的数据逐行操作。对游标中的数据逐行操作。对游标中的数据逐行操作。对游标中的数据逐行操作。 关闭和释放游标。关闭和释放游标。关闭和释放游标。关闭和释放游标。氢房乙杜镶株竣时撮绸丈鹰雕都凳寂汐绞藏燎玫哩郭苑券酉直嘲挟二倔沽第10章游标和触发器第10章游标和触发器510.2.210.2.2游标的定义及使用过程游标的定义及使用过程
11、游标的定义及使用过程游标的定义及使用过程1.1.声明游标声明游标声明游标声明游标声明游标是指用声明游标是指用声明游标是指用声明游标是指用DECLAREDECLARE语句声明或创建一个游标。语句声明或创建一个游标。语句声明或创建一个游标。语句声明或创建一个游标。声明游标的语法如下:声明游标的语法如下:声明游标的语法如下:声明游标的语法如下:DECLAREDECLAREcursor_namecursor_nameSCROLLCURSORSCROLLCURSORFORFORselect_statementselect_statementFORREADONLY|UPDATEOFFORREADONLY|
12、UPDATEOFcolumn_name_listcolumn_name_list 其中:其中:其中:其中: cursor_name:cursor_name:是游标的名字,为一个合法的是游标的名字,为一个合法的是游标的名字,为一个合法的是游标的名字,为一个合法的SQLServerSQLServer标标标标识符,游标的名字必须遵循识符,游标的名字必须遵循识符,游标的名字必须遵循识符,游标的名字必须遵循SQLServerSQLServer命名规范。命名规范。命名规范。命名规范。 SCROLLSCROLL:表示取游标时可以使用关键字:表示取游标时可以使用关键字:表示取游标时可以使用关键字:表示取游标时
13、可以使用关键字NEXTNEXT、PRIORPRIOR、FIRSTFIRST、LASTLAST、ABSOLUTEABSOLUTE、RELATIVERELATIVE。每个关键字的。每个关键字的。每个关键字的。每个关键字的含义将在介绍含义将在介绍含义将在介绍含义将在介绍FETCHFETCH子句时讲解。子句时讲解。子句时讲解。子句时讲解。 select_statementselect_statement:是定义游标结果集的标准是定义游标结果集的标准是定义游标结果集的标准是定义游标结果集的标准SELECTSELECT语语语语句,它可以是一个完整语法和语义的句,它可以是一个完整语法和语义的句,它可以是一个
14、完整语法和语义的句,它可以是一个完整语法和语义的Transact-SQLTransact-SQL的的的的SELECTSELECT语句。语句。语句。语句。菊坠硕囱结句阻写狰漱祁鳞鞍洒朗壁砖踢周排甭痘心盯禁采父显得阂瘸臭第10章游标和触发器第10章游标和触发器6 但是这个但是这个但是这个但是这个SELECTSELECT语句必须有语句必须有语句必须有语句必须有FROMFROM子句,不允许使用关键字子句,不允许使用关键字子句,不允许使用关键字子句,不允许使用关键字 COMPUTECOMPUTE、COMPUTEBYCOMPUTEBY、FORBROWSEFORBROWSE和和和和INTOINTO。 FOR
15、READONLYFORREADONLY:指出该游标结果集只能读,不能修改。:指出该游标结果集只能读,不能修改。:指出该游标结果集只能读,不能修改。:指出该游标结果集只能读,不能修改。 FORUPDATEFORUPDATE:指出该游标结果集可以被修改。:指出该游标结果集可以被修改。:指出该游标结果集可以被修改。:指出该游标结果集可以被修改。 OFcolumn_name_listOFcolumn_name_list:列出可以被修改的列的名单。:列出可以被修改的列的名单。:列出可以被修改的列的名单。:列出可以被修改的列的名单。应该注意应该注意应该注意应该注意: : 游标有且只有两种方式:游标有且只有
16、两种方式:游标有且只有两种方式:游标有且只有两种方式:FORREADONLYFORREADONLY或或或或FORFORUPDATEUPDATE。 当游标方式指定为当游标方式指定为当游标方式指定为当游标方式指定为FORREADONLYFORREADONLY时,游标涉及的表不时,游标涉及的表不时,游标涉及的表不时,游标涉及的表不能被修改。能被修改。能被修改。能被修改。 当游标方式指定为当游标方式指定为当游标方式指定为当游标方式指定为FORUPDATEFORUPDATE时,可以删除或更新游标时,可以删除或更新游标时,可以删除或更新游标时,可以删除或更新游标涉及的表中的行。通常,这也是缺省方式,即不指
17、定游标方涉及的表中的行。通常,这也是缺省方式,即不指定游标方涉及的表中的行。通常,这也是缺省方式,即不指定游标方涉及的表中的行。通常,这也是缺省方式,即不指定游标方式时为式时为式时为式时为FORUPDATEFORUPDATE方式。方式。方式。方式。 声明游标的声明游标的声明游标的声明游标的DECLARECURSORDECLARECURSOR语句必须是在该游标的语句必须是在该游标的语句必须是在该游标的语句必须是在该游标的任何任何任何任何OPENOPEN语句之前。语句之前。语句之前。语句之前。涉王朝壕考沾十陷百翘扣梨及咆浚勿汉扫晒毡替摈贾育欺摹溶蘑浸趋冗章第10章游标和触发器第10章游标和触发器7
18、2.2.打开游标打开游标打开游标打开游标打开游标是指打开已被声明但尚未被打开的游标,打开游打开游标是指打开已被声明但尚未被打开的游标,打开游打开游标是指打开已被声明但尚未被打开的游标,打开游打开游标是指打开已被声明但尚未被打开的游标,打开游标使用标使用标使用标使用OPENOPEN语句。语句。语句。语句。打开游标的语法如下:打开游标的语法如下:打开游标的语法如下:打开游标的语法如下:OPENOPENcursor_namecursor_name其中:其中:其中:其中:cursor_namecursor_name是一个已声明的尚未打开的游标名。是一个已声明的尚未打开的游标名。是一个已声明的尚未打开的
19、游标名。是一个已声明的尚未打开的游标名。注意:注意:注意:注意: 当游标打开成功时,游标位置指向结果集的第一行当游标打开成功时,游标位置指向结果集的第一行当游标打开成功时,游标位置指向结果集的第一行当游标打开成功时,游标位置指向结果集的第一行之前。之前。之前。之前。 只能打开已经声明但尚未打开的游标。只能打开已经声明但尚未打开的游标。只能打开已经声明但尚未打开的游标。只能打开已经声明但尚未打开的游标。莫张匿租巳屋莆伶辉拌瞄观污洼恕皮嗅来晌民入讲玉埋起骚时溢铱若致侧第10章游标和触发器第10章游标和触发器83.3.从打开的游标中提取行从打开的游标中提取行从打开的游标中提取行从打开的游标中提取行游
20、标被打开后,游标位置位于结果集的第一行前,此时可以从结游标被打开后,游标位置位于结果集的第一行前,此时可以从结游标被打开后,游标位置位于结果集的第一行前,此时可以从结游标被打开后,游标位置位于结果集的第一行前,此时可以从结果集中提取(果集中提取(果集中提取(果集中提取(FETCHFETCH)行。)行。)行。)行。SQLServerSQLServer将沿着游标结果集一行将沿着游标结果集一行将沿着游标结果集一行将沿着游标结果集一行或多行向下移动游标位置,不断提取结果集中的数据,并修或多行向下移动游标位置,不断提取结果集中的数据,并修或多行向下移动游标位置,不断提取结果集中的数据,并修或多行向下移动
21、游标位置,不断提取结果集中的数据,并修改和保存游标当前的位置,直到结果集中的行全部被提取。改和保存游标当前的位置,直到结果集中的行全部被提取。改和保存游标当前的位置,直到结果集中的行全部被提取。改和保存游标当前的位置,直到结果集中的行全部被提取。从打开的游标中提取行的语法如下:从打开的游标中提取行的语法如下:从打开的游标中提取行的语法如下:从打开的游标中提取行的语法如下:FETCHFETCH NEXT|PRIOR|FIRST|LAST|ABSOLUTE|RELATIVENEXT|PRIOR|FIRST|LAST|ABSOLUTE|RELATIVE FROMFROM cursor_namecur
22、sor_nameINTOINTOfetch_target_listfetch_target_list其中:其中:其中:其中: cursor_namecursor_name:为一已声明并已打开的游标名字。:为一已声明并已打开的游标名字。:为一已声明并已打开的游标名字。:为一已声明并已打开的游标名字。 NEXT|PRIOR|FIRST|LAST|ABSOLUTE|RELATIVENEXT|PRIOR|FIRST|LAST|ABSOLUTE|RELATIVE:游:游:游:游标移动方向,缺省情况下是标移动方向,缺省情况下是标移动方向,缺省情况下是标移动方向,缺省情况下是NEXTNEXT,即向下移动。,
23、即向下移动。,即向下移动。,即向下移动。 NEXTNEXT:取下一行数据。:取下一行数据。:取下一行数据。:取下一行数据。 PRIORPRIOR:取前一行数据。:取前一行数据。:取前一行数据。:取前一行数据。 FIRSTFIRST:取第一行数据。:取第一行数据。:取第一行数据。:取第一行数据。忆洋捕挫舶点力亡鄂愁课寇堰窘邑雍娃蒋弊侠皖跋碑茧倾抬欢慌匠鼻禹瘴第10章游标和触发器第10章游标和触发器9LASTLAST:取最后一行数据。:取最后一行数据。:取最后一行数据。:取最后一行数据。ABSOLUTEABSOLUTE:按绝对位置取数据。:按绝对位置取数据。:按绝对位置取数据。:按绝对位置取数据。
24、RELATIVERELATIVE:按相对位置取数据。:按相对位置取数据。:按相对位置取数据。:按相对位置取数据。游标位置确定了结果集中哪一行可以被提取,如果游标方式游标位置确定了结果集中哪一行可以被提取,如果游标方式游标位置确定了结果集中哪一行可以被提取,如果游标方式游标位置确定了结果集中哪一行可以被提取,如果游标方式为为为为FORUPDATEFORUPDATE的话,也就确定该位置一行数据可以被更的话,也就确定该位置一行数据可以被更的话,也就确定该位置一行数据可以被更的话,也就确定该位置一行数据可以被更新或删除。新或删除。新或删除。新或删除。INTOfetch_target_listINTOf
25、etch_target_list:指定存放被提取的列数据的目的:指定存放被提取的列数据的目的:指定存放被提取的列数据的目的:指定存放被提取的列数据的目的变量清单。这个清单中变量的个数、数据类型、顺序必须变量清单。这个清单中变量的个数、数据类型、顺序必须变量清单。这个清单中变量的个数、数据类型、顺序必须变量清单。这个清单中变量的个数、数据类型、顺序必须与定义该游标的与定义该游标的与定义该游标的与定义该游标的select_statementselect_statement的的的的SELECT_listSELECT_list中列出中列出中列出中列出的列清单相匹配。为了更灵活地操纵数据,可以把从已声的
26、列清单相匹配。为了更灵活地操纵数据,可以把从已声的列清单相匹配。为了更灵活地操纵数据,可以把从已声的列清单相匹配。为了更灵活地操纵数据,可以把从已声明并已打开的游标结果集中提取的列数据,分别存放在目明并已打开的游标结果集中提取的列数据,分别存放在目明并已打开的游标结果集中提取的列数据,分别存放在目明并已打开的游标结果集中提取的列数据,分别存放在目的变量中。的变量中。的变量中。的变量中。INTOfetch_target_listINTOfetch_target_list是是是是T-SQLT-SQL对对对对ANSI-92ANSI-92SQLSQL标准的扩充。标准的扩充。标准的扩充。标准的扩充。候诅
27、拓迂存吃卖轻菊摊翌淄均酗琶瞒右副堆猖循钟垫允让部畴人椅岭违叉第10章游标和触发器第10章游标和触发器10有两个全局变量提供关于游标活动的信息:有两个全局变量提供关于游标活动的信息:有两个全局变量提供关于游标活动的信息:有两个全局变量提供关于游标活动的信息:FETCH_STATUSFETCH_STATUS 保存着最后保存着最后保存着最后保存着最后FETCHFETCH语句执行后的状态信语句执行后的状态信语句执行后的状态信语句执行后的状态信息,其值和含义如下:息,其值和含义如下:息,其值和含义如下:息,其值和含义如下: 00:表示成功完成:表示成功完成:表示成功完成:表示成功完成FETCHFETCH
28、语句。语句。语句。语句。 -1-1:表示:表示:表示:表示FETCHFETCH语句执行有错误,或者当前游标位置已在结语句执行有错误,或者当前游标位置已在结语句执行有错误,或者当前游标位置已在结语句执行有错误,或者当前游标位置已在结果集中的最后一行,结果集中不再有数据。果集中的最后一行,结果集中不再有数据。果集中的最后一行,结果集中不再有数据。果集中的最后一行,结果集中不再有数据。 -2-2:提取的行不存在。:提取的行不存在。:提取的行不存在。:提取的行不存在。rowcountrowcount保存着自游标打开后的第一个保存着自游标打开后的第一个保存着自游标打开后的第一个保存着自游标打开后的第一个
29、FETCHFETCH语句,直到语句,直到语句,直到语句,直到最近一次的最近一次的最近一次的最近一次的FETCHFETCH语句为止,已从游标结果集中提取的行数。语句为止,已从游标结果集中提取的行数。语句为止,已从游标结果集中提取的行数。语句为止,已从游标结果集中提取的行数。也就是说它保存着任何时间点客户机程序看到的已提取的总行数。也就是说它保存着任何时间点客户机程序看到的已提取的总行数。也就是说它保存着任何时间点客户机程序看到的已提取的总行数。也就是说它保存着任何时间点客户机程序看到的已提取的总行数。一旦结果集中所有行都被提取,那么一旦结果集中所有行都被提取,那么一旦结果集中所有行都被提取,那么
30、一旦结果集中所有行都被提取,那么rowcountrowcount的值就是该结果的值就是该结果的值就是该结果的值就是该结果集的总行数。每个打开的游标都与一特定的集的总行数。每个打开的游标都与一特定的集的总行数。每个打开的游标都与一特定的集的总行数。每个打开的游标都与一特定的rowcountrowcount有关,关有关,关有关,关有关,关闭游标时,该闭游标时,该闭游标时,该闭游标时,该rowcountrowcount变量也被删除。在变量也被删除。在变量也被删除。在变量也被删除。在FETCHFETCH语句执行后语句执行后语句执行后语句执行后查看这个变量,可得知从游标结果集中已提取的行数。查看这个变量
31、,可得知从游标结果集中已提取的行数。查看这个变量,可得知从游标结果集中已提取的行数。查看这个变量,可得知从游标结果集中已提取的行数。槐竖嗜酿缅兼姨聚蹦拱辑雪蚤坚澈戈驳国阐尾汛崖麦乔挫纹絮怜咀滨达蔚第10章游标和触发器第10章游标和触发器114.4.关闭游标关闭游标关闭游标关闭游标关闭关闭关闭关闭(Close)(Close)游标是停止处理定义游标的那个查询。关闭游标并游标是停止处理定义游标的那个查询。关闭游标并游标是停止处理定义游标的那个查询。关闭游标并游标是停止处理定义游标的那个查询。关闭游标并不改变它的定义,可以再次用不改变它的定义,可以再次用不改变它的定义,可以再次用不改变它的定义,可以再
32、次用openopen语句打开它,语句打开它,语句打开它,语句打开它,SQLSQLServerServer会用该游标的定义重新创建这个游标的一个结果集。会用该游标的定义重新创建这个游标的一个结果集。会用该游标的定义重新创建这个游标的一个结果集。会用该游标的定义重新创建这个游标的一个结果集。关闭游标的语法如下:关闭游标的语法如下:关闭游标的语法如下:关闭游标的语法如下:CLOSECLOSEcursor_namecursor_name其中:其中:其中:其中: cursor_namecursor_name:是已被打开并将要被关闭的游标名字。是已被打开并将要被关闭的游标名字。是已被打开并将要被关闭的游标
33、名字。是已被打开并将要被关闭的游标名字。 在如下情况下,在如下情况下,在如下情况下,在如下情况下,SQLServerSQLServer会自动地关闭已打开的游标:会自动地关闭已打开的游标:会自动地关闭已打开的游标:会自动地关闭已打开的游标: 当你退出这个当你退出这个当你退出这个当你退出这个SQLServerSQLServer会话时会话时会话时会话时 从声明游标的存储过程中返回时从声明游标的存储过程中返回时从声明游标的存储过程中返回时从声明游标的存储过程中返回时挠瘦盖脓钎极纪龋孵苹念职烯任泽尝沦养根蜂横嘘蔷洋帧痰和蒜切椰夕典第10章游标和触发器第10章游标和触发器125.5.释放游标释放游标释放游
34、标释放游标释放释放释放释放(Deallocate)(Deallocate)游标是指释放所有分配给此游标的资源,包括该游标是指释放所有分配给此游标的资源,包括该游标是指释放所有分配给此游标的资源,包括该游标是指释放所有分配给此游标的资源,包括该游标的名字。游标的名字。游标的名字。游标的名字。释放游标的语法是:释放游标的语法是:释放游标的语法是:释放游标的语法是:DEALLOCATECURSORDEALLOCATECURSORcursor_namecursor_name其中:其中:其中:其中: cursor_namecursor_name:将要被:将要被:将要被:将要被DEALLOCATEDEAL
35、LOCATE释放的游标名字。如释放的游标名字。如释放的游标名字。如释放的游标名字。如果释放一个已打开但未被关闭的游标,果释放一个已打开但未被关闭的游标,果释放一个已打开但未被关闭的游标,果释放一个已打开但未被关闭的游标,SQLServerSQLServer会自动先会自动先会自动先会自动先关闭这个游标,然后再释放它。关闭这个游标,然后再释放它。关闭这个游标,然后再释放它。关闭这个游标,然后再释放它。注意一下关闭游标与释放游标的区别注意一下关闭游标与释放游标的区别注意一下关闭游标与释放游标的区别注意一下关闭游标与释放游标的区别:关闭游标并不改变游标的定关闭游标并不改变游标的定关闭游标并不改变游标的
36、定关闭游标并不改变游标的定义,一个游标关闭后,不需要再次声明,就可以重新打开并使用义,一个游标关闭后,不需要再次声明,就可以重新打开并使用义,一个游标关闭后,不需要再次声明,就可以重新打开并使用义,一个游标关闭后,不需要再次声明,就可以重新打开并使用它。但一个游标释放后,就释放了与该游标有关的一切资源,也它。但一个游标释放后,就释放了与该游标有关的一切资源,也它。但一个游标释放后,就释放了与该游标有关的一切资源,也它。但一个游标释放后,就释放了与该游标有关的一切资源,也包括游标的声明,游标释放后就不能再使用该游标了,如需再次包括游标的声明,游标释放后就不能再使用该游标了,如需再次包括游标的声明
37、,游标释放后就不能再使用该游标了,如需再次包括游标的声明,游标释放后就不能再使用该游标了,如需再次使用游标,就必须重新定义。使用游标,就必须重新定义。使用游标,就必须重新定义。使用游标,就必须重新定义。纸摄揉懈损帮氨仆瑰镊厄威辕俱厂源浓屑十杭诽娜榴势张缨欧篇妻贤将钝第10章游标和触发器第10章游标和触发器13【例【例【例【例10-110-1】定义一个游标,定义一个游标,定义一个游标,定义一个游标,将职员表中所有的职员姓名、头衔显将职员表中所有的职员姓名、头衔显将职员表中所有的职员姓名、头衔显将职员表中所有的职员姓名、头衔显示示示示出来。出来。出来。出来。USEnorthwindUSEnorth
38、windGOGODECLAREemp_nameVARCHAR(16),emp_titleDECLAREemp_nameVARCHAR(16),emp_titleVARCHAR(16)VARCHAR(16)- -声明游标声明游标声明游标声明游标DECLAREemp_coursorSCROLLCURSORFORDECLAREemp_coursorSCROLLCURSORFORSELECTlastname,titleFROMemployeesFORREADONLYSELECTlastname,titleFROMemployeesFORREADONLY- -打开游标打开游标打开游标打开游标OPENem
39、p_coursorOPENemp_coursor- -读取数据读取数据读取数据读取数据FETCHFROMemp_coursorINTOemp_name,emp_titleFETCHFROMemp_coursorINTOemp_name,emp_title疹践净蝎露豌骄钮铭吴佛始陪廷疥支霍蜜棋陛情冉酿畏寸茁教俩丁擂烹吾第10章游标和触发器第10章游标和触发器14WHILEFETCH_STATUS=0WHILEFETCH_STATUS=0BEGINBEGINPRINTNPRINTN职员姓名职员姓名职员姓名职员姓名:+emp_name+N:+emp_name+N职职职职 称称称称:+emp_titl
40、e+emp_title-取下一条数据取下一条数据取下一条数据取下一条数据FETCHnextFROMemp_coursorINTOFETCHnextFROMemp_coursorINTOemp_name,emp_titleemp_name,emp_titleENDEND- -关闭游标关闭游标关闭游标关闭游标CLOSEemp_coursorCLOSEemp_coursor- -释放游标释放游标释放游标释放游标DEALLOCATEemp_coursorDEALLOCATEemp_coursor本章首页本章首页恨浪绪苗袁瓷孤厢窒迂胸惋虑略寄畴镑别两莱憾碌浸央镐胎颖俞罩着龙猎第10章游标和触发器第10章
41、游标和触发器1510.3使用游标修改数据使用游标修改数据用户可以在用户可以在用户可以在用户可以在UPDATEUPDATE或或或或DELETEDELETE语句中使用游标来更新、删除表或语句中使用游标来更新、删除表或语句中使用游标来更新、删除表或语句中使用游标来更新、删除表或视图中的行,但不能用来插入新行。视图中的行,但不能用来插入新行。视图中的行,但不能用来插入新行。视图中的行,但不能用来插入新行。10.3.110.3.1更新数据更新数据更新数据更新数据通过在通过在通过在通过在UPDATEUPDATE语句中使用游标可以更新表或视图中的行。被更新语句中使用游标可以更新表或视图中的行。被更新语句中使
42、用游标可以更新表或视图中的行。被更新语句中使用游标可以更新表或视图中的行。被更新的行依赖于游标位置的当前值。的行依赖于游标位置的当前值。的行依赖于游标位置的当前值。的行依赖于游标位置的当前值。更新数据语法形式如下:更新数据语法形式如下:更新数据语法形式如下:更新数据语法形式如下:UPDATEUPDATEtable_name|view_nametable_name|view_nameSETSETtable_name.|view_name.column_nametable_name.|view_name.column_name = =new_valuenew_value.n.nWHERECURRE
43、NTOFWHERECURRENTOFcursor_namecursor_name其中:其中:其中:其中: 紧跟紧跟紧跟紧跟UPDATEUPDATE之后的之后的之后的之后的table_name|view_nametable_name|view_name:要更新的表:要更新的表:要更新的表:要更新的表名或视图名,可以加或不加限定。但它必须是声明该游标的名或视图名,可以加或不加限定。但它必须是声明该游标的名或视图名,可以加或不加限定。但它必须是声明该游标的名或视图名,可以加或不加限定。但它必须是声明该游标的SELECTSELECT语句中的表名或视图名。语句中的表名或视图名。语句中的表名或视图名。语句
44、中的表名或视图名。笨辆践恨斥街敌锰凄钾衰燥甭择肌谓霄发埔禄楼殖丫湃骋谚绅尹镭蝴捌僵第10章游标和触发器第10章游标和触发器16 column_namecolumn_name:是要更新的列的列名,可以加或不加限是要更新的列的列名,可以加或不加限是要更新的列的列名,可以加或不加限是要更新的列的列名,可以加或不加限定。但它们必须是声明游标的定。但它们必须是声明游标的定。但它们必须是声明游标的定。但它们必须是声明游标的SELECTSELECT语句中语句中语句中语句中UPDATEUPDATEOFcolumn_name_listOFcolumn_name_list的子集的子集的子集的子集 new_valu
45、enew_value:为被更新列的新值,它可以是一个表达式、:为被更新列的新值,它可以是一个表达式、:为被更新列的新值,它可以是一个表达式、:为被更新列的新值,它可以是一个表达式、空值或子查询。空值或子查询。空值或子查询。空值或子查询。 WHERECURRENTOFWHERECURRENTOF:使:使:使:使SQLServerSQLServer只更新由指定只更新由指定只更新由指定只更新由指定游标的游标位置当前值确定的行。游标的游标位置当前值确定的行。游标的游标位置当前值确定的行。游标的游标位置当前值确定的行。cursor_namecursor_name:是已声明为是已声明为是已声明为是已声明为
46、FORUPDATEFORUPDATE方式并已打开的方式并已打开的方式并已打开的方式并已打开的游标名。游标名。游标名。游标名。栅蔚纪婴袱帝炽租邢想二塌钡屈盒骇腆红趴促身曝谭鱼怯兑仍怔卷藩喻毋第10章游标和触发器第10章游标和触发器17注意:注意:注意:注意: 使用使用使用使用UPDATE.CURRENTOFUPDATE.CURRENTOF语句语句语句语句一次只能更新当前一次只能更新当前一次只能更新当前一次只能更新当前游标位置确定的那一行游标位置确定的那一行游标位置确定的那一行游标位置确定的那一行,OPENOPEN语句将游标位置定位在结语句将游标位置定位在结语句将游标位置定位在结语句将游标位置定位
47、在结果集第一行前,可以使用果集第一行前,可以使用果集第一行前,可以使用果集第一行前,可以使用FETCHFETCH语句把游标位置定位在语句把游标位置定位在语句把游标位置定位在语句把游标位置定位在要被更新的数据行处。要被更新的数据行处。要被更新的数据行处。要被更新的数据行处。 用用用用UPDATE.WHERECURRENTOFUPDATE.WHERECURRENTOF语句更新表中的语句更新表中的语句更新表中的语句更新表中的行时,行时,行时,行时,不会移动游标位置,被更新的行可以再次被修改不会移动游标位置,被更新的行可以再次被修改不会移动游标位置,被更新的行可以再次被修改不会移动游标位置,被更新的行
48、可以再次被修改,直到下一个直到下一个直到下一个直到下一个FETCHFETCH语句的执行。语句的执行。语句的执行。语句的执行。 UPDATE.WHERECURRENTOFUPDATE.WHERECURRENTOF语句可以更新多表语句可以更新多表语句可以更新多表语句可以更新多表视图或被连接的多表,但只能更新其中视图或被连接的多表,但只能更新其中视图或被连接的多表,但只能更新其中视图或被连接的多表,但只能更新其中一个表一个表一个表一个表的行,即所的行,即所的行,即所的行,即所有被更新的列都来自同一个表。有被更新的列都来自同一个表。有被更新的列都来自同一个表。有被更新的列都来自同一个表。夕源鲁肺坎独俩
49、轨紧夸芥掳战龄耽蹄瘪修监浩洁瞪控暮颇牺钮兢辱函瓮矫第10章游标和触发器第10章游标和触发器18【例【例【例【例10-210-2】通过游标通过游标通过游标通过游标将职员表中将职员表中将职员表中将职员表中记录号为记录号为记录号为记录号为3 3的的的的的的的的职称由职称由职称由职称由“ “头衔头衔头衔头衔” ”改为改为改为改为“VicePresident,Sales”“VicePresident,Sales”。USEnorthwindUSEnorthwindGOGO- -声明游标声明游标声明游标声明游标, ,指定更新列指定更新列指定更新列指定更新列DECLAREemp_coursorSCROLLCU
50、RSORFORDECLAREemp_coursorSCROLLCURSORFORSELECTlastname,titleFROMemployeesFORUPDATEOFSELECTlastname,titleFROMemployeesFORUPDATEOFtitletitle- -打开游标打开游标打开游标打开游标OPENemp_coursorOPENemp_coursor- -取第取第取第取第3 3行数据行数据行数据行数据FETCHABSOLUTE3FROMemp_coursorFETCHABSOLUTE3FROMemp_coursor滤蛔回幂升具龋下媳甸瑰洱瞄仓扩审介著圾坐蝇菊蒜林昨局贾垫唤
51、逞坯褂第10章游标和触发器第10章游标和触发器19- -更新当前游标中的值更新当前游标中的值更新当前游标中的值更新当前游标中的值UPDATEemployeesUPDATEemployeesSETtitle=VicePresident,SalesSETtitle=VicePresident,SalesWHERECURRENTOFemp_coursorWHERECURRENTOFemp_coursor- -取第三行数据取第三行数据取第三行数据取第三行数据FETCHABSOLUTE3FROMemp_coursorFETCHABSOLUTE3FROMemp_coursor- -关闭并释放游标关闭并释放
52、游标关闭并释放游标关闭并释放游标CLOSEemp_coursorCLOSEemp_coursorDEALLOCATEemp_coursorDEALLOCATEemp_coursor较斤柴柴钒蝇聚检轿切通崎啥升彝笼宇覆举默已刊恕窟盎乏藉懈照佛抚颁第10章游标和触发器第10章游标和触发器2010.3.210.3.2删除数据删除数据删除数据删除数据通过在通过在通过在通过在DELETEDELETE语句中使用游标来删除表或视图中的行。被删除语句中使用游标来删除表或视图中的行。被删除语句中使用游标来删除表或视图中的行。被删除语句中使用游标来删除表或视图中的行。被删除的行依赖于游标位置的当前值。的行依赖于游
53、标位置的当前值。的行依赖于游标位置的当前值。的行依赖于游标位置的当前值。删除数据语法形式如下:删除数据语法形式如下:删除数据语法形式如下:删除数据语法形式如下:DELETEFROMDELETEFROMdatabase.owner.table_name|view_namedatabase.owner.table_name|view_nameWHERECURRENTOFWHERECURRENTOFcursor_namecursor_name其中:其中:其中:其中: table_name|view_nametable_name|view_name:为要从其中删除行的表名或视图:为要从其中删除行的表名
54、或视图:为要从其中删除行的表名或视图:为要从其中删除行的表名或视图名,可以加或不加限定。但它必须是定义该游标的名,可以加或不加限定。但它必须是定义该游标的名,可以加或不加限定。但它必须是定义该游标的名,可以加或不加限定。但它必须是定义该游标的SELECTSELECT语句中的表名或视图名。语句中的表名或视图名。语句中的表名或视图名。语句中的表名或视图名。 cursor_namecursor_name:为已声明并已打开的游标名。:为已声明并已打开的游标名。:为已声明并已打开的游标名。:为已声明并已打开的游标名。 WHERECURRENTOFWHERECURRENTOF:它使:它使:它使:它使SQL
55、ServerSQLServer只删除由指定游只删除由指定游只删除由指定游只删除由指定游标的游标位置当前值确定的行。标的游标位置当前值确定的行。标的游标位置当前值确定的行。标的游标位置当前值确定的行。条赣楷伶资纱糖耻妖子慌拾包喉肋噪霓岭巷呼咽瞅迟埔抡椎成览功湃臆骄第10章游标和触发器第10章游标和触发器21注意:注意:注意:注意: 使用游标的使用游标的使用游标的使用游标的DELETEDELETE语句,一次只能删除当前游标位置语句,一次只能删除当前游标位置语句,一次只能删除当前游标位置语句,一次只能删除当前游标位置确定的那一行。确定的那一行。确定的那一行。确定的那一行。OPENOPEN语句将游标位
56、置定位在结果集第一语句将游标位置定位在结果集第一语句将游标位置定位在结果集第一语句将游标位置定位在结果集第一行之前,可以用行之前,可以用行之前,可以用行之前,可以用FETCHFETCH语句把游标位置定位在要被删除的语句把游标位置定位在要被删除的语句把游标位置定位在要被删除的语句把游标位置定位在要被删除的行处。行处。行处。行处。 在在在在DELETEDELETE语句中使用的游标必须声明为语句中使用的游标必须声明为语句中使用的游标必须声明为语句中使用的游标必须声明为FORFORUPDATEUPDATE方式方式方式方式。而且声明游标的。而且声明游标的。而且声明游标的。而且声明游标的SELECTSEL
57、ECT语句中不能含有语句中不能含有语句中不能含有语句中不能含有连接操作或涉及多表视图,否则即使声明中指明了连接操作或涉及多表视图,否则即使声明中指明了连接操作或涉及多表视图,否则即使声明中指明了连接操作或涉及多表视图,否则即使声明中指明了FORFORUPDATEUPDATE方式,也不能删除其中的行。方式,也不能删除其中的行。方式,也不能删除其中的行。方式,也不能删除其中的行。 对使用游标删除行的表,要求有一个唯一索引。对使用游标删除行的表,要求有一个唯一索引。对使用游标删除行的表,要求有一个唯一索引。对使用游标删除行的表,要求有一个唯一索引。 使用游标的使用游标的使用游标的使用游标的DELET
58、EDELETE语句,删除一行后将游标位置向前语句,删除一行后将游标位置向前语句,删除一行后将游标位置向前语句,删除一行后将游标位置向前移动一行。移动一行。移动一行。移动一行。本章首页本章首页岂衰缀尧酞婉茧城梨金梳台供佩拣按磋级孕疟听狞讨彼脂艾晃黍第恤铜舔第10章游标和触发器第10章游标和触发器游标示例游标示例游标示例游标示例DeclareMyCusrorCursorScrollDeclareMyCusrorCursorScrollForSelect*FromMaster_GoodsOrderByGoodsIDForSelect*FromMaster_GoodsOrderByGoodsIDOpe
59、nMyCursorOpenMyCursorFetchnextFromMyCursorFetchnextFromMyCursorDeleteFromMaster_GoodsWhereCurrentOfMyCursorDeleteFromMaster_GoodsWhereCurrentOfMyCursorCloseMyCursorCloseMyCursorDeallocateMyCursorDeallocateMyCursor22骋卧抿闽矾滇跺窟博尾氧咱词辰宿林贿颖形转醛窄近糖巩艳狙安拳沥铣赣第10章游标和触发器第10章游标和触发器2310.4.1 10.4.1 触发器的概念触发器的概念触发器的概
60、念触发器的概念1 1、概念、概念、概念、概念触发器是一类特殊的存储过程,被定义为在对特定表或视图发触发器是一类特殊的存储过程,被定义为在对特定表或视图发触发器是一类特殊的存储过程,被定义为在对特定表或视图发触发器是一类特殊的存储过程,被定义为在对特定表或视图发出出出出 UPDATEUPDATE、INSERTINSERT或或或或DELETEDELETE 语句时自动执行语句时自动执行语句时自动执行语句时自动执行. .2 2、触发器的特点:、触发器的特点:、触发器的特点:、触发器的特点:n n它与表紧密相连,可以看作表定义的一部分;它与表紧密相连,可以看作表定义的一部分;它与表紧密相连,可以看作表定
61、义的一部分;它与表紧密相连,可以看作表定义的一部分;n n它不能通过名称被直接调用,更不允许带参数,而是当用户它不能通过名称被直接调用,更不允许带参数,而是当用户它不能通过名称被直接调用,更不允许带参数,而是当用户它不能通过名称被直接调用,更不允许带参数,而是当用户对表中的数据进行编辑时,自动执行;对表中的数据进行编辑时,自动执行;对表中的数据进行编辑时,自动执行;对表中的数据进行编辑时,自动执行;n n它可以用于它可以用于它可以用于它可以用于SQL ServerSQL Server约束、默认值和规则的完整性检查,约束、默认值和规则的完整性检查,约束、默认值和规则的完整性检查,约束、默认值和规
62、则的完整性检查,实施更为复杂的数据完整性约束。实施更为复杂的数据完整性约束。实施更为复杂的数据完整性约束。实施更为复杂的数据完整性约束。 套老汛抑崔歧株划瓦苍须疯射凄铲既遗黎频洽还配展割壹极掂跳寇椰杀谋第10章游标和触发器第10章游标和触发器2410.4.2 10.4.2 触发器的作用触发器的作用触发器的作用触发器的作用11在数据库中的相关表上在数据库中的相关表上在数据库中的相关表上在数据库中的相关表上实现级联更改实现级联更改实现级联更改实现级联更改 在数据库的相关表上使用触发器可实现级联更新或删在数据库的相关表上使用触发器可实现级联更新或删在数据库的相关表上使用触发器可实现级联更新或删在数据
63、库的相关表上使用触发器可实现级联更新或删除除除除22强制比强制比强制比强制比CHECKCHECK约束约束约束约束更复杂的数据完整性更复杂的数据完整性更复杂的数据完整性更复杂的数据完整性 和和和和CHECKCHECK约束不同,触发器可以引用其他表中的列约束不同,触发器可以引用其他表中的列约束不同,触发器可以引用其他表中的列约束不同,触发器可以引用其他表中的列 通过下列方法使用触发器来强制复杂的引用完整性:通过下列方法使用触发器来强制复杂的引用完整性:通过下列方法使用触发器来强制复杂的引用完整性:通过下列方法使用触发器来强制复杂的引用完整性:根据情况确定是否级联更新与删除、创建多行触发器、根据情况
64、确定是否级联更新与删除、创建多行触发器、根据情况确定是否级联更新与删除、创建多行触发器、根据情况确定是否级联更新与删除、创建多行触发器、在数据库间强制引用完整性在数据库间强制引用完整性在数据库间强制引用完整性在数据库间强制引用完整性蒋又拘茄偿赫和心面虚纱怀饰盔舅揩蚊快枯铝屉报帘琐型甚剧努裔贼递盾第10章游标和触发器第10章游标和触发器2510.4.2 10.4.2 触发器的作用触发器的作用触发器的作用触发器的作用3 3 维护非标准数据维护非标准数据维护非标准数据维护非标准数据 触发器可以用来在非标准数据库环境中维护底层的数触发器可以用来在非标准数据库环境中维护底层的数触发器可以用来在非标准数据
65、库环境中维护底层的数触发器可以用来在非标准数据库环境中维护底层的数据完整性。非标准数据常常是人为得出的或冗余的数据完整性。非标准数据常常是人为得出的或冗余的数据完整性。非标准数据常常是人为得出的或冗余的数据完整性。非标准数据常常是人为得出的或冗余的数据值据值据值据值4 4 比较数据修改前后的状态比较数据修改前后的状态比较数据修改前后的状态比较数据修改前后的状态 大部分触发器提供了引用被修改数据的能力,这样就大部分触发器提供了引用被修改数据的能力,这样就大部分触发器提供了引用被修改数据的能力,这样就大部分触发器提供了引用被修改数据的能力,这样就允许用户在触发器中引用正被修改语句所影响的行允许用户
66、在触发器中引用正被修改语句所影响的行允许用户在触发器中引用正被修改语句所影响的行允许用户在触发器中引用正被修改语句所影响的行虱恤尝嘴惶诧反蜗型大盐巍押这妥抚善兰倦央藐弱蒜辙郧侈呕胁快察辰粹第10章游标和触发器第10章游标和触发器2610.4.3 触发器的类型触发器的类型1 1、DMLDML触发器触发器触发器触发器DMLDML触发器是当数据库服务器中发生数据操纵语言触发器是当数据库服务器中发生数据操纵语言触发器是当数据库服务器中发生数据操纵语言触发器是当数据库服务器中发生数据操纵语言(DMLDML)事件,如)事件,如)事件,如)事件,如INSERTINSERT、UPDATEUPDATE、DELE
67、TEDELETE时所触发的时所触发的时所触发的时所触发的操作。操作。操作。操作。DMLDML触发器用于在数据被修改时强制执行业务规则触发器用于在数据被修改时强制执行业务规则触发器用于在数据被修改时强制执行业务规则触发器用于在数据被修改时强制执行业务规则。注意:注意:注意:注意:SELECTSELECT语句不能触发触发器操作语句不能触发触发器操作语句不能触发触发器操作语句不能触发触发器操作,因为,因为,因为,因为SELECTSELECT语句并没有修改表中的数据。语句并没有修改表中的数据。语句并没有修改表中的数据。语句并没有修改表中的数据。哈戈衔怠删骏茵棘蓟侠弥怕嵌灾停滩树殊帽沂骇暗隅加螟渺拈膏吗
68、分普悔第10章游标和触发器第10章游标和触发器2710.3.3 触发器的类型触发器的类型2 2、DDLDDL触发器触发器触发器触发器SQLSERVER2005SQLSERVER2005中新增了中新增了中新增了中新增了DDLDDL触发器触发器触发器触发器,该触发器,该触发器,该触发器,该触发器是一种特殊的触发器,当服务器或数据库中是一种特殊的触发器,当服务器或数据库中是一种特殊的触发器,当服务器或数据库中是一种特殊的触发器,当服务器或数据库中发生数据定义发生数据定义发生数据定义发生数据定义语句(语句(语句(语句(DDLDDL)事件)事件)事件)事件,如,如,如,如CREATECREATE、ALT
69、ERALTER、DROPDROP数据库数据库数据库数据库对象等操作时将调用这些触发器。它们可以对象等操作时将调用这些触发器。它们可以对象等操作时将调用这些触发器。它们可以对象等操作时将调用这些触发器。它们可以用于在数据库用于在数据库用于在数据库用于在数据库中执行管理任务中执行管理任务中执行管理任务中执行管理任务,如审核以及规范数据库操作。,如审核以及规范数据库操作。,如审核以及规范数据库操作。,如审核以及规范数据库操作。却窥粉莎晾踩啪灭阅畴坯术听罐缀毅锨冗久津伎静剃诞纠食孟册磐勾魁懂第10章游标和触发器第10章游标和触发器2810.3.4 触触发器器应用的两个用的两个逻辑表表SQLSERVER
70、SQLSERVER为每个触发器语句都创建两个特殊的逻辑为每个触发器语句都创建两个特殊的逻辑为每个触发器语句都创建两个特殊的逻辑为每个触发器语句都创建两个特殊的逻辑表:表:表:表:INSERTEDINSERTED表和表和表和表和DELETEDDELETED表,由系统创建和维护。表,由系统创建和维护。表,由系统创建和维护。表,由系统创建和维护。1 1、INSERTEDINSERTED表表表表用于存放由用于存放由用于存放由用于存放由INSERTINSERT或或或或UPDATEUPDATE语句而要向表中插入的所语句而要向表中插入的所语句而要向表中插入的所语句而要向表中插入的所有数据行。在执行有数据行。
71、在执行有数据行。在执行有数据行。在执行INSERTINSERT或或或或UPDATEUPDATE事务中,事务中,事务中,事务中,新的行新的行新的行新的行同时同时同时同时会会会会添加到触发触发器的表和添加到触发触发器的表和添加到触发触发器的表和添加到触发触发器的表和INSERTEDINSERTED表表表表中,中,中,中,INSERTEDINSERTED表表表表中的中的中的中的内容内容内容内容是是是是新插入新插入新插入新插入到触发表的到触发表的到触发表的到触发表的数据行的副本数据行的副本数据行的副本数据行的副本。铝森隧掠钡玫磐辐药晦蛇菇绝歹淡每抖搪二猎耀逗帮掸痪郊诵撵蠢祥酥吏第10章游标和触发器第1
72、0章游标和触发器2910.3.4 触触发器器应用的两个用的两个逻辑表表2 2、DELETEDDELETED表表表表用于存放由用于存放由用于存放由用于存放由DELETEDELETE或或或或UPDATEUPDATE语句而要从表中删除语句而要从表中删除语句而要从表中删除语句而要从表中删除的所有数据行。在执行的所有数据行。在执行的所有数据行。在执行的所有数据行。在执行DELETEDELETE或或或或UPDATEUPDATE事务中,被事务中,被事务中,被事务中,被删除的行从触发触发器的表中被移动到删除的行从触发触发器的表中被移动到删除的行从触发触发器的表中被移动到删除的行从触发触发器的表中被移动到DEL
73、ETEDDELETED表中,表中,表中,表中,DELETEDDELETED表中的内容是被删除的触发表的数据行的副表中的内容是被删除的触发表的数据行的副表中的内容是被删除的触发表的数据行的副表中的内容是被删除的触发表的数据行的副本本本本 注意:一个注意:一个注意:一个注意:一个UPDATEUPDATEUPDATEUPDATE事务可以看作是先执行一个事务可以看作是先执行一个事务可以看作是先执行一个事务可以看作是先执行一个DELETEDELETEDELETEDELETE操作,操作,操作,操作,然后再执行一个然后再执行一个然后再执行一个然后再执行一个INSERTINSERTINSERTINSERT操作
74、,执行操作,执行操作,执行操作,执行DELETEDELETEDELETEDELETE操作所删除的行操作所删除的行操作所删除的行操作所删除的行首先被移动到首先被移动到首先被移动到首先被移动到DELETEDDELETEDDELETEDDELETED表中,执行表中,执行表中,执行表中,执行INSERTINSERTINSERTINSERT操作插入的新行操作插入的新行操作插入的新行操作插入的新行会同时插入会同时插入会同时插入会同时插入INSERTEDINSERTEDINSERTEDINSERTED表及触发表中表及触发表中表及触发表中表及触发表中 桶簿物向涉涎名谎膝阮铣蛇迢鬼膏壹毯棚项忌磐生烃集惫宗肇匆牌
75、丘塞庶第10章游标和触发器第10章游标和触发器3010.4 创建创建/管理管理DML触发器触发器10.4.1 10.4.1 创建创建创建创建DMLDML触发器的语句触发器的语句触发器的语句触发器的语句 10.4.2 DML10.4.2 DML触触触触发发器的器的器的器的类类型型型型10.4.3 10.4.3 修改触修改触修改触修改触发发器器器器 10.4.4 10.4.4 查查看触看触看触看触发发器器器器10.4.5 10.4.5 删删除触除触除触除触发发器器器器10.4.6 10.4.6 禁止和启用触禁止和启用触禁止和启用触禁止和启用触发发器器器器有械撂望筒痪漆皱权销说将发寄固阎朽渤法椭模澡
76、缄逐榴寡封晦垛鼻堵毯第10章游标和触发器第10章游标和触发器3110.4.1 10.4.1 创创建建建建DMLDML触发器的语句触发器的语句触发器的语句触发器的语句SQLSERVER2005SQLSERVER2005中,创建一个触发器的基本语法如中,创建一个触发器的基本语法如中,创建一个触发器的基本语法如中,创建一个触发器的基本语法如下:下:下:下:CREATETRIGGERCREATETRIGGERtrigger_nametrigger_nameONONtable_name|view_nametable_name|view_nameFOR|AFTER|INSTEADOFFOR|AFTER|I
77、NSTEADOFINSERT,INSERT,DELETE,UPDATEDELETE,UPDATEASASIFUPDATEIFUPDATE(column_namecolumn_name)AND|ORUPDATEAND|ORUPDATE(column_namecolumn_name)Sql_statementSql_statement 句皿辱埔敬拎甲信碧张妇楷咳蔽本腊架镭哗贯间尔嘿截愚酷览菠济贸艇盲第10章游标和触发器第10章游标和触发器3210.4.1 10.4.1 创创建建建建DMLDML触发器的语句触发器的语句触发器的语句触发器的语句参数说明:参数说明:参数说明:参数说明:n ntrigge
78、r_nametrigger_name:是要创建的触发器的名称。:是要创建的触发器的名称。:是要创建的触发器的名称。:是要创建的触发器的名称。n ntable_name|view_nametable_name|view_name:是在其上执行触发器的表名或视:是在其上执行触发器的表名或视:是在其上执行触发器的表名或视:是在其上执行触发器的表名或视图名。图名。图名。图名。n nFOR|AFTER|INSTEADOFFOR|AFTER|INSTEADOF:指定触发器的时机,其中:指定触发器的时机,其中:指定触发器的时机,其中:指定触发器的时机,其中FORFOR与与与与AFTERAFTER相同。相同。
79、相同。相同。n nINSERT,DELETE,UPDATEINSERT,DELETE,UPDATE:是指定在表或视图上执行哪些:是指定在表或视图上执行哪些:是指定在表或视图上执行哪些:是指定在表或视图上执行哪些数据修改语句时将触发触发器的关键字,必须至少指定一个选项。数据修改语句时将触发触发器的关键字,必须至少指定一个选项。数据修改语句时将触发触发器的关键字,必须至少指定一个选项。数据修改语句时将触发触发器的关键字,必须至少指定一个选项。在触发器的定义中允许使用以任意顺序组合的这些关键字,中间在触发器的定义中允许使用以任意顺序组合的这些关键字,中间在触发器的定义中允许使用以任意顺序组合的这些关
80、键字,中间在触发器的定义中允许使用以任意顺序组合的这些关键字,中间用逗号分隔。用逗号分隔。用逗号分隔。用逗号分隔。n nIFUPDATEIFUPDATE(column_namecolumn_name):指如果更新表的某列将进行的:指如果更新表的某列将进行的:指如果更新表的某列将进行的:指如果更新表的某列将进行的操作。操作。操作。操作。n nSql_statementSql_statement:指定触发器执行的:指定触发器执行的:指定触发器执行的:指定触发器执行的T-SQLT-SQL语句。语句。语句。语句。虾踞兜躇垢承瞪译成悄斟忘敲瑚趣址弓二罐肋粕掳涸芋拟醇陋厂呐挫毡酱第10章游标和触发器第10
81、章游标和触发器3310.4.1 10.4.1 创创建建建建DMLDML触发器的语句触发器的语句触发器的语句触发器的语句创建创建创建创建DMLDML触发器前需注意以下事项:触发器前需注意以下事项:触发器前需注意以下事项:触发器前需注意以下事项:n nCREATETRIGGERCREATETRIGGER语句必须是批处理中的第一个语句,语句必须是批处理中的第一个语句,语句必须是批处理中的第一个语句,语句必须是批处理中的第一个语句,该语句后面的所有其它语句被解释为触发器语句定义的一该语句后面的所有其它语句被解释为触发器语句定义的一该语句后面的所有其它语句被解释为触发器语句定义的一该语句后面的所有其它语
82、句被解释为触发器语句定义的一部分。部分。部分。部分。n n创建创建创建创建DMLDML触发器的权限默认分配给表的所有者,且不能触发器的权限默认分配给表的所有者,且不能触发器的权限默认分配给表的所有者,且不能触发器的权限默认分配给表的所有者,且不能将该权限转给其它用户。将该权限转给其它用户。将该权限转给其它用户。将该权限转给其它用户。n nDMLDML触发器是数据库对象,其名称必须遵循标识符的命触发器是数据库对象,其名称必须遵循标识符的命触发器是数据库对象,其名称必须遵循标识符的命触发器是数据库对象,其名称必须遵循标识符的命名规则。名规则。名规则。名规则。n n虽然虽然虽然虽然DMLDML触发器
83、可以引用当前数据库以外的对象,但只触发器可以引用当前数据库以外的对象,但只触发器可以引用当前数据库以外的对象,但只触发器可以引用当前数据库以外的对象,但只能在当前数据库中创建能在当前数据库中创建能在当前数据库中创建能在当前数据库中创建DMLDML触发器。触发器。触发器。触发器。n nTRUNCATETABLETRUNCATETABLE语句不会触发语句不会触发语句不会触发语句不会触发DELETEDELETE触发器。触发器。触发器。触发器。火孩厚派傍行蛔停屡厉赃维豹民炮膛掣仪惑冗滇灰回嚣狮秸稳卉伯装库忧第10章游标和触发器第10章游标和触发器3410.4.1 10.4.1 创创建建建建DMLDML
84、触发器的语句触发器的语句触发器的语句触发器的语句创建创建创建创建DMLDML触发器前需注意以下事项:触发器前需注意以下事项:触发器前需注意以下事项:触发器前需注意以下事项:n n在在在在CREATETRIGGERCREATETRIGGER语句定义中不能包含以下语句:语句定义中不能包含以下语句:语句定义中不能包含以下语句:语句定义中不能包含以下语句:CREATE|ALTER|DROPDATABASECREATE|ALTER|DROPDATABASEDISKINITDISKINITDISKRESIZEDISKRESIZELOADDATABASELOADDATABASELOADLOGLOADLOGR
85、ESTOREDATABASERESTOREDATABASERESTORELOGRESTORELOG甘溃叹呜捂味糠咽加诽函揉址浆铀皇畜拣疯沽界悉丧诡荚茵娜掸焰蔡棕丝第10章游标和触发器第10章游标和触发器3510.4.2 DML10.4.2 DML触发器的类型触发器的类型触发器的类型触发器的类型两种类型:两种类型:两种类型:两种类型:AFTERAFTER触发器和触发器和触发器和触发器和 INSTEAD OF INSTEAD OF触发器。触发器。触发器。触发器。1 1)AFTERAFTER触发器触发器触发器触发器 AFTER AFTER触发器又称为后触发器,该类触发器是触发器又称为后触发器,该类触
86、发器是触发器又称为后触发器,该类触发器是触发器又称为后触发器,该类触发器是在引在引在引在引起触发器执行的修改语句成功完成之后执行。起触发器执行的修改语句成功完成之后执行。起触发器执行的修改语句成功完成之后执行。起触发器执行的修改语句成功完成之后执行。2 2) INSTEAD OFINSTEAD OF触发器触发器触发器触发器 INSTEAD OF INSTEAD OF触发器又称为替代触发器,触发器又称为替代触发器,触发器又称为替代触发器,触发器又称为替代触发器,当引起触当引起触当引起触当引起触发器执行的修改语句停止执行时,发器执行的修改语句停止执行时,发器执行的修改语句停止执行时,发器执行的修改
87、语句停止执行时,该类触发器代替触发该类触发器代替触发该类触发器代替触发该类触发器代替触发操作执行。操作执行。操作执行。操作执行。 驴佬政河火笛咀蚌孜辛巧张头笆碎锯蔡瓶涉泳豢胚悔烁摊绿新停浚吾诸岩第10章游标和触发器第10章游标和触发器361 1、创建、创建、创建、创建INSERTINSERT触发器触发器触发器触发器1 1)INSERTINSERT触发器的工作过程触发器的工作过程触发器的工作过程触发器的工作过程 在定义了在定义了在定义了在定义了INSERTINSERT触发器的表上执行触发器的表上执行触发器的表上执行触发器的表上执行INSERTINSERT语句语句语句语句 INSERTINSERT
88、语句插入的行被记录下来语句插入的行被记录下来语句插入的行被记录下来语句插入的行被记录下来 触发器动作被执行触发器动作被执行触发器动作被执行触发器动作被执行2 2)insertedinserted表表表表 触发触发触发触发INSERTINSERT触发器时,触发器时,触发器时,触发器时,新行被同时增加到触发器新行被同时增加到触发器新行被同时增加到触发器新行被同时增加到触发器表和表和表和表和insertedinserted表中表中表中表中 insertedinserted表表表表是保存了插入行的副本的是保存了插入行的副本的是保存了插入行的副本的是保存了插入行的副本的逻辑表逻辑表逻辑表逻辑表,它并不,
89、它并不,它并不,它并不实际存在于数据库中实际存在于数据库中实际存在于数据库中实际存在于数据库中 insertedinserted表允许用户引用表允许用户引用表允许用户引用表允许用户引用INSERTINSERT语句所插入的语句所插入的语句所插入的语句所插入的数数数数据据据据,这样触发器可以根据具体数据决定是否执行以及,这样触发器可以根据具体数据决定是否执行以及,这样触发器可以根据具体数据决定是否执行以及,这样触发器可以根据具体数据决定是否执行以及如何执行特定语句如何执行特定语句如何执行特定语句如何执行特定语句创建创建DML触发器案例触发器案例率脉扳桓刃惫雍船砰淘减逾淘召执酵茫凤蛾耿业呀嘉但暂荡唇
90、怪盆诽吾磺第10章游标和触发器第10章游标和触发器37创建创建DML触发器案例触发器案例 例例例例1 1:在:在:在:在northwindnorthwind数据库中的数据库中的数据库中的数据库中的orderdetailsorderdetails表上创建一表上创建一表上创建一表上创建一个触发器个触发器个触发器个触发器, ,使得无论何时向使得无论何时向使得无论何时向使得无论何时向orderdetailsorderdetails表中插入一条表中插入一条表中插入一条表中插入一条记录,都将更新记录,都将更新记录,都将更新记录,都将更新productproduct表中的表中的表中的表中的unitsInst
91、ockunitsInstock列,即用列,即用列,即用列,即用原来的数量减去订购的数量。原来的数量减去订购的数量。原来的数量减去订购的数量。原来的数量减去订购的数量。蹲向澈族拟拴藏糠李死箔颈羡慌请翰帐靛嘶陛誓似犬您钧铲柞饯岗蔡渍峰第10章游标和触发器第10章游标和触发器38创建创建DML触发器案例触发器案例在定义了在定义了INSERT触发器的表上执行触发器的表上执行INSERT语句语句INSERT Order Details VALUES(10523, 2, 19.00, 5, 0.2)Order DetailsOrder DetailsOrderID105221052310524Produc
92、tID2417UnitPrice31.009.6530.00Quantity7924Discount0.20.150.0 5 19.002 0.210523INSERT语句插入的行被记录下来语句插入的行被记录下来insertedinserted10523219.0050.2触发器动作被执行触发器动作被执行Order DetailsOrder DetailsOrderID105221052310524ProductID2417UnitPrice31.009.6530.00Quantity7924Discount0.20.150.0 5 19.002 0.210523触发器代码:USE North
93、windCREATE TRIGGER OrdDet_InsertON Order DetailsFOR INSERTASUPDATE P SET UnitsInStock = (P.UnitsInStock I.Quantity)FROM Products AS P INNER JOIN Inserted AS ION P.ProductID = I.ProductIDUPDATE P SET UnitsInStock = (P.UnitsInStock I.Quantity)FROM Products AS P INNER JOIN Inserted AS ION P.ProductID =
94、 I.ProductIDProductsProductsProductID UnitsInStock 123415106520215在定义了在定义了在定义了在定义了 INSERT INSERT INSERT INSERT 触发器的表上触发器的表上触发器的表上触发器的表上执行执行执行执行 INSERT INSERT INSERT INSERT 语句语句语句语句INSERT INSERT INSERT INSERT 语句插入的行被记录下来语句插入的行被记录下来语句插入的行被记录下来语句插入的行被记录下来触发器动作被执行触发器动作被执行触发器动作被执行触发器动作被执行1 12 23 3INSERT语
95、句插入的行被记录下来语句插入的行被记录下来insertedinserted10523219.0050.2廖囤逻努膝殊咙妻戳佰途俘唱农钢狮符汁遵勉励碟晦嵌睬拒浦撰及穆邓缘第10章游标和触发器第10章游标和触发器39创建创建DML触发器案例触发器案例2 2、DELETEDELETE触发器触发器触发器触发器1 1)DELETEDELETE触发器的工作过程触发器的工作过程触发器的工作过程触发器的工作过程 在定义了在定义了在定义了在定义了DELETEDELETE触发器的表上触发器的表上触发器的表上触发器的表上执行执行执行执行DELETEDELETE 语语语语句句句句 DELETEDELETE语句删除的行
96、被记录下来语句删除的行被记录下来语句删除的行被记录下来语句删除的行被记录下来 触发器动作被执行触发器动作被执行触发器动作被执行触发器动作被执行控奈叭蚀丫缝抖淌募膘涪嫩诛杨慨汽傍漆但杠彤细静支篓佯阔懊臭谋丘雁第10章游标和触发器第10章游标和触发器40创建创建DML触发器案例触发器案例2 2)deleteddeleted表:表:表:表: 触发触发触发触发DELETEDELETE触发器时,被删除的行放入触发器时,被删除的行放入触发器时,被删除的行放入触发器时,被删除的行放入deleteddeleted表中表中表中表中 deleteddeleted表是保存了被删除行的副本的逻辑表表是保存了被删除行的
97、副本的逻辑表表是保存了被删除行的副本的逻辑表表是保存了被删除行的副本的逻辑表 deleteddeleted表允许用户引用表允许用户引用表允许用户引用表允许用户引用DELETEDELETE语句所删除的数据语句所删除的数据语句所删除的数据语句所删除的数据使用使用使用使用DELETEDELETE触发器触发器触发器触发器 当行添加到当行添加到当行添加到当行添加到deleteddeleted表后,将不再存在于数据库表中表后,将不再存在于数据库表中表后,将不再存在于数据库表中表后,将不再存在于数据库表中 从内存中分配空间创建从内存中分配空间创建从内存中分配空间创建从内存中分配空间创建deleteddele
98、ted表。表。表。表。deleteddeleted表表表表总在总在总在总在缓存缓存缓存缓存中中中中 DELETEDELETE触发器触发器触发器触发器不会被不会被不会被不会被TRUNCATETABLETRUNCATETABLE语句触语句触语句触语句触发发发发味戏剩磺财钵购龟娱窘煎捧粘枪钎蝉绩卯夸咳仙危缠淀慑豁靡溃唆继粒校第10章游标和触发器第10章游标和触发器41创建创建DML触发器案例触发器案例 例例例例2 2:在在在在northwindnorthwind数据库中的数据库中的数据库中的数据库中的categoriescategories表上创建一个表上创建一个表上创建一个表上创建一个delete
99、delete触发器,以保证当将某一个类别删除的同时将触发器,以保证当将某一个类别删除的同时将触发器,以保证当将某一个类别删除的同时将触发器,以保证当将某一个类别删除的同时将productsproducts表中对应表中对应表中对应表中对应categoryIdcategoryId的的的的discontinueddiscontinued列的值设置列的值设置列的值设置列的值设置为为为为1 1蒋萎为堪均尿盅选碴闰畏狸颂滦励卒如琐洱庇浆劣耙舶苯枯砾韩忘陆审紊第10章游标和触发器第10章游标和触发器42创建创建DML触发器案例触发器案例在定义了在定义了DELETE触发器的表上执行触发器的表上执行DELETE
100、语句语句DeletedDeleted4Dairy Products Cheeses 0x15DELETE语句删除的行被记录下来语句删除的行被记录下来CategoriesCategoriesCategoryID123CategoryNameBeveragesCondimentsConfectionsDescriptionSoft drinks, coffeesSweet and savory Desserts, candies, Picture0x150x150x15 0x15CheesesDairy Products4DELETE CategoriesWHERE CategoryID = 4U
101、SE NorthwindCREATE TRIGGER Category_DeleteON CategoriesFOR DELETEASUPDATE P SET Discontinued = 1FROM Products AS P INNER JOIN deleted AS dON P.CategoryID = d.CategoryIDProductsProductsProductID Discontinuedcategoryid12340000触发器动作被执行触发器动作被执行2 1 4UPDATE P SET Discontinued = 1FROM Products AS P INNER J
102、OIN deleted AS dON P.CategoryID = d.CategoryIDDeletedDeleted4Dairy Products Cheeses 0x15DELETE语句删除的行被记录下来语句删除的行被记录下来在定义了在定义了DELETE触发器的表上触发器的表上执行执行DELETE语句语句DELETE语句删除的行被记录下来语句删除的行被记录下来触发器动作被执行触发器动作被执行1 12 23 3甄旱养穴通能萧委澜陋帕距弥反佩蕴劲呛获极每永累拣附岳擂淤恐凸污脾第10章游标和触发器第10章游标和触发器43创建创建DML触发器案例触发器案例例例例例3 3:用触发器实现在用触发器实
103、现在用触发器实现在用触发器实现在PUBSPUBS数据库中的数据库中的数据库中的数据库中的titleauthortitleauthor表中表中表中表中一次只能从该表中删除一条记录。一次只能从该表中删除一条记录。一次只能从该表中删除一条记录。一次只能从该表中删除一条记录。实现的实现的实现的实现的T-SQLT-SQL语句语句语句语句: :CreateTRIGGERtr_delete1CreateTRIGGERtr_delete1ONtitleauthorONtitleauthorAFTERDELETEAFTERDELETEASASDECLAREnumintDECLAREnumintSELECTnum
104、=count(*)FROMDELETEDSELECTnum=count(*)FROMDELETED鼎洪幌釉琢鹊垄厚豪状兄蹭逮鱼处抉误睹驹配谅茎贬的简扒衫焚霸式缺厉第10章游标和触发器第10章游标和触发器44创建创建DML触发器案例触发器案例IFnum=2IFnum=2PRINT(PRINT(不能删除两条以上记录不能删除两条以上记录不能删除两条以上记录不能删除两条以上记录) )ROLLBACKTRANSACTIONROLLBACKTRANSACTIONGOGO- -测试语句测试语句测试语句测试语句DELETEtitleauthorDELETEtitleauthorWHEREau_ord=1WHE
105、REau_ord=1GOGOSELECT*FROMtitleauthorSELECT*FROMtitleauthorWHEREau_ord=1WHEREau_ord=1GOGO伴林音你匣咸浮松研扛冰股苏卷臃锤丈惫怪纳揪壤佩傀业芦习缨泞咏裴姓第10章游标和触发器第10章游标和触发器45创建创建DML触发器案例触发器案例3 3、UPDATEUPDATE触发器触发器触发器触发器1 1)UPDATEUPDATE触发器的工作过程触发器的工作过程触发器的工作过程触发器的工作过程 UPDATEUPDATE语句可以考虑为语句可以考虑为语句可以考虑为语句可以考虑为两个步骤两个步骤两个步骤两个步骤:DELETED
106、ELETE步骤捕步骤捕步骤捕步骤捕获数据的前像,获数据的前像,获数据的前像,获数据的前像,INSERTINSERT步骤捕获数据的后像步骤捕获数据的后像步骤捕获数据的后像步骤捕获数据的后像 当在定义了触发器的表上执行当在定义了触发器的表上执行当在定义了触发器的表上执行当在定义了触发器的表上执行UPDATEUPDATE语句的时候,语句的时候,语句的时候,语句的时候,原行原行原行原行(前像)(前像)(前像)(前像)被移到被移到被移到被移到deleteddeleted表表表表中,而中,而中,而中,而更新的行(后更新的行(后更新的行(后更新的行(后像)像)像)像)则则则则插入插入插入插入inserted
107、inserted 表中表中表中表中 触发器可以检索触发器可以检索触发器可以检索触发器可以检索deleteddeleted和和和和insertedinserted表以及被更新的表以及被更新的表以及被更新的表以及被更新的表,来确定是否更新了多行以及如何执行触发器动作表,来确定是否更新了多行以及如何执行触发器动作表,来确定是否更新了多行以及如何执行触发器动作表,来确定是否更新了多行以及如何执行触发器动作酚抨秩泛柞渔剪欲睹者晓妈泣痰舜脏忙二焚笆氨达划娃傣蛋彤尾宠埂它情第10章游标和触发器第10章游标和触发器46创建创建DML触发器案例触发器案例3 3、UPDATEUPDATE触发器触发器触发器触发器2
108、 2)监视对特定列的更新)监视对特定列的更新)监视对特定列的更新)监视对特定列的更新语法:语法:语法:语法:IFUPDATE(IFUPDATE() 允许触发器监测特定列,以对特定列的更新作出反应。允许触发器监测特定列,以对特定列的更新作出反应。允许触发器监测特定列,以对特定列的更新作出反应。允许触发器监测特定列,以对特定列的更新作出反应。例如发出不允许对列更新的错误信息,或者对新更新例如发出不允许对列更新的错误信息,或者对新更新例如发出不允许对列更新的错误信息,或者对新更新例如发出不允许对列更新的错误信息,或者对新更新的列值进行处理的列值进行处理的列值进行处理的列值进行处理泊构王握叫哨役们抚搓
109、虫章稽陨竣庭橇惜晕缘抵蟹冒妓豁宪译司霍骤卓房第10章游标和触发器第10章游标和触发器47创建创建DML触发器案例触发器案例例例例例4 4:禁止用户修改员工表中的禁止用户修改员工表中的禁止用户修改员工表中的禁止用户修改员工表中的employeeidemployeeid列的值。列的值。列的值。列的值。CREATETRIGGERemployee_updateCREATETRIGGERemployee_updateONemployeesforupdateONemployeesforupdateASASIFupdate(employeeid)IFupdate(employeeid)BEGINBEGINr
110、ollbacktranrollbacktranENDEND呜耙亚逆掉尚葬噎侍抵公缝释希陌闺肯悯峨润讥谬党控别逞汾齿来颐任庚第10章游标和触发器第10章游标和触发器48创建创建DML触发器案例触发器案例44、INSTEADOFINSTEADOF触发器触发器触发器触发器 可以在表和视图上定义可以在表和视图上定义可以在表和视图上定义可以在表和视图上定义INSTEADOFINSTEADOF触发器。触发器。触发器。触发器。INSTEADOFINSTEADOF触发器代替原触发动作执行触发器代替原触发动作执行触发器代替原触发动作执行触发器代替原触发动作执行,增加了视,增加了视,增加了视,增加了视图上所能进行
111、的更新的种类图上所能进行的更新的种类图上所能进行的更新的种类图上所能进行的更新的种类 每个表上每个表上每个表上每个表上对对对对每个触发动作每个触发动作每个触发动作每个触发动作(INSERTINSERT、UPDATEUPDATE或或或或 DELETEDELETE)只能定义一个只能定义一个只能定义一个只能定义一个INSTEADOFINSTEADOF触发器触发器触发器触发器 不能在具有不能在具有不能在具有不能在具有WITHCHECKOPTIONWITHCHECKOPTION选项的视图上创选项的视图上创选项的视图上创选项的视图上创建建建建INSTEADOFINSTEADOF触发器触发器触发器触发器蜀慈
112、跟烛押翰沙仕泊纵蹭顷里铭愿侯严郊滁卡曳索觉暗湃磺糜曾嚎澳拢兆第10章游标和触发器第10章游标和触发器49创建创建DML触发器案例触发器案例INSTEADOFINSTEADOF触发器可使一般不支持更新的视图可以被更新触发器可使一般不支持更新的视图可以被更新触发器可使一般不支持更新的视图可以被更新触发器可使一般不支持更新的视图可以被更新 截获对视图的操作,将其重导向底层表截获对视图的操作,将其重导向底层表截获对视图的操作,将其重导向底层表截获对视图的操作,将其重导向底层表 在在在在INSTEADOFDELETEINSTEADOFDELETE触发器中,通过触发器中,通过触发器中,通过触发器中,通过d
113、eleteddeleted表表表表访问欲删除的行;在访问欲删除的行;在访问欲删除的行;在访问欲删除的行;在INSTEADOFUPDATEINSTEADOFUPDATE或或或或 INSTEADOFINSERTINSTEADOFINSERT触发器中,通过触发器中,通过触发器中,通过触发器中,通过insertedinserted表访表访表访表访问新增加的行问新增加的行问新增加的行问新增加的行笆经颐京痒酗边列泄佬竹交瞧辫筑瑞哗增朋静渤浦桐迂匝拼仁莎川铺劫碉第10章游标和触发器第10章游标和触发器50创建创建DML触发器案例触发器案例例例例例5 5:在学生成绩管理系统数据库的学生信息表上创建:在学生成绩
114、管理系统数据库的学生信息表上创建:在学生成绩管理系统数据库的学生信息表上创建:在学生成绩管理系统数据库的学生信息表上创建INSTEADOFINSTEADOF触发器,当删除学生信息表中的学号时,则级联删触发器,当删除学生信息表中的学号时,则级联删触发器,当删除学生信息表中的学号时,则级联删触发器,当删除学生信息表中的学号时,则级联删除成绩信息表中与之相关联的成绩信息除成绩信息表中与之相关联的成绩信息除成绩信息表中与之相关联的成绩信息除成绩信息表中与之相关联的成绩信息。Createtriggertrig_DeleteonCreatetriggertrig_Deleteon学生信息学生信息学生信息学
115、生信息INSTEADOFDELETEINSTEADOFDELETEASASBEGINBEGINdeletedelete成绩信息成绩信息成绩信息成绩信息wherewhere学生编号学生编号学生编号学生编号in(selectin(select学生编号学生编号学生编号学生编号fromfromdeleted)deleted)deletedelete学生信息学生信息学生信息学生信息wherewhere学号学号学号学号in(selectin(select学号学号学号学号fromdeleted)fromdeleted)ENDEND见霹窝柱缘凌昏葡纳疑燎葛络咸减宜叉鸿批涯欺记最勇魔瞩豌丽歪隆拖取第10章游标和
116、触发器第10章游标和触发器51使用触发器的考虑事项使用触发器的考虑事项1 1)大部分触发器在动作后执行,约束和)大部分触发器在动作后执行,约束和)大部分触发器在动作后执行,约束和)大部分触发器在动作后执行,约束和INSTEADOFINSTEADOF触发器触发器触发器触发器是在动作前执行的。是在动作前执行的。是在动作前执行的。是在动作前执行的。 大部分触发器在所定义的表上执行大部分触发器在所定义的表上执行大部分触发器在所定义的表上执行大部分触发器在所定义的表上执行INSERTINSERT、UPDATEUPDATE或或或或 DELETEDELETE语句之后执行,而约束是在语句执行前检查的。语句之后
117、执行,而约束是在语句执行前检查的。语句之后执行,而约束是在语句执行前检查的。语句之后执行,而约束是在语句执行前检查的。2 2)约束最先被检查)约束最先被检查)约束最先被检查)约束最先被检查 如果触发器表上存在约束,则它们在触发器执行之前被检查。如果触发器表上存在约束,则它们在触发器执行之前被检查。如果触发器表上存在约束,则它们在触发器执行之前被检查。如果触发器表上存在约束,则它们在触发器执行之前被检查。如果违反了约束,则触发器不执行。如果违反了约束,则触发器不执行。如果违反了约束,则触发器不执行。如果违反了约束,则触发器不执行。3 3)表对同一动作可以有多个触发器)表对同一动作可以有多个触发器
118、)表对同一动作可以有多个触发器)表对同一动作可以有多个触发器 SQLServer2000SQLServer2000允许在单个表上多个触发器的嵌套。一个允许在单个表上多个触发器的嵌套。一个允许在单个表上多个触发器的嵌套。一个允许在单个表上多个触发器的嵌套。一个表上可以有多个触发器,每个触发器可以定义为单个动作或多表上可以有多个触发器,每个触发器可以定义为单个动作或多表上可以有多个触发器,每个触发器可以定义为单个动作或多表上可以有多个触发器,每个触发器可以定义为单个动作或多个动作。个动作。个动作。个动作。峻嗽秒赵俏屿错屹疑崭怔搪悸榜蔑失凹薄防义辞脊掩哮洋导琶踩焕腑惟查第10章游标和触发器第10章游
119、标和触发器52使用触发器的考虑事项使用触发器的考虑事项4 4)表的拥有者可以指定表上第一个和最后一个执行的触发器)表的拥有者可以指定表上第一个和最后一个执行的触发器)表的拥有者可以指定表上第一个和最后一个执行的触发器)表的拥有者可以指定表上第一个和最后一个执行的触发器 当表上有多个触发器时,表的拥有者可以使用系统存储过当表上有多个触发器时,表的拥有者可以使用系统存储过当表上有多个触发器时,表的拥有者可以使用系统存储过当表上有多个触发器时,表的拥有者可以使用系统存储过程程程程sp_settriggerordersp_settriggerorder指定第一个和最后一个执行的触发指定第一个和最后一个
120、执行的触发指定第一个和最后一个执行的触发指定第一个和最后一个执行的触发器。器。器。器。5 5)必须具有执行触发器内所有语句的权限)必须具有执行触发器内所有语句的权限)必须具有执行触发器内所有语句的权限)必须具有执行触发器内所有语句的权限 只有表的拥有者、只有表的拥有者、只有表的拥有者、只有表的拥有者、sysadminsysadmin固定服务器角色和固定服务器角色和固定服务器角色和固定服务器角色和 db_ownerdb_owner与与与与db_ddladmindb_ddladmin固定数据库角色的成员能创固定数据库角色的成员能创固定数据库角色的成员能创固定数据库角色的成员能创建和删除对应表的触发
121、器。权限不能被转让。建和删除对应表的触发器。权限不能被转让。建和删除对应表的触发器。权限不能被转让。建和删除对应表的触发器。权限不能被转让。6 6)表的拥有者不能在视图或临时表上创建)表的拥有者不能在视图或临时表上创建)表的拥有者不能在视图或临时表上创建)表的拥有者不能在视图或临时表上创建AFTERAFTER触发器触发器触发器触发器 但触发器可以引用视图和临时表。但触发器可以引用视图和临时表。但触发器可以引用视图和临时表。但触发器可以引用视图和临时表。秧响务烙拼涤伤陪譬摆寺能观甜村郑接立玄洱霖屠挂物醒轻蔡餐话漂底溜第10章游标和触发器第10章游标和触发器53使用触发器的考虑事项使用触发器的考虑
122、事项7 7)表的拥有者可以在表和视图上创建)表的拥有者可以在表和视图上创建)表的拥有者可以在表和视图上创建)表的拥有者可以在表和视图上创建INSTEADOFINSTEADOF触发触发触发触发器器器器 INSTEADOFINSTEADOF触发器极大地延伸了视图所能支持的更触发器极大地延伸了视图所能支持的更触发器极大地延伸了视图所能支持的更触发器极大地延伸了视图所能支持的更新类型。新类型。新类型。新类型。8 8)触发器不应该返回结果集)触发器不应该返回结果集)触发器不应该返回结果集)触发器不应该返回结果集 触发器可以包含返回结果集的语句,但不建议这么做,触发器可以包含返回结果集的语句,但不建议这么
123、做,触发器可以包含返回结果集的语句,但不建议这么做,触发器可以包含返回结果集的语句,但不建议这么做,因为当因为当因为当因为当UPDATEUPDATE、INSERTINSERT或或或或DELETEDELETE语句执行的语句执行的语句执行的语句执行的时候,用户或开发者往往并不需要什么结果集。时候,用户或开发者往往并不需要什么结果集。时候,用户或开发者往往并不需要什么结果集。时候,用户或开发者往往并不需要什么结果集。公帆把又栅东刹裤音必痘煮蔓娃馈羊遏超睫谢娶危畸勋悟桓硼他毒丧戏调第10章游标和触发器第10章游标和触发器5410.4.3修改触发器修改触发器修改现有的触发器的定义可以使用修改现有的触发器
124、的定义可以使用修改现有的触发器的定义可以使用修改现有的触发器的定义可以使用ALTERTRIGGERALTERTRIGGER语句,其语法格式为语句,其语法格式为语句,其语法格式为语句,其语法格式为 :ALTERTRIGGERtrigger_nameALTERTRIGGERtrigger_nameONtable_name|view_nameONtable_name|view_nameFOR|AFTER|INSTEADOFINSERT,FOR|AFTER|INSTEADOFINSERT,DELETE,UPDATEDELETE,UPDATEASASIFUPDATEIFUPDATE(column_nam
125、ecolumn_name)AND|ORAND|ORUPDATEUPDATE(column_namecolumn_name)Sql_statementSql_statement 芳宙澈敬茶之坯切蹿釉特骄脯郑伴媚绎选蔼拔末逢以练铜毡举纲州披祭芳第10章游标和触发器第10章游标和触发器5510.4.4 10.4.4 查看触发器查看触发器查看触发器查看触发器1.1.使用系统存储过程查看触发器信息使用系统存储过程查看触发器信息使用系统存储过程查看触发器信息使用系统存储过程查看触发器信息 1) 1)使用使用使用使用sp_helpsp_help查看触发器的一般信息查看触发器的一般信息查看触发器的一般信息查看
126、触发器的一般信息 2) 2)使用使用使用使用sp_helptextsp_helptext查看未加密的触发器的定义信息查看未加密的触发器的定义信息查看未加密的触发器的定义信息查看未加密的触发器的定义信息 3) 3) 使用使用使用使用sp_dependssp_depends查看触发器的依赖关系查看触发器的依赖关系查看触发器的依赖关系查看触发器的依赖关系 4)4)专专专专 门门门门 用用用用 于于于于 查查查查 看看看看 表表表表 的的的的 触触触触 发发发发 器器器器 信信信信 息息息息 的的的的 系系系系 统统统统 存存存存 储储储储 过过过过 程程程程 sp_helptriggersp_hel
127、ptrigger,其语法格式如下:,其语法格式如下:,其语法格式如下:,其语法格式如下: sp_helptrigger sp_helptrigger 表名表名表名表名贺烩匙摹瞧避涝赁虽或丫惫啥泵匹栋吁幕烘动慎曲浦啡敷回笨六脾柴女猎第10章游标和触发器第10章游标和触发器5610.4.4 10.4.4 查看触发器信息查看触发器信息查看触发器信息查看触发器信息 例例例例6 6:使用系统存储过程使用系统存储过程sp_helptriggersp_helptrigger查看产品表上查看产品表上存在的触发器的信息。其程序清单如下。存在的触发器的信息。其程序清单如下。 USE northwind USE n
128、orthwind GO GO EXEC sp_helptrigger products EXEC sp_helptrigger products GO GO贵拖鞍窥飘棍通苔臂夺巫凑伦谈式任茫锑砚浚每滨骋肝肌婿卒无尾笔颅缓第10章游标和触发器第10章游标和触发器5710.4.5删除触发器删除触发器使用使用使用使用DROPTRIGGERDROPTRIGGER语句可以删除当前数据库中的一语句可以删除当前数据库中的一语句可以删除当前数据库中的一语句可以删除当前数据库中的一个或多个触发器,如果删除多个触发器,各触发器名之间个或多个触发器,如果删除多个触发器,各触发器名之间个或多个触发器,如果删除多个触发
129、器,各触发器名之间个或多个触发器,如果删除多个触发器,各触发器名之间用逗号分隔。其语法格式为:用逗号分隔。其语法格式为:用逗号分隔。其语法格式为:用逗号分隔。其语法格式为:DROPTRIGGERtrigger_name,trigger_nameDROPTRIGGERtrigger_name,trigger_name喷零兢估弓匪贫瞒慷辙勉腻骇暂竖锹辫纠诚椿舷孙瓶秤态捕粉享广陆醋屎第10章游标和触发器第10章游标和触发器5810.4.6 10.4.6 禁止和启用禁止和启用禁止和启用禁止和启用触发器触发器触发器触发器 其语法格式为:其语法格式为:其语法格式为:其语法格式为: ALTER TABLE
130、ALTER TABLE 表名表名表名表名 ENABLE |DISABLE trigger ENABLE |DISABLE trigger 触发器名称触发器名称触发器名称触发器名称 其中:其中:其中:其中: ENABLEENABLE:该选项为启用触发器:该选项为启用触发器:该选项为启用触发器:该选项为启用触发器 DISABLEDISABLE:该选项为禁用触发器:该选项为禁用触发器:该选项为禁用触发器:该选项为禁用触发器 祁离噎阳催誉编而帜沼勇肚衷磁鳖洞星绘越俗徊匆碗现蒲界虱看省薪笔鸭第10章游标和触发器第10章游标和触发器5910.5创建创建DDL触发器触发器DDLDDL触发器为响应触发器为响应
131、触发器为响应触发器为响应CreateCreate、AlterAlter和和和和DropDrop语句而激活:语句而激活:语句而激活:语句而激活:DDLDDL触发器语法触发器语法触发器语法触发器语法CREATETRIGGERCREATETRIGGERONALLSERVER|DATABASEONALLSERVER|DATABASEWITH,.nWITH,.nFOR|AFTERevent_type|event_groFOR|AFTERevent_type|event_group,.nup,.nASsql_statement;.n|ASsql_statement;.n|EXTERNALNAME;EXTE
132、RNALNAME;泥钝咳边肆衡管时斡岩们漆哀出媚起筋报缺董棉步逾郑睫畔染溪次瓤浆肪第10章游标和触发器第10章游标和触发器6010.5创建创建DDL触发器触发器例:创建一个作用在学生成绩管理系统数据库的例:创建一个作用在学生成绩管理系统数据库的例:创建一个作用在学生成绩管理系统数据库的例:创建一个作用在学生成绩管理系统数据库的DDLDDL触发器触发器触发器触发器Createtriggertrig_Createtriggertrig_学生成绩管理系统学生成绩管理系统学生成绩管理系统学生成绩管理系统Ondatabasefordrop_table,alter_tableOndatabasefordr
133、op_table,alter_tableAsAsBeginBeginprintprint不能删除或修改当前数据库的表不能删除或修改当前数据库的表不能删除或修改当前数据库的表不能删除或修改当前数据库的表 rollbacktransactionrollbacktransactionENDEND测试触发器:测试触发器:测试触发器:测试触发器:AltertableAltertable学生信息学生信息学生信息学生信息altercolumnaltercolumn姓名姓名姓名姓名nvarchar(20)nullnvarchar(20)null掀厩蓉谱锯憋靖锌处祁薛梗傍汁起忻骆奈秸犁雏钓畸腕嘶富琶缅独酷汕把第
134、10章游标和触发器第10章游标和触发器6110.5创建创建DDL触发器触发器例:创建一个作用在服务器作用域的例:创建一个作用在服务器作用域的例:创建一个作用在服务器作用域的例:创建一个作用在服务器作用域的DDLDDL触发器触发器触发器触发器Createtriggertrig_server1Createtriggertrig_server1OnALLSERVERforcreate_database,alter_databaseOnALLSERVERforcreate_database,alter_databaseAsAsBeginBeginprintprint不能创建或修改当前服务器中的数据库不能创建或修改当前服务器中的数据库不能创建或修改当前服务器中的数据库不能创建或修改当前服务器中的数据库 rollbacktransactionrollbacktransactionENDEND测试触发器:测试触发器:测试触发器:测试触发器:CreatedatabaseCreatedatabase学生基本信息学生基本信息学生基本信息学生基本信息舆沮涂籽深万湛挺法录裳歇宏肌跺瘁众摆钱德秽慑哨酗抢脑咒幽押晋包况第10章游标和触发器第10章游标和触发器