Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

SQL-Aktualisierungsauslöser nur, wenn Spalte geändert wird

Sie haben zwei Möglichkeiten für Ihre Frage:

1- Verwenden Sie den Update-Befehl in Ihrem Trigger.

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- Verwenden Sie Join zwischen eingefügter Tabelle und gelöschter Tabelle

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

Wenn Sie den Aktualisierungsbefehl für die Tabelle SCHEDULE verwenden und QtyToRepair festlegen Spalte auf neuen Wert, wenn der neue Wert gleich dem alten Wert in einer oder mehreren Zeilen ist, aktualisiert Lösung 1 alle aktualisierten Zeilen in der Zeitplantabelle, aber Lösung 2 aktualisiert nur die Zeitplanzeilen, deren alter Wert ungleich dem neuen Wert ist.