2011-01-27 6 views
1

У меня есть таблица с этими столбцами:SQL Server Trigger. Нужна помощь

  • долг
  • оплачиваемую
  • остался

Всякий раз, когда paid столбец обновляется мне нужно пересчитать remained используя следующий расчет debt минус paid

Может ли кто-нибудь помочь Мне это удалось?

ответ

4

Вместо этого вы можете выбрать computed column.

Это article имеет синтаксис для создания с нуля или добавления к существующей схеме, вдоль линий

ALTER TABLE yourtable ADD remainder AS debt - paid 
3

Почему выполнить расчет в когда SQL может сделать это за вас, и вам не нужно беспокоиться о отключении триггеров и т. д .:

CREATE TABLE T (
    /* Other columns */ 
    Debt decimal (18,4) not null, 
    Paid decimal (18,4) not null, 
    Remained as Debt-Paid 
) 

Это называется вычисляемый столбец

4

Учитывая таблицу

CREATE TABLE [MyTable] 
(
    MyTablePK int, 
    debt numeric(10,2), 
    paid numeric(10,2), 
    remainder numeric(10,2) 
) 

Следующий триггер будет пересчитывать поле REMAINDER

CREATE TRIGGER tMyTable ON [MyTable] FOR INSERT, UPDATE 
AS 
    BEGIN 
       SET NOCOUNT ON 
     UPDATE mt 
      Set mt.Remainder = mt.Debt - mt.Paid 
      FROM [MyTable] mt INNER JOIN Inserted i 
      on mt.MyTablePK = i.MyTablePK 
    END 

Вы можете также определить REMAINDER как Computed persisted колонку, который имел бы аналогичный эффект без побочных эффектов триггеров

+1

+1 для вычисленной сохраненной опции. – richaux

+0

Спасибо, что ответили на вопрос И ТАКЖЕ, предлагая другой путь. В моем случае вычисление является геопространственным и, таким образом, не разрешено как постоянная колонка. (Вычисленный столбец xxx в таблице zzz не может быть сохранен, потому что тип столбца, «география», является не-байтовым CLR-типом.) Я мог бы создать вычисленный столбец без ключевого слова PERSISTED, но проблема, которую я пытаюсь решить, избегая дорогостоящих геопространственных вычислений во время выполнения. Хотя постоянный вычисленный столбец будет работать для OP, ваше триггерное решение - это то, что мне нужно будет с ним делать. Благодарю. –

1

Вычисляемые столбцы могут быть хорошими, но они вычисляются на лету и arent, хранящиеся в любом месте, для некоторых больших запросов, которые выполняют длительные вычисления, имеющие физическое денормализованное значение в Remained, контролируемое триггером, могут быть лучше, чем вычисляемые столбцы.

В вашем тригере не забудьте обновить только обновленные строки, вы получите доступ к ним с помощью виртуальной таблицы Inserted Deleted, доступной в триггерах.

+0

Хорошая точка - предложение nonnb re "computed persisted" может помочь, если динамические вычисления являются проблемой. – richaux

Смежные вопросы