SQL Server2005中触发器的运用

上一篇 / 下一篇  2012-06-21 10:47:39 / 个人分类:数据库

编写过存储过程的人,再编写触发器时会发现:他们的语法、格式是非常类似的。其实触发器就是一种特殊类型的存储过程。他们都是预编译的,在程序正式编译前就由编译器进行编译,存储在服务器端。

.Dqs3t3IL.^w5}#G@0  不过,触发器与一般的存储过程也有些区别。触发器主要是通过对数据库的增删改的操作,或者是一个触发动作的触发作用等事件触发而被执行;而存储过程则是通过像传递SQL语句一样,传递存储过程的名字来被程序调用,实现功能。51Testing软件测试网8v a*G7zs.r

]Q Qj-s1_a\j }0  触发器一共分为五种类型:Update触发器,Insert触发器、Delete触发器、Instead of触发器和After触发器。前三个分别是相应表上进行更新、插入、删除操作时触发。Instead of触发器在不执行插入、更新或删除操作时触发。51Testing软件测试网'j|8x^G`

8w*_r*F3jVBe3SG4i0   在触发器中存在两个虚拟表:Inserted表和Deleted表。Inserted表保存的是Insert或Update之后所影响的记录形成的 表,Deleted保存的是Delete或update之前所影响的记录形成的表。这两个表是逻辑表,这两个表是动态驻留在内存中的,当触发器工作完成,这两个表也被删除。51Testing软件测试网(M2d3nR$Yh

51Testing软件测试网q:B-b$^v~ m0OH

  触发器的创建代码格式:

\MWlg7B*H0
CREATE TRIGGER trigger_name      --触发器的名字
ezM"s4@5x\1\tC0ON table|view [WITH ENCRYPTION]  --在哪个表上创建触发器51Testing软件测试网D o(l9A'r`XT;v
{ FOR | AFTER | INSTEAD OF }    51Testing软件测试网^:roI2`!k]"Z4G
{[INSERT][,][UPDATE][,][DELETE]} --激活触发器的类型51Testing软件测试网@ i3d$g;Pr
AS sql_statements […n]

  代码中关键字for、after、Insteadof分别代表不同的使用范围:

4O$~ K2\\'^%[8?z^5h0

  for表示为AFTER触发器,且该类型触发器仅能在表上创建;51Testing软件测试网M;g[ g,j)NL

  after表示只有在执行了指定的操作INSERT、DELETE、UPDATE之后触发器才被激活,执行触发器中的SQL语句;51Testing软件测试网l"r~K}}/yK/o

  instead of当为表或视图定义了针对某一操作INSERT、DELETE、UPDATE的INSTEAD OF 类型触发器,且执行了相应的操作时,尽管触发器被触发,但相应的操作并不被执行,而运行的仅是触发器SQL语句本身。

8C4a$U:hX W:{9k0

  下面说下触发器的作用:

c(A7NdR$b0

  1、级联修改数据库中的相关的表;

8F,bc5Pq%m{"Jk0

  看下面的牛腩新闻发布系统的例子:其中一个新闻类别(Category)对应多个或者0条新闻;一条新闻(news)对应着多个或者0个新闻评论(comment)。

4`9wZ._V;\;tu0
set ANSI_NULLS ON51Testing软件测试网"GX(R@FBB.bf6o
set QUOTED_IDENTIFIER ON51Testing软件测试网e7M7a;}*C pD)?}
go
;DCa2sUO0-- =============================================51Testing软件测试网3]-S |`a1T8i{.S
-- Author:  刘正权
1q$@MD)DS1Zf0-- Create date: 2008-11-15 11:1351Testing软件测试网{/R-t-BK~B
-- Description: 删除新闻类别触发器
.HK?A }#{xF0-- =============================================51Testing软件测试网v!}HT"B J],J
CREATE TRIGGER trigCategoryDelete51Testing软件测试网0l,r#x\@
   ON  category51Testing软件测试网Nj^M/ho
   instead of DELETE
A"lj'^,a(z0AS
1_O/K CrU)\B"`,p%U0BEGIN
+P7V-U.^s6X!j$bRQP0--删除新闻,再在类别表中删除--触发器实现
Y5W;o5{u1lBf+K0 declare @caId int
Tx@+NZ$]%Ux'B0 select @caId=id from deleted51Testing软件测试网*\0N[:[&GK
 --删除评论(选出多条用in,一条用=号)51Testing软件测试网 _~ cvD
 delete comment where newsId in (select newsId from news wherecaId=@caId)
