1

我在我的recharge桌子上创建了一个触发器。它更新onaccountregistry表的余额。

但有时在我的表中插入行时recharge,它不会触发触发器。然后值不匹配。该recharge表每次都插入行。

我按如下方式创建了触发器。这不是复制表。我使用的是 SQL Server 2008 企业版。

请帮我解决这个问题

CREATE TRIGGER [dbo].[RechargeRefund] 
   ON [dbo].[ISRecharge]  
   FOR INSERT  
AS
   declare @tin char(9) 
   declare @depocd char(1) 
   declare @oldvalue money
   declare @newvalue money
begin
    select @tin = inserted.tin_subtin from inserted
    select @depocd = inserted.updatetype from inserted
    select @newvalue = inserted.DepositAmt from inserted
    select @oldvalue = Totdeposit from ISOnAcctRegistry where tin_subtin = @tin
end

if @depocd ='1'
begin
  update ISOnAcctRegistry
  set Totdeposit = @oldvalue + @newvalue
  where tin_subtin = @tin
end 

if @depocd ='2'
begin
  update ISOnAcctRegistry
  set Totdeposit = @oldvalue - @newvalue
  where tin_subtin = @tin
end
GO
4

2 回答 2

3

正如@marc 指出的那样,假设单行写入inserted是不好的——您的 3 个选择甚至可以为您的 3inserted个不同(任意)行的 3 个变量赋值inserted

你可能想要的是:

update i1
set Totdeposit = Totdesposit + t2.Total
from ISOnAcctRegistry i1
        inner join
     (select
         tin_subtin,
         SUM(CASE updatetype
              WHEN 1 THEN DepositAmt
              WHEN 2 THEN -DepositAmt
         ELSE 0 END) as Total
      from inserted
      group by tin_subtin) t2
        on
            i1.tin_subtin = t2.tin_subtin

但是您也许可以ISOnAcctRegistry用构建的索引视图替换这项工作(以及 中的这一列)-ISRecharge有一些限制,您可以构建一个自动跨行执行的视图,并且 SQL Server 将负责维护该值在后台为您服务。SUMISRecharge

UPDATE显然,目前,您的触发器不DELETE考虑ISRecharge. 索引视图会。

于 2012-11-09T09:00:53.713 回答
2

好吧,它当然行不通——你假设触发器每行插入一次

但事实并非如此。

触发器INSERT批次触发一次,伪表Inserted可能包含多行

如果您确实得到了INSERT多行 - 您的语句在这里选择了哪一行?

select @tin = inserted.tin_subtin from inserted
select @depocd = inserted.updatetype from inserted
select @newvalue = inserted.DepositAmt from inserted
select @oldvalue = Totdeposit from ISOnAcctRegistry where tin_subtin = @tin

您需要重写触发器,以便它可以处理多行Inserted- 然后它每次都会工作。

于 2012-11-09T07:10:11.080 回答