Триггер SQL Server. Нужна помощь - PullRequest
1 голос
/ 27 января 2011

У меня есть таблица с этими столбцами:

  • задолженность
  • выплачено
  • осталось

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

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

Ответы [ 5 ]

4 голосов
/ 27 января 2011

Заданная таблица

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 , который будет иметьаналогичный эффект без побочных эффектов триггеров

4 голосов
/ 27 января 2011

Вместо этого можно рассмотреть вычисляемый столбец .

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

ALTER TABLE yourtable ADD remainder AS debt - paid
3 голосов
/ 27 января 2011

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

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

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

2 голосов
/ 27 января 2011
create trigger DebtPaid
on DebtTable
after insert, update
as if update(paid)
begin
    update DebtTable
    set remained = inserted.debt - inserted.paid
    where customerId = inserted.customerId
end

http://msdn.microsoft.com/en-us/library/ms189799.aspx

http://benreichelt.net/blog/2005/12/13/making-a-trigger-fire-on-column-change/

1 голос
/ 27 января 2011

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

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