Сложное условие в триггере базы данных - PullRequest
0 голосов
/ 13 марта 2012
Table1 contains id(Auto PK), Key(Varchar) & Value(Int)
Table2 contains Key(Varchar), postive_sum(Int), negative_sum(Int)

Нам нужно писать триггер всякий раз, когда в Таблицу вставляется новая строка

  • Следует сравнить вновь вставленное значение (newRow.Table1.Value) с предыдущим значением (oldRow.Table1.Value) для того же ключа

  • Если оно больше, поле Positive_sum в Table2 имеет обновляться путем добавления вновь вставленного значения (newRow.Table1.Value) с существующим значением

  • Если оно меньше, поле Table2's absolute_sum имеет обновляться путем добавления вновь вставленного значения (newRow.Table1.Value) с существующим значением

  • Если ключ в таблице2 не существует, должна быть создана соответствующая запись

Мы пробовали использовать необходимую логику, но нам не хватает большего для ее создания в MS SQL Server 2008.

Любые входные данные будут высоко оценены.

1 Ответ

0 голосов
/ 13 марта 2012

Примечание: поскольку одновременно может быть обновлено больше записей Таблицы1, имеющих один и тот же ключ, необходимо суммировать различия, помещая только суммарный вес в положительные и отрицательные итоговые поля. Попытка сделать это без суммирования потерпит неудачу, потому что будет записана только последняя строка с тем же ключом, а остальные отброшены.

alter trigger theTrigger on Table1
after update, insert
as
    set NoCount ON

    if update(Value)
    begin
        -- Add missing records to summary table
        insert into table2 (Key, positive_sum, negative_sum)
         select distinct Key, 0, 0
           from Inserted
          where not exists (select null from table2 t2 where t2.Key = Inserted.Key)
        -- Update summary
        update table2
           set Positive_sum = isnull(positive_sum, 0) + isnull (diff.Positives, 0),
               Negative_sum = isnull(Negative_sum, 0) + isnull (diff.Negatives, 0)
          from table2
        -- One can have only one record per key because otherwise sums would not be correct.
           inner join (select Inserted.Key, 
                          sum (case when Inserted.Value > isnull(Deleted.Value, 0) then Inserted.Value - isnull(Deleted.Value, 0) end) Positives,
                          sum (case when Inserted.Value < isnull(Deleted.Value, 0) then isnull(Deleted.Value, 0) - Inserted.Value end) Negatives,
                         from Inserted 
                              left join Deleted on Inserted.ID = Deleted.ID
                         group by Inserted.Key
                       ) diff
            on table2.Key = diff.Key

    end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...