版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第第1111章章 触发器触发器 触发器是客户触发器是客户/ /服务器数据库的一服务器数据库的一种关键特性。使用触发器,开发人员可种关键特性。使用触发器,开发人员可以在数据库引擎上稳固地实现复杂的业以在数据库引擎上稳固地实现复杂的业务规则。务规则。 本章介绍触发器的概念、使用方法。本章介绍触发器的概念、使用方法。 第第11章章 触发器触发器n教学目标:触发器也是一种存储过程,它是一种在基本表被修改时自动执行的内嵌过程,它主要是通过事件进行触发而被执行。n教学提示:通过本章的学习,要求掌握触发器的概念、用途、创建、修改等管理和操作,能编写简单运用INSERT触发器、UPDATE触发器和DELETE
2、触发器的代码。11.1 11.1 触发器的概念触发器的概念 触发器是一种特殊类型的存储过程,它与前触发器是一种特殊类型的存储过程,它与前面章节讲解的存储过程不同。存储过程可以通过面章节讲解的存储过程不同。存储过程可以通过存储过程名来调用,而触发器是一段能自动执行存储过程名来调用,而触发器是一段能自动执行的程序,不由用户直接调用,不能带有参数,也的程序,不由用户直接调用,不能带有参数,也没有返回值。当用户对表进行了诸如没有返回值。当用户对表进行了诸如INSERTINSERT、UPDATEUPDATE、DELETEDELETE等操作时,等操作时,SQL ServerSQL Server就会自动就会
3、自动执行触发器所事先定义好的语句。执行触发器所事先定义好的语句。 11.1.1 11.1.1 触发器的作用触发器的作用 使用触发器的最终目标是为了更好地维护使用触发器的最终目标是为了更好地维护企业的业务规则,实现由主键和外键所不能保企业的业务规则,实现由主键和外键所不能保证的复杂参照完整性和数据一致性。除此以外,证的复杂参照完整性和数据一致性。除此以外,使用触发器还有以下的一些功能:使用触发器还有以下的一些功能:1.1.可以强化约束可以强化约束 触发器可以实现比触发器可以实现比checkcheck子句更为复杂的条子句更为复杂的条件约束,件约束,checkcheck约束在限制数据输入时不能参照约
4、束在限制数据输入时不能参照其它表中的数据。其它表中的数据。2.2.可以实现数据库中多张表的级联运行可以实现数据库中多张表的级联运行 触发器可以侦测数据库内的操作,并自动触发器可以侦测数据库内的操作,并自动地级联整个数据库的各项内容。地级联整个数据库的各项内容。3.3.可以跟踪数据变化可以跟踪数据变化 触发器可以跟踪数据库内的操作,当数据触发器可以跟踪数据库内的操作,当数据库发生了未经许可的更新和变化时,撤销或者库发生了未经许可的更新和变化时,撤销或者回滚操作使数据库修改、更新操作更安全,数回滚操作使数据库修改、更新操作更安全,数据库运行更稳定。据库运行更稳定。4.4.可以调用存储过程可以调用存
5、储过程 触发器操作可以通过调用一个或多个存储触发器操作可以通过调用一个或多个存储过程,甚至可以通过调用外部过程完成相应的过程,甚至可以通过调用外部过程完成相应的操作。操作。 11.1.2 11.1.2 触发器的分类触发器的分类 SQL ServerSQL Server包括三种常规类型的触发器:包括三种常规类型的触发器: DMLDML触发器触发器(DMLDML数据操作语言)数据操作语言) DDLDDL触发器触发器(DDLDDL数据定义语言)数据定义语言) 登录触发器登录触发器1. DML1. DML触发器触发器 当数据库中发生当数据库中发生数据操作数据操作语言(语言(DMLDML)事件时将调)事
6、件时将调用用DMLDML触发器。触发器。DMLDML事件包括在指定表或视图中修改数事件包括在指定表或视图中修改数据的据的INSERTINSERT语句、语句、UPDATEUPDATE语句或语句或DELETEDELETE语句。语句。DMLDML触发触发器可以查询其他表,还可以包含复杂的器可以查询其他表,还可以包含复杂的Transact-SQLTransact-SQL语句。语句。 将触发器和触发它的语句作为可在触发器内回滚将触发器和触发它的语句作为可在触发器内回滚的单个事务对待。如果检测到错误(例如,磁盘空间的单个事务对待。如果检测到错误(例如,磁盘空间不足),则整个事务即自动回滚。不足),则整个事
7、务即自动回滚。DMLDML触发器在以下方面非常有用:触发器在以下方面非常有用: 1) DML1) DML触发器可通过数据库中的相关表实现级联修改。触发器可通过数据库中的相关表实现级联修改。不过,通过级联引用完整性约束可以更有效地进行这些更不过,通过级联引用完整性约束可以更有效地进行这些更改。改。 2) DML2) DML触发器可以防止恶意或错误的触发器可以防止恶意或错误的INSERTINSERT、UPDATEUPDATE以以及及DELETEDELETE操作,并强制执行比操作,并强制执行比CHECKCHECK约束定义的限制更为复约束定义的限制更为复杂的其他限制。与杂的其他限制。与CHECKCHE
8、CK约束不同,约束不同,DMLDML触发器可以引用其触发器可以引用其他表中的列。他表中的列。例如:例如:触发器可以使用另一个表中的触发器可以使用另一个表中的SELECTSELECT比较插入或更比较插入或更新的数据,以及执行其他操作,如修改数据或显示用户错新的数据,以及执行其他操作,如修改数据或显示用户错误信息。误信息。 3) DML3) DML触发器可以评估数据修改前后表的状态,并根据触发器可以评估数据修改前后表的状态,并根据该差异采取措施。该差异采取措施。 4) 4) 一个表中的多个同类一个表中的多个同类DMLDML触发器(触发器(INSERTINSERT、UPDATEUPDATE或或DEL
9、ETEDELETE)允许采取)允许采取 多个不同的操作来响应同一个修改语多个不同的操作来响应同一个修改语句。句。 用户可以设计以下类型的用户可以设计以下类型的DMLDML触发器:触发器:(1) (1) 后触发器(后触发器(AFTER AFTER 触发器)触发器)(2) (2) 替代触发器(替代触发器(INSTEAD OF INSTEAD OF 触发器)触发器)P168 2. DDL触发器触发器 DDLDDL触发器将激发存储过程以响应事件触发器将激发存储过程以响应事件。但与。但与DMLDML触发触发器不同的是,它们不会为响应针对表或视图的器不同的是,它们不会为响应针对表或视图的UPDATEUPD
10、ATE、INSERTINSERT或或DELETEDELETE语句而激发。相反,它们将为了响应各种语句而激发。相反,它们将为了响应各种数据定义语言(数据定义语言(DDLDDL)事件而激发。这些事件主要与以关键事件而激发。这些事件主要与以关键字字CREATECREATE、ALTERALTER和和DROPDROP开头的开头的T-SQLT-SQL语句对应。语句对应。DDLDDL触发器触发器可用于管理任务,可用于管理任务,例如:例如:审核和控制数据库操作。审核和控制数据库操作。如果要执行以下操作,可使用如果要执行以下操作,可使用DDLDDL触发器:触发器:1)1)要防止对数据库架构进行某些更改。要防止对
11、数据库架构进行某些更改。2)2)希望数据库中发生某种情况以响应数据库架构中的更改。希望数据库中发生某种情况以响应数据库架构中的更改。3)3)要记录数据库架构中的更改或事件。要记录数据库架构中的更改或事件。仅在运行触发仅在运行触发DDL触发器的触发器的DDL语句后,语句后,DDL触发器才会激发。触发器才会激发。DDL触发器触发器无法作为无法作为INSTEAD OF触发器使用。触发器使用。3. 3. 登录触发器登录触发器 登录触发器将为响应登录触发器将为响应LOG ONLOG ON事件而激发存事件而激发存储过程。与储过程。与SQL ServerSQL Server实例建立用户会话时将实例建立用户会
12、话时将引发此事件。登录触发器将在登录的身份验证引发此事件。登录触发器将在登录的身份验证阶段完成之后且用户会话实际建立之前激发。阶段完成之后且用户会话实际建立之前激发。 可以使用登录触发器来审核和控制服务器可以使用登录触发器来审核和控制服务器会话,会话,例如:例如:通过跟踪登录活动、限制通过跟踪登录活动、限制SQL SQL ServerServer的登录名或限制特定登录名的会话数。的登录名或限制特定登录名的会话数。 本章将重点介绍本章将重点介绍DMLDML触发器触发器。 触发器的作用触发器的作用 可以对数据库进行级联修改。 可以完成比CHECK更复杂的约束。与与CHECK约约束不同,在触发器中可
13、以引用其他的表束不同,在触发器中可以引用其他的表。比如,当向图书借阅表图书借阅表中插入一条借阅记录时,可以查看对应读者在读者信息表读者信息表中的是否借书数量已超过限借数量,从而判定能否再为该读者借书。 可以发现改变前后表中不同的数据,并据此来进行相应的操作。 对于一个表上的不同的操作对于一个表上的不同的操作(INSERT、UPDATE或或DELETE)可以采用不同的触发器可以采用不同的触发器,相同的语句可以调用不同的触发器完成不同的操作。触发器具有以下特点触发器具有以下特点 触发器定义在指定的表上,这个表称为触发器表。触发器定义在指定的表上,这个表称为触发器表。 它是在操作有效后才执行的,它是
14、在操作有效后才执行的,即其他约束优先于即其他约束优先于触发器触发器 它与存储过程的不同之处在于存储过程可以由用它与存储过程的不同之处在于存储过程可以由用户直接调用,户直接调用,而触发器不能被直接调用,是由操纵事而触发器不能被直接调用,是由操纵事件触发的件触发的 一个表可以有多个触发器,在不同表上同一种类一个表可以有多个触发器,在不同表上同一种类型的触发器也可以有多个型的触发器也可以有多个 触发器允许嵌套,最多为触发器允许嵌套,最多为32层层 是操纵事务的一部分可以将触发器和触发它的语是操纵事务的一部分可以将触发器和触发它的语句作为可在触发器内回滚的单个事务对待。句作为可在触发器内回滚的单个事务
15、对待。 比较:触发器与约束比较:触发器与约束 约束和约束和DMLDML触发器在特殊情况下各有优点。触发器在特殊情况下各有优点。DMLDML触发器的主要优点在于它们可以包含使用触发器的主要优点在于它们可以包含使用Transact-SQLTransact-SQL代码的复杂处理逻辑。因此,代码的复杂处理逻辑。因此,DMLDML触发器可以支持约束的所有功能;但触发器可以支持约束的所有功能;但DMLDML触发器触发器对于给定的功能并不总是最好的方法。对于给定的功能并不总是最好的方法。 当约束支持的功能无法满足应用程序的功当约束支持的功能无法满足应用程序的功能要求时,能要求时,DMLDML触发器非常有用。
16、触发器非常有用。 详细介绍见详细介绍见P169P169页页DMLDML触发器的分类触发器的分类 触发器与表或视图触发器与表或视图是不能分开的,触发器定义在一个是不能分开的,触发器定义在一个表或视图中,当在表或视图中执行表或视图中,当在表或视图中执行插入(插入( INSERT)、)、修改(修改(UPDATE)、删除()、删除(DELETE)操作时触发器被操作时触发器被触发自动执行。触发自动执行。当表或视图被删除时与它关联的触发器当表或视图被删除时与它关联的触发器也一同被删除。也一同被删除。分类:分类:1.据触发时刻分为据触发时刻分为:AFTER(之后之后)触发器和触发器和INSTEAD(替代替代
17、)触发器触发器2.据触发语句分为据触发语句分为:INSERT、UPDATE和和DELETE触发器触发器AFTER(之后之后) 和和 INSTEAD(替代替代)触发器触发器*AFTER触发器触发器是在是在处理完约束之后处理完约束之后执行触发执行触发操作(操作(INSERT、UPDATE 或或 DELETE)后激)后激发;只宜建在表上发;只宜建在表上(主要掌握主要掌握)*INSTEAD触发器触发器是由触发器的程序代替是由触发器的程序代替代替代替INSERT、UPDATE 或或 DELETE语句语句执行,在执行,在处理约束之前处理约束之前激发;可以建在激发;可以建在表或视图表或视图上。上。所以所以:
18、 若执行若执行INSERT、UPDATE 或或 DELETE语句语句违犯违犯约束条件约束条件时,将不执行时,将不执行AFTER触发器触发器; 而在定义而在定义INSTEAD OF触发器触发器的表或视图上的表或视图上执行执行INSERT、UPDATE 或或 DELETE语句时,语句时,会激发触发器而不执行这些数据操作语句本身。会激发触发器而不执行这些数据操作语句本身。11.2 11.2 创建触发器创建触发器 可以使用可以使用CREAT TRIGGERCREAT TRIGGER语句来完成对触发语句来完成对触发器的创建操作,创建器的创建操作,创建DMLDML触发器的基本语法如下:触发器的基本语法如下
19、:CREATE TRIGGER trigger_name CREATE TRIGGER trigger_name ON table | view ON table | view WITH ENCRYPTION WITH ENCRYPTION FOR | AFTER | INSTEAD OF FOR | AFTER | INSTEAD OF INSERT , UPDATE , DELETE INSERT , UPDATE , DELETE WITH APPEND WITH APPEND NOT FOR REPLICATION NOT FOR REPLICATION ASAS SQL SQL语句系
20、列语句系列GOCREATE TRIGGER 触发器名触发器名ON 表名或视图名表名或视图名FOR |AFTER |INSTEAD OF INSERT,UPDATE,DELETEWITH ENCRYPTIONAS SQL语句语句GO注意:注意:1) 1) CREATE TRIGGERCREATE TRIGGER语句必须是一个批处理的第语句必须是一个批处理的第一条语句。一条语句。2) 2) 创建创建DMLDML触发器的权限默认分配给表的所有触发器的权限默认分配给表的所有者,且不能将该权限转给其他用户。者,且不能将该权限转给其他用户。3) 3) 一个触发器只能创建在一个表上;一个表可一个触发器只能创
21、建在一个表上;一个表可以有一个替代触发器和多个后触发器。以有一个替代触发器和多个后触发器。4) 4) 虽然虽然DMLDML触发器可以引用当前数据库以外的触发器可以引用当前数据库以外的对象,但只能在当前数据库中创建对象,但只能在当前数据库中创建DMLDML触发器。触发器。注意:注意:5) 5) 触发器的定义语句中不能有任何用触发器的定义语句中不能有任何用CREATECREATE创建、用创建、用ALTERALTER修改数据库或各种对象的语句,不允许使用任何修改数据库或各种对象的语句,不允许使用任何的的DROPDROP语句。语句。6) 6) TRUNCATE TABLETRUNCATE TABLE虽
22、然在功能上与虽然在功能上与DELETEDELETE类似,但是类似,但是由于由于TRUNCATETRUNCATE删除记录时不被记入事务日志,所以该删除记录时不被记入事务日志,所以该语句不能激活语句不能激活deletedelete删除操作的触发器。删除操作的触发器。7) 7) WRITETEXTWRITETEXT命令不会触发命令不会触发INSERTINSERT或者或者UPDATEUPDATE触发器触发器运行。触发器作为一种数据库对象,在运行。触发器作为一种数据库对象,在syscommentssyscomments系系统表中存储其完整的定义信息,统表中存储其完整的定义信息,在在sysobjectss
23、ysobjects系统表系统表中有该对象的记录。中有该对象的记录。sysobjectssysobjects表中表中namename列对应对象列对应对象名,名,typetype或或xtypextype列对象对象类型,触发器用列对象对象类型,触发器用“TR”TR”表表示。示。 简单小结:简单小结: (1)触发器的定义必须是一段批文件的第一条触发器的定义必须是一段批文件的第一条命令命令 (2) AFTER触发器触发器只能只能在表上定义在表上定义 (3)触发器触发器尽量尽量不在视图上定义不在视图上定义 (4)触发器不能处理触发器不能处理TEXT和和IMAGE数据类型数据类型的大型二进制对象表列的大型二
24、进制对象表列 (5)建议建议不要使用触发器返回一个不要使用触发器返回一个结果集结果集 触发器中用到的两条触发器中用到的两条SQL命令:命令:功能:功能:提交操作到服务器提交操作到服务器语法如下:语法如下:COMMIT功能:功能:回滚、撤销当前操作回滚、撤销当前操作语法如下:语法如下:ROLLBACK触发器的运行机制1DELETE触发器触发器 对表进行删除时,如果此表有DELETE型的触发器,则触发器被触发执行。被删除的记录存在DELETED表中。当执行DELETE操作时,应应注意以下几点:注意以下几点: (1)被放到DELETED表中的记录,不再存于触发器表中,因此触发器表触发器表与DELET
25、ED表没有共同的记录。 (2)DELETED表放在内存中,执行效率很高。【例例11-211-2】定义一个定义一个DELETEDELETE触发器,实现当删除触发器,实现当删除某个读者信息后,就删除该读者的借阅记录。某个读者信息后,就删除该读者的借阅记录。代码清单如下:代码清单如下: USE Library GOIF EXISTS ( SELECT * FROM sysobjects WHERE name=user_tri and type=TR) DROP TRIGGER user_triGOCREATE TRIGGER user_tri -创建触发器创建触发器ON UserTbAFTER DE
26、LETEASBEGINDECLARE t char(6)SELECT t=UserId FROM DELETED -使用使用DELETED表中数据表中数据DELETE FROM Lending WHERE UserId=tENDGO-引起触发器工作的删除语句引起触发器工作的删除语句DELETE FROM UserTb -从从UserTb表中删除记录表中删除记录WHERE UserName=王凯王凯GO 【例【例1】 在在Library库的库的book2表上建立一个名为表上建立一个名为book_trigger1的的DELETE触发器,该触发器将对触发器,该触发器将对book2表中删除记录的操作给
27、出提示信息,并取消当表中删除记录的操作给出提示信息,并取消当前的删除操作。前的删除操作。goCREATE TRIGGER book_trigger1ON book2FOR DELETEAS BEGIN print 删除失败!删除失败! ROLLBACK -回滚命令,取消删除操作回滚命令,取消删除操作ENDDELETE FROM book2WHERE 编号编号=YBZT2411注意:注意:此句运行引起触发器工作。此句运行引起触发器工作。【例【例2】 在在Library库的库的book2表上建立一个名为表上建立一个名为book_trigger1的的DELETE触发器,该触发器将对触发器,该触发器将
28、对book2表中删除记录的操作给出提示信息,并取消当表中删除记录的操作给出提示信息,并取消当前的删除操作。前的删除操作。GOCREATE TRIGGER book_trigger2ON book2INSTEAD OF DELETEAS PRINT 数据删除不成功数据删除不成功GO此题与例此题与例1效果效果相同相同【例【例3】 在图书信息表中创建一个触发器,该触发器保在图书信息表中创建一个触发器,该触发器保证每次只能删除一本图书。如果要删除的图书超过一证每次只能删除一本图书。如果要删除的图书超过一本,触发器就返回提示并回滚。本,触发器就返回提示并回滚。GO CREATE TRIGGER tr_T
29、SSCON 图书信息表图书信息表FOR DELETEAS IF (SELECT COUNT(*) FROM deleted) 1 BEGIN print 对不起,一次只能删除一本图书!对不起,一次只能删除一本图书! ROLLBACK TRANSACTIONENDGO例例 DELETE触发器触发器3.sql触发器的运行机制2INSERT触发器触发器 当向表中插入数据时,所有数据约束都通过之后,INSERT触发器就会执行。新的记录不但加到触发器表中,而且还会有副本加入INSERTED表中。因此触发器表与插入信息表有共同的记录。 INSERTED表与DELETED表一样,它们的记录是可读的,可以进行
30、比较,以便确认这些数据是否正确。【例【例4】 在在Library数据库的数据库的book2表上创建一表上创建一个个book_trigger3触发器,当执行触发器,当执行INSERT操作操作时,该触发器被触发时,该触发器被触发(即向所定义触发器的表中即向所定义触发器的表中插入数据时触发器被触发插入数据时触发器被触发)。goCREATE TRIGGER book_trigger3ON book2FOR INSERTAS PRINT 数据插入成功数据插入成功GO2) INSERT触发器触发器当用户向当用户向book2表中插入数据时将触发表中插入数据时将触发触发器,而且数据被插入表中,如向表触发器,而
31、且数据被插入表中,如向表中加入如下记录内容:中加入如下记录内容:INSERT INTO book2VALUES(YB001, SQL2005,25.00, 中中山大学出版社山大学出版社, 2010-1-2, Z001 )思考:思考:能插入数据吗?能插入数据吗?【例例11-311-3】定义一个定义一个INSERTINSERT触发器,实现当向触发器,实现当向BookBook表中添加记录时,把新的图书类别插入到图表中添加记录时,把新的图书类别插入到图书类别表书类别表BookCategoryBookCategory中。中。USE Library USE Library GOGOIF EXISTS(SE
32、LECT IF EXISTS(SELECT * * FROM FROM sysobjectssysobjects WHERE name=bookcate_tri WHERE name=bookcate_tri and type=TR) and type=TR)DROP TRIGGER bookcate_triDROP TRIGGER bookcate_triGOGOGOGOCREATE TRIGGER bookcate_triCREATE TRIGGER bookcate_tri -创建触发器创建触发器ON BookON BookAFTER INSERTAFTER INSERTAS AS BE
33、GINBEGIN DECLARE t varchar(6) DECLARE t varchar(6) SELECT t=BkCateId SELECT t=BkCateId FROM INSERTED FROM INSERTED -使用使用INSERTEDINSERTED表表 INSERT INTO BookCategory(BkCateIdINSERT INTO BookCategory(BkCateId) VALUES(t) VALUES(t)ENDENDGOGO-Book-Book表中插入记录表中插入记录INSERT INTO Book VALUES(AB001,INSERT INTO
34、Book VALUES(AB001,管理专业英语管理专业英语,WK,WK,赵赵伟伟,教育出版社教育出版社,2006-2-2,default,30,1),2006-2-2,default,30,1)GOGO 1.要先删除外键约束才能触发要先删除外键约束才能触发2.必须判别必须判别WK类型没有再插入类型没有再插入3.无法知道类别名称无法知道类别名称GOGOCREATE TRIGGER bookcate_triCREATE TRIGGER bookcate_tri -创建触发器创建触发器ON BookON BookAFTER INSERTAFTER INSERTAS AS BEGINBEGIN DE
35、CLARE t varchar(6) DECLARE t varchar(6) SELECT t=BkCateId SELECT t=BkCateId FROM INSERTED FROM INSERTED -使用使用INSERTEDINSERTED表表 if not EXISTS(SELECT * FROM BookCategory WHERE BkCateId=t) INSERT INTO BookCategory(BkCateId) VALUES(t)ENDENDGOGO-Book-Book表中插入记录表中插入记录INSERT INTO Book VALUES(AB001,INSERT
36、INTO Book VALUES(AB001,管理专业英语管理专业英语,WK,WK,赵伟赵伟,教育出教育出版社版社,2006-2-2,default,30,1),2006-2-2,default,30,1)GOGO 触发器的运行机制3UPDATE触发器触发器 利用UPDATE修改一条记录时,相当于删除一条记录后再增加一条新记录。所以UPDATE操作使用DELETED和INSERTED两个表。当使用UPDATE操作时,触发器表中原来的记录被移到DELETED表中,修改过的记录插入到INSERTED表中,触发器可以检查这两个表,以便确定应执行什么样的操作。【例【例4】 在在book数据库的数据库的
37、book2表上建立一个名为表上建立一个名为book_trigger4的触发器,该触发器将被的触发器,该触发器将被UPDATE操作激活,该操作激活,该触发器将不允许用户修改表的触发器将不允许用户修改表的“定价定价”列运行结果显示:列运行结果显示:“禁禁止修改价格止修改价格!”说明操作无法进行,触发器起到保护作用。说明操作无法进行,触发器起到保护作用。goCREATE TRIGGER book_trigger4ON book2FOR UPDATEASIF UPDATE(定价定价)BEGIN print 禁止修改价格禁止修改价格! ROLLBACK END-调用指令调用指令UPDATE bookSE
38、T 定价定价=5000WHERE 编号编号=YBZT2411【例例11-411-4】定义一个定义一个UPDATEUPDATE触发器,更新读者类别表触发器,更新读者类别表UserCateUserCate中读者类别名称中读者类别名称CateNameCateName时,把读者表时,把读者表UserTbUserTb中相应的读者类别也进行修改。中相应的读者类别也进行修改。USE Library USE Library GOGOIF EXISTS(SELECT IF EXISTS(SELECT * * FROM sysobjects FROM sysobjects WHERE name=usercate_
39、tri WHERE name=usercate_tri and type=TR) and type=TR)DROP TRIGGER usercate_triDROP TRIGGER usercate_triGOGOCREATE TRIGGER usercate_triCREATE TRIGGER usercate_tri -创建触发器创建触发器ON UserCateON UserCateAFTER UPDATEAFTER UPDATEASASBEGINBEGIN DECLARE old varchar(10) DECLARE old varchar(10) DECLARE new varcha
40、r(10) DECLARE new varchar(10) SELECT old=CateName SELECT old=CateName FROM DELETED FROM DELETED -使用使用DELETEDDELETED表和表和INSERTEDINSERTED表表 SELECT new=CateNameSELECT new=CateName FROM INSERTED FROM INSERTED UPDATE UserTb UPDATE UserTb SET CateName=new WHERE CateName SET CateName=new WHERE CateName=old
41、=oldENDENDGOGO-修改修改UserCateUserCate表中记录表中记录 注意注意:先要删除外键先要删除外键UPDATE UserCateUPDATE UserCate SET CateNameSET CateName=高校教师高校教师 WHERE CateNameWHERE CateName=教师教师 GOGO【例例11-111-1】创建一个后触发的触发器,显示修改创建一个后触发的触发器,显示修改记录的条数。记录的条数。USE Library GO-检测是否存在相同名字的触发器检测是否存在相同名字的触发器,如果存在就把如果存在就把它删除它删除,避免调试时的麻烦避免调试时的麻烦
42、IF EXISTS(SELECT * FROM sysobjects WHERE name=book_tri and type=TR) DROP TRIGGER book_triGOGOCREATE TRIGGER book_tri -创建触发器创建触发器ON BookAFTER UPDATEASDECLARE c intSELECT c= rowcountPRINT 一共修改了一共修改了+char(48+c)+行行RETURN GO -在查询页中输入以上代码,单击按钮,运行结果如在查询页中输入以上代码,单击按钮,运行结果如图图11-1所示。所示。 【例例11-511-5】定义一个替代触发器,
43、不允许对定义一个替代触发器,不允许对“AdminTbAdminTb”表进行修改、删除。表进行修改、删除。USE Library USE Library GOGOIF EXISTS(SELECT IF EXISTS(SELECT * * FROM sysobjects FROM sysobjects WHERE name= admin_tri WHERE name= admin_tri and type= TR) and type= TR) DROP TRIGGER admin_tri DROP TRIGGER admin_triGOGOCREATE TRIGGER admin_triCREAT
44、E TRIGGER admin_tri -创建触发器创建触发器ON AdminTbON AdminTbINSTEAD OF UPDATE,DELETEINSTEAD OF UPDATE,DELETEAS AS PRINT PRINT 请原谅请原谅, ,管理员表中数据不允许修改和删管理员表中数据不允许修改和删除!除!GOGODELETE AdminTbDELETE AdminTb -删除删除AdminTbAdminTb表中记录表中记录WHERE Admins=abcWHERE Admins=abcGOGO 11.3 11.3 修改、删除、重命名和查看触发器修改、删除、重命名和查看触发器 11.3
45、.1 11.3.1 修改触发器修改触发器修改触发器的方法很简单,其语法格式如下:修改触发器的方法很简单,其语法格式如下:ALTER TRIGGER trigger_nameALTER TRIGGER trigger_nameON table | view ON table | view WITH ENCRYPTION WITH ENCRYPTION FOR | AFTER | INSTEAD OF FOR | AFTER | INSTEAD OF INSERT , UPDATE , DELETE INSERT , UPDATE , DELETE NOT FOR REPLICATION NOT
46、FOR REPLICATION ASASSQLSQL语句系列语句系列 修改触发器语法与创建触发器几乎相同,只是把修改触发器语法与创建触发器几乎相同,只是把CREATECREATE改改为为ALTERALTER即可。即可。 11.3.2 11.3.2 删除触发器删除触发器 DROP TRIGGERDROP TRIGGER语句可以从当前数据库中删语句可以从当前数据库中删除一个或多个除一个或多个DMLDML或或DDLDDL触发器,语法格式如下:触发器,语法格式如下: DROP TRIGGER trigger_name ,DROP TRIGGER trigger_name ,n n 11.3.3 11.3.3 重命名触发器重命名触发器 系统存储过程系统存储过程sp_renamesp_rename用来重命名,语法格式如下:用来重命名,语法格式如下: EXECUTE sp_rename objname EXECUTE sp_rename objname = = object_na
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2023-2024学年浙江省宁波市慈溪市高三第三次教学质量监测数学试题试卷
- 城市扩建土地征用协议范例2024
- 2024年公司销售协议条款样本
- 2024年食品企业厂长聘任协议范本
- 2024年度专项法律支持公司协议
- 2024公司行政人员专属劳动协议草案
- 文书模板-应届生三方协议签订流程
- 2024年子女赡养义务履行协议
- 2024年家用电器保修协议样本
- 办公室装修升级协议模板 2024
- 天然气管道应急施工方案完整
- 音乐作品授权书参考模板
- 结构设计原理(第四版)叶见曙第1-9章课后习题答案-已按新版更新
- 优秀工作总结范文:阀门专业技术工作总结
- 按键外观及可靠性测试检验标准
- 安防监控系统室外施工安装规范标准
- 胸痛鉴别诊断
- 元明粉比重表
- 房地产估价理论与方法重要公式整理
- 房地产项目投资成本测算参考表
- 提高护士对抢救药品知晓率PDCA案例精编版
评论
0/150
提交评论