2016-11-17 60 views
3

レコードが別のテーブルで更新されたときにnullレコードを更新する更新トリガーがあります。私の問題は、データがグリッドビューにあることです。更新すると、更新されたレコードだけでなく、グリッド内のすべてのレコードの更新クエリが実行されます。だからトリガーが発生すると、それは一致するターゲットテーブル内のすべての行を更新しますが、データが変更されたものだけを更新したいだけです。ここに私の引き金があります。更新データが変更された場合のみ更新をトリガーする

ALTER TRIGGER [dbo].[Trigger_update_DeSchedule] ON [dbo].[tBatchDetails] 
    After UPDATE ,INSERT 
AS  

BEGIN 
SET NOCOUNT ON 
    DECLARE @BatchId int 
      , @Ethanol varchar(10) 
      , @Glucose varchar(10) 
      , @SampleAge varchar(10); 

    SELECT @BatchId = B.[BatchID] 
     ,@Ethanol = [Ethanol] 
     ,@Glucose= [Glucose] 
     ,@SampleAge = SA.SampleAge 
    from INSERTED bd 
     INNER JOIN [dbo].[tSampleAge] sa ON SA.SampleAgeID = BD.SampleAge 
     INNER JOIN [dbo].[tBatch] b ON B.ID =BD.ID 

    UPDATE [dbo].[DeSchedule] 
    SET [Ethanol] = @Ethanol 
     , [Glucose] = @Glucose 
     , [SampleCompleted] = 1 
    WHERE [BatchID] = @BatchId 
     AND [SampleAge] = @SampleAge 
     AND SiteID = 6 
     AND SampleCompleted IS NULL 

END 

このトリガーでは、データが変更されたレコードのみをどのように更新できますか?

+0

(https://technet.microsoft.com/en-us/library/ms175521(V = SQL.105)の.aspx)**トリガ代わり-の**見を有する試し] –

答えて

0

これはコメントには長すぎます。

まず、挿入トリガーと更新トリガーを分けてください。それらを1回のトリガで行うと、ほとんど常に問題が発生します。それは確かにあなたにここで問題を引き起こすつもりです。あなたが投稿したコードは、あなたが挿入するときに探しているものを行うべきです。

ただし、更新するときに、削除する結合を追加する必要があります。次に、基本表の各列の述部を追加する必要があります。実際の値が変更されたかどうかを知る唯一の方法は、挿入された値と削除された値を比較することです。このような

何か:

i.ColA <> d.ColA 
OR i.ColB <> d.ColB 
etc... 

一部は、UPDATE機能を使用することを言うかもしれませんが、これはあなたのために動作しません。列が更新される値のリストにある場合はtrueを返します。値が以前と同じかどうかは気にしません。

現在のトリガーはスカラー値を使用しています。これは、操作ごとにトリガーが1回発生するため、適切な方法ではありません。あなたのコードは、ベースに基づいて設定する必要があります。

0

更新ステートメントの各行ではなく、各Updateステートメントごとにトリガが発生します。複数の行を更新する更新がある場合、トリガ内の変数を使用するとデータが失敗/破損します。

ALTER TRIGGER [dbo].[Trigger_update_DeSchedule] ON [dbo].[tBatchDetails] 
    After UPDATE ,INSERT 
AS  

BEGIN 
SET NOCOUNT ON 

    -- Correct the Alias in the set clause I am not sure what is coming from where 
    UPDATE S      
    SET S.[Ethanol] = [Ethanol] 
     , S.[Glucose] = [Glucose] 
     , S.[SampleCompleted] = 1 
    from INSERTED bd 
     INNER JOIN [dbo].[tSampleAge] sa ON SA.SampleAgeID = BD.SampleAge 
     INNER JOIN [dbo].[tBatch]  b ON B.ID =BD.ID 
     INNER JOIN [dbo].[DeSchedule] s ON s.[BatchID] = B.[BatchID] 
             AND s.[SampleAge] = BD.SampleAge 
    WHERE SiteID = 6 
     AND SampleCompleted IS NULL 

END 
+0

レコードを更新しようとしているテーブルがDeSCheduleに参加するのはなぜですか? – llerdal

+1

@llerdal google '結合による更新のためのSQL Serverの構文' Thanks –

+0

更新しているテーブルへのJOINのため、更新が簡単になります。 –

関連する問題