SQL Server2005中触发器的运用
上一篇 / 下一篇 2012-06-21 10:47:39 / 个人分类:数据库
不过,触发器与一般的存储过程也有些区别。触发器主要是通过对数据库的增删改的操作,或者是一个触发动作的触发作用等事件触发而被执行;而存储过程则是通过像传递SQL语句一样,传递存储过程的名字来被程序调用,实现功能。51Testing软件测试网!AP/q[ ji
%~7BmW)c,}0 触发器一共分为五种类型:Update触发器,Insert触发器、Delete触发器、Instead of触发器和After触发器。前三个分别是相应表上进行更新、插入、删除操作时触发。Instead of触发器在不执行插入、更新或删除操作时触发。
#s_#^/Y*A$BF@W*p051Testing软件测试网zE9hO`.E3C在触发器中存在两个虚拟表:Inserted表和Deleted表。Inserted表保存的是Insert或Update之后所影响的记录形成的 表,Deleted保存的是Delete或update之前所影响的记录形成的表。这两个表是逻辑表,这两个表是动态驻留在内存中的,当触发器工作完成,这两个表也被删除。
UU S$|3Lf051Testing软件测试网+sc9C2]'|miD1YV b
触发器的创建代码格式:
*?`9D\ofWc C)b0CREATE TRIGGER trigger_name --触发器的名字51Testing软件测试网:n-Fe*WFi'd4Z+c ON table|view [WITH ENCRYPTION] --在哪个表上创建触发器51Testing软件测试网5MN_i;OhB { FOR | AFTER | INSTEAD OF } 51Testing软件测试网"b/UmIBA2`b&r {[INSERT][,][UPDATE][,][DELETE]} --激活触发器的类型51Testing软件测试网#^0K8o P ^3X p-u5_.} AS sql_statements […n] |
代码中关键字for、after、Insteadof分别代表不同的使用范围:
5V(eJ/dy6~~:]0for表示为AFTER触发器,且该类型触发器仅能在表上创建;
&q'a#m{,g0P2VW_0O0after表示只有在执行了指定的操作INSERT、DELETE、UPDATE之后触发器才被激活,执行触发器中的SQL语句;51Testing软件测试网;?x"NeFS
instead of当为表或视图定义了针对某一操作INSERT、DELETE、UPDATE的INSTEAD OF 类型触发器,且执行了相应的操作时,尽管触发器被触发,但相应的操作并不被执行,而运行的仅是触发器SQL语句本身。51Testing软件测试网5~w6hs3s_
下面说下触发器的作用:
6y k@1BE&aDgd01、级联修改数据库中的相关的表;
E9|9g.DZ[*A%Oib0看下面的牛腩新闻发布系统的例子:其中一个新闻类别(Category)对应多个或者0条新闻;一条新闻(news)对应着多个或者0个新闻评论(comment)。
c8p5L%\nO/N0set ANSI_NULLS ON lYF%t7Oe8HZf0set QUOTED_IDENTIFIER ON O{v4D;[y0go -E9b6KLb*[d/_ht\0-- =============================================51Testing软件测试网 Sv(M3?WgU4k*X -- Author: 刘正权51Testing软件测试网P9Q3P(G(a*z&s -- Create date: 2008-11-15 11:13 ITT5I!Yk1cYcx9M0-- Description: 删除新闻类别触发器 @;p)kGG3\0-- =============================================51Testing软件测试网+`$w'? {A CREATE TRIGGER trigCategoryDelete51Testing软件测试网,WI0Rj5Fi{ f ON category51Testing软件测试网Vq2gzsa],h%y instead of DELETE51Testing软件测试网%}9B.F&_.?o$qX(Hq AS51Testing软件测试网(U1Ya@ M0b6e6gSRO BEGIN QJTNo;g0--删除新闻,再在类别表中删除--触发器实现 /e0G`4q2Qn2pSt0 declare @caId int51Testing软件测试网4F5qdo*PM_ select @caId=id from deleted "K(E|%Fsm0 --删除评论(选出多条用in,一条用=号) qLUkCc0 delete comment where newsId in (select newsId from news wherecaId=@caId) GrV!R'K#Tty6U0 --删除新闻 [&i"J*i8W6? mK0 delete news wherecaId=@caId yw^:tBSK j(T)G0 --删除类别51Testing软件测试网w7EyC@t delete category whereid=@caId51Testing软件测试网6} Mj(}K] END |
2、执行比核查约束更为复杂的约束操作;在触发器中可以书写更为复杂的SQL语句,例如可以引用多个表,并使用if……else等语句做更复杂的检查。
3K!Vn/og8t(J`0下面看下例子:如果更改了学生的学号,则他的借书记录表中记录也同时更新。51Testing软件测试网0sDyS:xC"}
这时候,我们可以建立一下触发器:51Testing软件测试网A'c P%y2e!o
D9B%Zg.d0SET ANSI_NULLS ON51Testing软件测试网pK+I'SLin
GO51Testing软件测试网9?6A x7{
Qc&N
SET QUOTED_IDENTIFIER ON
vg-KC*A@9{:L4M0GO
v2AjhBoAvnG0-- =============================================
q2Sy6S&I