1

rechargeテーブルにトリガーを作成しました。テーブルのバランスを更新しonaccountregistryます。

ただし、テーブルに行を挿入してもrecharge、トリガーが起動しない場合があります。その場合、値は不一致です。このrechargeテーブルは毎回行を挿入します。

次のようにトリガーを作成しました。これは複製されたテーブルではありません。SQL Server2008Enterpriseエディションを使用しています。

この問題を解決するのを手伝ってください

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は悪いことinsertedです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ん。インデックス付きビューはそうします。DELETEISRecharge

于 2012-11-09T09:00:53.713 に答える
2

もちろん、それは機能しません。トリガーは、挿入された行ごとに 1 回起動すると想定しています。

しかし、そうではありません

トリガーはバッチごとに 1 回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 に答える