【问题标题】:Trigger in SQL Server 2012 to Update Account Balance在 SQL Server 2012 中触发以更新帐户余额
【发布时间】:2016-02-07 23:46:03
【问题描述】:

我有一个 CustomerMaster 表,其中有一个名为 AccountBalance 的列。每个客户(由 CustomerMaster 中的 CustomerId 唯一标识)在 ClientTransaction 表中可以有 0,1 或多个交易,该表有一个名为 Amount 的列(指示交易金额)。我想在 ClientTransaction 表上为 INSERT、UPDATE 和 DELETE 创建一个触发器,以维护 AccountBalance。我尝试定义下面的触发器;当我只删除一行时,它会正确更新 AccountBalance;但是,当我执行 DELETE ClientTransaction 删除所有记录时,它不起作用。有什么想法吗?

CREATE TRIGGER [dbo].[ClientAccountBalanceUpdate]
   ON  [dbo].[ClientTransaction]
   FOR INSERT,DELETE,UPDATE
AS  
BEGIN
    SET NOCOUNT ON;

    if not exists (select 1 from Inserted) -- Delete trigger
        update CustomerMaster set AccountBalance = AccountBalance - D.Amount from CustomerMaster inner join Deleted D on CustomerMaster.CustomerId = D.CustomerId 

    if not exists (select 1 from Deleted) -- Insert Trigger
        update CustomerMaster set AccountBalance = AccountBalance + I.Amount from CustomerMaster inner join Inserted I on CustomerMaster.CustomerId = I.CustomerId

    if  exists (select 1 from Deleted) and exists (select 1 from Inserted) -- Update trigger
        update CustomerMaster set AccountBalance = AccountBalance - D.Amount + I.Amount from CustomerMaster inner join Inserted I on CustomerMaster.CustomerId = I.CustomerId inner join Deleted D on CustomerMaster.CustomerId = D.CustomerId

END

【问题讨论】:

  • 您的问题是您只查看正在删除的所有行中的 1 行,在将其设置为更新之前,您需要 SUM DELETED 中的所有行。如果插入或更新超过 1 行,则会出现同样的问题
  • @SaUce 是的,那是我的预感,我曾尝试过求和,但一定是做错了,因为它仍然无法正常工作。你能举个例子吗?谢谢

标签: sql-server triggers


【解决方案1】:

正如评论中提到的,您的问题是您的代码仅在有一笔交易时才有效。这是您的代码在插入中处理多行时的示例。

If Not Exists (Select 1 From Deleted) -- Insert Trigger
    Update CustomerMaster 
    Set AccountBalance = AccountBalance + 
        (
        Select Sum(I.Amount)
        From Inserted I 
        Where CustomerMaster.CustomerId = I.CustomerId
        )
    From CustomerMaster 

【讨论】:

    【解决方案2】:

    您的触发器仅触发一次(插入、更新或删除第一行时)。

    如果您insertdeleteupdate 超过 1 行,则除非满足接下来的 2 个条件(按给定顺序),否则下次不会触发您的触发器:

    1. 所有队列(插入、删除和更新)都已清空
    2. 插入、删除、更新后全部为空,再插入、删除、更新一行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-08
      • 1970-01-01
      • 2017-06-20
      • 2015-04-25
      • 1970-01-01
      • 2020-11-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多