vK*a {YC1Sb!H0 --删除新闻51Testing软件测试网M"I0H0s3}*Kt%w
 delete news wherecaId=@caId51Testing软件测试网4bI-Bh Z ` F
 --删除类别
z'j!l;|(v_?'a0 delete category whereid=@caId51Testing软件测试网KVz;o1}+^;e
END

  2、执行比核查约束更为复杂的约束操作;在触发器中可以书写更为复杂的SQL语句,例如可以引用多个表,并使用if……else等语句做更复杂的检查。51Testing软件测试网%@o5k-mf%E8xM;E

  下面看下例子:如果更改了学生的学号,则他的借书记录表中记录也同时更新。

kRosY*~0

  这时候,我们可以建立一下触发器:51Testing软件测试网;m\_OC:b#q(f

G^G@!c$o0SET ANSI_NULLS ON
x cy Z:K3`q%p`|BP0GO
(B2bLK!fR%M:q0SET QUOTED_IDENTIFIER ON51Testing软件测试网:j!A#l~2Q9t8["u
GO51Testing软件测试网}SD`Vt]-q3c
-- =============================================51Testing软件测试网4id2kR"C
-- Author:  刘正权
YtQErdTmK0-- Create date:2012-4-2251Testing软件测试网+{&VA2CM D7Zw
-- Description: 更改了学生的学号,则他的借书记录表中记录也同时更新51Testing软件测试网me2iv ml
-- =============================================
`O*e] [0Create Trigger truStudent51Testing软件测试网2Y8?/h w:QQ-M)~
On Student        --在Student表中创建触发器51Testing软件测试网"BD _(dDm ^
for Update        --为什么事件触发
Pm4~'u!p5c;?V|0As                --事件触发后所要做的事情
Z+m|G vH0if Update(StudentID)           51Testing软件测试网7l0c:`f a-gD
begin
51Testing软件测试网+I&ZA2k8VW

51Testing软件测试网 X!h/S$de%[?

Update BorrowRecord
$EYl8J{&Y0Set StudentID=i.StudentID
-?+n P4e#?n h0From BorrowRecord br , Deleted   d ,Inserted i  --Deleted和Inserted临时表
oiD j8i'lu)R7a/kI9D0Where br.StudentID=d.StudentID51Testing软件测试网2j+H~3Q:{ a*s`"d
end51Testing软件测试网%B[N-J ]jp+zK
51Testing软件测试网QS*sCw

)i[tHL|h03、拒绝或回滚违反引用完整性的操作。检查对数据库的操作是否违反引用完整性,并选择相应的操作;51Testing软件测试网8]s~0U9_,rgW~-?$M

51Testing软件测试网 b!sYj]Vt

  看下面的例子:不允许删除任何销售记录大于等于20条的商店。

0J8e4e4TY$l@0

K`7U2TU0

4R2nM0T4X7P6J9I0
SET ANSI_NULLS ON51Testing软件测试网-]%}s-g:E`4W
GO51Testing软件测试网|2@ I)G,ncoNm
SET QUOTED_IDENTIFIER ON
;Hfc2r'A8mX0GO51Testing软件测试网u/f%O~Rq/dn
-- =============================================
H[8xIZ*p:S0-- Author:  刘正权
i k(Dk:I$O_3I&\1_0-- Create date: 2012-4-2251Testing软件测试网 e;nWW,@"K6E
-- Description: 不允许删除任何销售记录大于等于20条的商店
Xg"pE)b0-- =============================================
(m]]F}Q0CREATE TRIGGER trDelSales
!p7m#VFJ6MB0   ON  tblSales 
lZ&{`%A&C H0   for Delete
8oQV rG+N0AS51Testing软件测试网7Rn/V,A6R0v~3P*Yx VQ
 if(select Count(*) from Deleted
]O{}/f3iu G0 where Deleted.qty>=20)>0
d)iP{P'y-uS^0BEGIN51Testing软件测试网-Z.[%J1SW x a
 print'您不能删除任何记录'
*[V ]'m&r7N0 rollback transaction   --事务回滚
$?3e:RB{M)i0END
$qz8^9P1o@ G0GO
51Testing软件测试网;Q+J6P IF1}D9S

  4、比较表修改前后数据之间的差别,并根据差别才去相应的操作。

"EII.A mPqRD]'V0

C b0N }r#bf5[K*w0  例如:若想规定每次工资的变动幅度不能超过40%,使用触发器可以将修改后的表数据和修改前的表数据进行比较,若超出40%,可以回滚该修改操作。51Testing软件测试网7gm0Y:yvy R8Y

DXp3nn]:q0  触发器是自动触发的,一旦对表中的数据做了修改,该触发器将立即被激活,充分体现了触发的优势,保持了数据的完整性;然而,触发器性能通常是比较低的。51Testing软件测试网S5V/c&x;sp]

'syg'Jl"m0  当运行触发器时,系统处理的大部分时间花费在参照它表达的这一处理上,因为这些表达既不在内存中,也不在数据库设备上,而逻辑表(删除表和插入表)总是位于内存中。所以触发器参照的其他表的位置决定了操作花费时间的长短。51Testing软件测试网9J5y lPZ `b XSl


TAG:

 

评分:0

我来说两句

Open Toolbar