2016-10-17 3 views
1

Добрый день У меня есть внешняя программа, которая хранит информацию в SQL, я пытаюсь выполнить триггер, который обновляет таблицу, когда некоторые из полей этой таблицы меняются.SQL Trigger To Update

Поэтому у меня есть один столбец Contractual Amount, который должен обновляться каждый раз, когда какой-либо из значений в ufAPCHANG1EAMNT, ufAPHANGE2AMNT и ufAPCHANGE3AMNT изменений.

Человек может изменить одно или все из этих значений и может быть либо + ve, либо -ve, то, если они являются любыми изменениями в этих полях, необходимо соответствующим образом обновить Contractual Amount, но добавив сумму + ve и вычитав отрицательную сумму.

Просьба проверить мой код и сообщить мне, где я ошибаюсь.

ALTER trigger [dbo].[trgContractualAmt] 
ON [dbo].[Vendor] 
AFTER UPDATE 
AS 
    declare 
     @IdI integer, 
     @value1 decimal, 
     @Value2 decimal, 
     @value3 decimal, 
     @sum decimal, 
     @total decimal 

    SELECT 
     @IdI = i.DCLink, 
     @value1 = i.ufAPCHANGE1AMT, 
     @Value2 = i.ufAPCHANGE2AMNT, 
     @value3 =i.ufAPCHANGE3AMNT, 
     @total = i.ufAPContAmt 
    FROM 
     inserted i 
BEGIN 
    IF TRIGGER_NESTLEVEL() > 1 
     RETURN 

    IF @value1 <> (select ufAPCHANGE1AMT from Vendor where DCLink = @IdI) 
      UPDATE Vendor 
      SET ufAPContAmt = ufAPContAmt + @value1 
      where DCLink = @IdI 

     if @Value2 <> (select ufAPCHANGE2AMNT from Vendor where DCLink = @IdI) 
      UPDATE Vendor 
      SET ufAPContAmt = ufAPContAmt + @value2 
      where DCLink = @IdI 

     if @Value3 <> (select ufAPCHANGE3AMNT from Vendor where DCLink = @IdI) 
      UPDATE Vendor 
      SET ufAPContAmt = ufAPContAmt + @value3 
      where DCLink = @IdI   
END 
+3

Ваш триггер ** MAJOR ** недостаток в том, что вы, кажется, предположить, что это будет называться ** один раз в строке * * - Это не относится к делу. Триггер будет срабатывать ** один раз за оператор **, поэтому, если ваши утверждения 'UPDATE' влияют на 25 строк, вы будете запускать триггер ** сразу **, но тогда' Inserted' и 'Deleted' будут содержать 25 строк , Какой из этих 25 строк будет выбран ваш код? 'SELECT ..... FROM Inserted' - он не детерминирован. Для этого нужно переписать триггер! –

+0

Спасибо @marc_s, но если вы проверите это, то при обновлении этой конкретной строки моя вставка имеет только одну строку. –

+0

Тег dbms, который вы используете. Этот код не похож на ANSI SQL. – jarlh

ответ

1

Я предлагаю использовать простой запрос, если это возможно:

ALTER TRIGGER dbo.trgContractualAmt ON dbo.Vendor 
    AFTER UPDATE 
AS 
    BEGIN 
     UPDATE 
      V 
     SET 
      ufAPContAmt += CASE WHEN (V.ufAPCHANGE1AMT <> I.ufAPCHANGE1AMT) 
           THEN I.ufAPCHANGE1AMT 
           ELSE 0 
          END 
      + CASE WHEN (V.ufAPCHANGE2AMNT <> I.ufAPCHANGE2AMNT) 
        THEN I.ufAPCHANGE2AMNT 
        ELSE 0 
       END 
      + CASE WHEN (V.ufAPCHANGE3AMNT <> I.ufAPCHANGE3AMNT) 
        THEN I.ufAPCHANGE3AMNT 
        ELSE 0 
       END 
     FROM 
      Vendor V 
     INNER JOIN inserted I 
      ON V.DCLink = I.DCLink; 

    END; 
+0

Вам действительно нужно условие Where, пожалуйста, проверьте –

+0

Извините, это был код слева от кода Джеральда. Ive отредактировал мой ответ, чтобы удалить. спасибо – Kilren

+0

Спасибо @Kilren, что мне нужно ... –