美好的一天我有一個外部的程序存儲SQL中的信息,我試圖做一個觸發器,當表中的某些字段發生更改時更新表。SQL觸發器更新
因此,我有一列Contractual Amount
應該每更新一次ufAPCHANG1EAMNT
,ufAPHANGE2AMNT
和的任何值更改。
一個人可以更改這些值中的一個或全部,並且可以是+ 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
你的觸發器有** **主要中的缺陷,你似乎認爲它會被稱爲**每排一次* * - 事實並非如此。觸發器將在每個語句**中觸發一次**,所以如果你的UPDATE語句影響了25行,你將觸發**觸發**一次,但是,然後「插入」和「刪除」將分別包含25行。您的代碼在這25行中選擇哪一個? 'SELECT ..... FROM Inserted' - 這是非確定性的。你需要重寫你的觸發器來考慮這個問題! –
謝謝@marc_s,但如果您檢查這是更新該特定行時,我插入只有一行。 –
標記您正在使用的dbms。該代碼看起來不像ANSI SQL。 – jarlh