【发布时间】: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 行,在将其设置为更新之前,您需要
SUMDELETED中的所有行。如果插入或更新超过 1 行,则会出现同样的问题 -
@SaUce 是的,那是我的预感,我曾尝试过求和,但一定是做错了,因为它仍然无法正常工作。你能举个例子吗?谢谢
标签: sql-server triggers