1. ホーム
  2. sql

[解決済み] カラムが変更されたときのみSQL更新トリガがかかる

2022-10-21 14:52:32

質問

他の例を見て、以下のような方法を思いついたのですが、どうも思い通りにいきません。私はそれが唯一の QtyToRepair の値が更新された場合のみ、変更された情報を更新するようにしたいのですが......そうなっていません。

もし私が where をコメントアウトすれば、変更された情報はすべてのケースで更新されます。私が言ったように他の例は、私が楽観的であることを導いた。何か手がかりがあれば幸いです。ありがとうございます。

ウォルター

ALTER TRIGGER [dbo].[tr_SCHEDULE_Modified]
   ON [dbo].[SCHEDULE]
   AFTER UPDATE
AS 
BEGIN
    SET NOCOUNT ON;

    UPDATE SCHEDULE SET modified = GETDATE()
        , ModifiedUser = SUSER_NAME()
        , ModifiedHost = HOST_NAME()
    FROM SCHEDULE S
    INNER JOIN Inserted I on S.OrderNo = I.OrderNo and S.PartNumber = I.PartNumber
    WHERE S.QtyToRepair <> I.QtyToRepair
END

どのように解決するのですか?

あなたの質問のための2つの方法がある。

1- トリガーで更新コマンドを使用する。

ALTER TRIGGER [dbo].[tr_SCHEDULE_Modified]
   ON [dbo].[SCHEDULE]
   AFTER UPDATE
AS BEGIN
    SET NOCOUNT ON;
    IF UPDATE (QtyToRepair) 
    BEGIN
        UPDATE SCHEDULE 
        SET modified = GETDATE()
           , ModifiedUser = SUSER_NAME()
           , ModifiedHost = HOST_NAME()
        FROM SCHEDULE S INNER JOIN Inserted I 
        ON S.OrderNo = I.OrderNo and S.PartNumber = I.PartNumber
        WHERE S.QtyToRepair <> I.QtyToRepair
    END 
END

2- 挿入されたテーブルと削除されたテーブルの間のJoinを使用する

ALTER TRIGGER [dbo].[tr_SCHEDULE_Modified]
   ON [dbo].[SCHEDULE]
   AFTER UPDATE
AS BEGIN
    SET NOCOUNT ON;    

    UPDATE SCHEDULE 
    SET modified = GETDATE()
       , ModifiedUser = SUSER_NAME()
       , ModifiedHost = HOST_NAME()
    FROM SCHEDULE S 
    INNER JOIN Inserted I ON S.OrderNo = I.OrderNo and S.PartNumber = I.PartNumber
    INNER JOIN Deleted D ON S.OrderNo = D.OrderNo and S.PartNumber = D.PartNumber                  
    WHERE S.QtyToRepair <> I.QtyToRepair
    AND D.QtyToRepair <> I.QtyToRepair
END

テーブルのupdateコマンドを使用する場合 SCHEDULE とセットで QtyToRepair 列を新しい値に、新しい値が1つまたは複数の行で古い値と等しい場合、ソリューション1は、スケジュールテーブル内のすべての更新された行を更新しますが、ソリューション2は、古い値が新しい値と等しくないことをスケジュール行のみを更新します。