2014-01-20 4 views
0

У меня есть таблица CustomerMaster, которая имеет столбец с именем AccountBalance. Каждый клиент (уникально идентифицированный CustomerId в CustomerMaster) может иметь 0,1 или много транзакций в таблице ClientTransaction, в которой есть столбец «Сумма» (с указанием суммы транзакции). Я хочу создать триггер в таблице ClientTransaction для INSERT, UPDATE и DELETE для поддержки AccountBalance. Я попытался определить триггер ниже; когда, я удаляю только одну строку, он правильно обновляет AccountBalance; однако, когда я делаю DELETE ClientTransaction для удаления всех записей, это не сработает. Есть идеи?Trigger в SQL Server 2012 для обновления баланса аккаунта

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 строка вставлена ​​или обновлена ​​ –

+0

@SaUce да, это была моя догадка, и я попытался сделать сумму, но, должно быть, делал это неправильно, потому что она все еще не работает правильно. Не могли бы вы привести пример? Спасибо –

ответ

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 
0

Ваш триггер запускается только один раз (когда первая строка вставлена, обновлена ​​или удалена).

Если вы insert, delete или update более 1 строки, триггер не будет срабатывать в следующий раз, если последующие 2 условия не будут выполнены (в указанном порядке):

  1. всех очередей (вставлено , удалены и обновлены) были опущены
  2. после вставки и удаления и обновления были пустыми, другая строка вставлена, удалена или обновлена.
Смежные вопросы