Pregunta Activación de la actualización de SQL solo cuando se modifica la columna


Al observar otros ejemplos, se me ocurrió lo siguiente, pero parece que no funciona como me gustaría: quiero que solo actualice la información modificada si el QtyToRepair el valor ha sido actualizado ... pero no hace eso.

Si hago un comentario sobre dónde, entonces la información modificada se actualiza en todos los casos. Como dije, otros ejemplos me llevaron a ser optimista. Cualquier pista apreciada. Gracias.

Walter

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

74
2017-08-27 06:25


origen


Respuestas:


Tienes dos caminos para tu pregunta:

1- Usa el Comando Update en tu 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- Utilice la unión entre la tabla insertada y la tabla eliminada

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

Cuando usas el comando de actualización para la tabla SCHEDULE y establecer QtyToRepair Columna al nuevo valor, si el nuevo valor es igual al valor anterior en una o varias filas, la solución 1 actualiza todas las filas actualizadas en la tabla Programa, pero la actualización de la solución 2 solo programa las filas cuyo valor anterior no es igual al nuevo valor.


98
2017-08-27 12:10



fyi El código con el que terminé:

IF UPDATE (QtyToRepair)
    begin
        INSERT INTO tmpQtyToRepairChanges (OrderNo, PartNumber, ModifiedDate, ModifiedUser, ModifiedHost, QtyToRepairOld, QtyToRepairNew)
        SELECT S.OrderNo, S.PartNumber, GETDATE(), SUSER_NAME(), HOST_NAME(), D.QtyToRepair, I.QtyToRepair 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 I.QtyToRepair <> D.QtyToRepair
end

13
2017-08-28 02:02



Uno debería verificar si QtyToRepair se actualiza al principio.

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

11
2017-08-27 06:37



Desea hacer lo siguiente:

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

Tenga en cuenta que este activador se activará cada vez que actualice la columna, sin importar si el valor es el mismo o no.


5
2017-08-27 06:37



Tengo el pensamiento más simple concepto es siempre que un registro se haya actualizado, se borre un registro.

aquí está mi ejemplo

ALTER TRIGGER [dbo]. [UpdatePhyDate]    ON [dbo]. [M_ContractDT1]    DESPUÉS DE LA ACTUALIZACIÓN COMO EMPEZAR     - en ContarctDT1 PhyQty se actualiza     - Quiero que la fecha del sistema en Phytate se guarde automáticamente     SET NOCOUNT ON;

declare @dt1ky as int   

if(update(Phyqty))
begin
    select @dt1ky = dt1ky from deleted

    update M_ContractDT1 set PhyDate=GETDATE() where Dt1Ky=  @dt1ky     

end

FIN

Funciona bien


0
2018-05-16 09:23