良い日私はSQLに情報を格納する外部プログラムを持っています。そのテーブルのいくつかのフィールドが変更されたときにテーブルを更新するトリガーを実行しようとしています。SQL Trigger To Update
だから私はufAPCHANG1EAMNT
、ufAPHANGE2AMNT
とufAPCHANGE3AMNT
変化に毎回値のいずれかを更新する必要がある1列Contractual Amount
を持っています。
人はこれらの値のいずれかまたはすべてを変更することができ、+ 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ありがとうございますが、これは特定の行を更新するときにチェックすると、挿入された行が1行しかありません。 –
使用しているdbmsにタグを付けます。そのコードはANSI SQLのようには見えません。 – jarlh