Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Déclencheur de mise à jour SQL uniquement lorsque la colonne est modifiée

Vous avez deux possibilités pour votre question :

1- Utilisez la commande de mise à jour dans votre déclencheur.

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- Utilisez la jointure entre la table insérée et la table supprimée

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

Lorsque vous utilisez la commande de mise à jour pour la table SCHEDULE et définissez QtyToRepair Colonne vers la nouvelle valeur, si la nouvelle valeur est égale à l'ancienne valeur sur une ou plusieurs lignes, la solution 1 met à jour toutes les lignes mises à jour dans la table de planification, mais la solution 2 ne met à jour que les lignes de planification dont l'ancienne valeur n'est pas égale à la nouvelle valeur.