none
Trigger SQL Server insertar registro si se actualiza determinado campo RRS feed

  • Pregunta

  • Buen dia tengo este trigger para insertar un registro pero solo si el campo teststatus cambia, pero aunque sean otros los campos que se actualicen me sigue insertando el registro alguien sabe porque?, la actualizacion se hace por medio de un store no se si tenga algo que ver

    create trigger trTestStatusInsertarAct on test
        after update
        as
        begin
        IF UPDATE (TestStatus)
        begin
        insert into estadoproceso
        (ID ,proceso , TestStatus ,Engineer,FirstDate)
        select ID ,proceso , TestStatus ,Engineer,GETDATE()
        from inserted
        end
        end

    jueves, 29 de junio de 2017 13:37

Respuestas

  • creo que si cambias el ultimo trozo

    SELECT ID ,proceso , TestStatus ,Engineer,GETDATE() FROM INSERTED

    por

    SELECT i.ID ,i.proceso , i.TestStatus ,i.Engineer,GETDATE() FROM INSERTED i

      inner join deleted d on i.id=i.id where i.testStatus!=d.teststatus  

    Es posible que algunas filas hayan actualizado el campo y otras no, de esta forma, solo te valen actualizaciones y excepto que te actualizen la clave primaria... creo que te funcionaría.


    Comparte lo que sepas, aprende lo que no sepas (FGG)
    portalSQL
    El rincón del DBA

    • Marcado como respuesta AlexP5 jueves, 29 de junio de 2017 16:16
    jueves, 29 de junio de 2017 15:40
    Moderador
  • Hola

    Y si comparas el valor de la misma columa en las dos tablas, para revisar que sean diferentes?

    algo asi:

    CREATE TRIGGER trTestStatusInsertarAct ON test
    AFTER UPDATE
    AS
    BEGIN
        IF (
           UPDATE (TestStatus) AND 
           (EXISTS(SELECT TestStatus FROM DELETED)) AND -- Hubo actualización.
           ((SELECT TestStatus FROM DELETED) <> (SELECT TestStatus FROM INSERTED))
           )
        BEGIN
          INSERT INTO estadoproceso
          (ID ,proceso , TestStatus ,Engineer,FirstDate)
          SELECT ID ,proceso , TestStatus ,Engineer,GETDATE()
          FROM INSERTED
        END
    END

    Saludos cordiales


    Camilo Villa


    • Editado Camilo A. Villa jueves, 29 de junio de 2017 15:36
    • Marcado como respuesta AlexP5 jueves, 29 de junio de 2017 16:16
    jueves, 29 de junio de 2017 15:36

Todas las respuestas

  • Hola AlexP5:

    Creo que una posible solución, seria hacer uso de las dos tablas que se crean virtualmente al momento de dispararse el trigger, es decir las tablas deleted (para conocer el valor anterior) e inserted (para conocer el nuevo valor), porque la función UPDATE(), se dispara siempre que la columna se halla incluido en el proceso de insercion o modificacion de la tabla, no diferencia si cambio o no su contenido.

    Luego la propuesta sería algo así:

    CREATE TRIGGER trTestStatusInsertarAct ON test
    AFTER UPDATE
    AS
    BEGIN
        IF (
           UPDATE (TestStatus) AND 
           (EXISTS (SELECT TestStatus FROM DELETED)) -- Hubo actualización.
           )
        BEGIN
          INSERT INTO estadoproceso
          (ID ,proceso , TestStatus ,Engineer,FirstDate)
          SELECT ID ,proceso , TestStatus ,Engineer,GETDATE()
          FROM INSERTED
        END
    END

    Saludos cordiales.


    Camilo Villa

    jueves, 29 de junio de 2017 14:17
  • Lo probe pero sigue insertando aunque no sea el teststatus lo que cambia
    jueves, 29 de junio de 2017 14:50
  • Hola

    Y si comparas el valor de la misma columa en las dos tablas, para revisar que sean diferentes?

    algo asi:

    CREATE TRIGGER trTestStatusInsertarAct ON test
    AFTER UPDATE
    AS
    BEGIN
        IF (
           UPDATE (TestStatus) AND 
           (EXISTS(SELECT TestStatus FROM DELETED)) AND -- Hubo actualización.
           ((SELECT TestStatus FROM DELETED) <> (SELECT TestStatus FROM INSERTED))
           )
        BEGIN
          INSERT INTO estadoproceso
          (ID ,proceso , TestStatus ,Engineer,FirstDate)
          SELECT ID ,proceso , TestStatus ,Engineer,GETDATE()
          FROM INSERTED
        END
    END

    Saludos cordiales


    Camilo Villa


    • Editado Camilo A. Villa jueves, 29 de junio de 2017 15:36
    • Marcado como respuesta AlexP5 jueves, 29 de junio de 2017 16:16
    jueves, 29 de junio de 2017 15:36
  • creo que si cambias el ultimo trozo

    SELECT ID ,proceso , TestStatus ,Engineer,GETDATE() FROM INSERTED

    por

    SELECT i.ID ,i.proceso , i.TestStatus ,i.Engineer,GETDATE() FROM INSERTED i

      inner join deleted d on i.id=i.id where i.testStatus!=d.teststatus  

    Es posible que algunas filas hayan actualizado el campo y otras no, de esta forma, solo te valen actualizaciones y excepto que te actualizen la clave primaria... creo que te funcionaría.


    Comparte lo que sepas, aprende lo que no sepas (FGG)
    portalSQL
    El rincón del DBA

    • Marcado como respuesta AlexP5 jueves, 29 de junio de 2017 16:16
    jueves, 29 de junio de 2017 15:40
    Moderador
  • gracias si funciona
    jueves, 29 de junio de 2017 16:16
  • gracias si funciona
    jueves, 29 de junio de 2017 16:17