日期:2014-05-18  浏览次数:20801 次

求个简单触发器
我在MSSQL里写一个触发器[SumMoney],针对Update触发的,表   abc   字段如下:

m1     m2     m3     sumMoney
1       2       3           6
5       4       3           12

我想要的效果是当用户更改m1或m2或m3的值时,Update触发器就进行统计,将m1+m2+m3的和写到对应的列sumMoney中。下面是我写的:
CREATE   TRIGGER   SumMoney   ON   dbo.abc
FOR   UPDATE
AS
update   [dbo].[abc]     set   sumMoney=m1+m2+m3

以上的代码应该是不管改了哪行,触发器都会将所有行都求和一遍,请问我如何只对更改的行求和呢?

------解决方案--------------------
这个表你需要加一个主键(如id)

update [dbo].[abc] set sumMoney=m1+m2+m3 where id in (select id from deteled)

你要加个条件限制你是计算 更新过的纪录,
更新过的纪录存在于deteled表中

------解决方案--------------------
/*你表应该要有一个主键如id或者其它*/
---创建测试环境
Create Table 测试表(id int,m1 int,m2 int,m3 int,sumMoney int)
Insert 测试表 Select 1,1, 2, 3, 6
Union All Select 2,5, 4, 3, 12
Select * From 测试表

---创建触发器
Create Trigger Tri_Sum On 测试表
For Update
As
If Update(m1) Or Update(m2) Or Update(m3)
Begin
Update T Set T.SumMoney=T.m1+T.m2+T.m3
From 测试表 T
Inner Join Inserted i On T.id=i.id
Inner Join Deleted d On T.id=d.id
End
GO

---更新表
Update 测试表 Set m1=2 Where id=1
Update 测试表 Set m3=1 Where id=2
---查看更新后的数据
Select * From 测试表

--结果
/*
id m1 m2 m3 sumMoney
----------- ----------- ----------- ----------- -----------
1 2 2 3 7
2 5 4 1 10

(所影响的行数为 2 行)
*/