Добрый день У меня есть внешняя программа, которая хранит информацию в 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
Ваш триггер ** MAJOR ** недостаток в том, что вы, кажется, предположить, что это будет называться ** один раз в строке * * - Это не относится к делу. Триггер будет срабатывать ** один раз за оператор **, поэтому, если ваши утверждения 'UPDATE' влияют на 25 строк, вы будете запускать триггер ** сразу **, но тогда' Inserted' и 'Deleted' будут содержать 25 строк , Какой из этих 25 строк будет выбран ваш код? 'SELECT ..... FROM Inserted' - он не детерминирован. Для этого нужно переписать триггер! –
Спасибо @marc_s, но если вы проверите это, то при обновлении этой конкретной строки моя вставка имеет только одну строку. –
Тег dbms, который вы используете. Этот код не похож на ANSI SQL. – jarlh