none
Trigger Control de Cambios selectivo RRS feed

  • Pregunta

  • Amigos muy buen día, tengo un necesaidad sobre un trigger de control, el caso es el siguiente:

    Tengo una tabla del tipo:

    SECUENCIAL NOMBRE CODIGO PORCENTAJE FECHAVIGENCIA REGISTROACTIVO
    1 juan 123 10 01/10/2015 0
    2 juan 123 15 01/03/2016 1
    3 tomas 456 10 01/08/2015 0
    4 tomas 456 20 01/11/2015 0
    5 tomas 456 35 01/05/2015 1

    Como pueden ver es una tabla dodne guardo los cambios historicos por usabilidad, pero solo son registros vigentes los que tienen RegistroActivo =1

    tengo un trigger de control el cual al realizar una modificacion sobre el registro que tiene el 1, lo pone en 0e inserta uno nuevo con registro activo 1 y asi se va manteniendo el historico de cambios (solo el campo por centaje) ahora el trigger funciona bien si en el where del update le mando el "secuencial" en este caso 2 o 5 pero si por algun motivo le mando en ese where el codigo de la persona pues el trigger hace una inserción por cada registro que tenga y asi me aparcen varios registros repetidos y con registro activo 1, como podria hacer un buen trigger para evitar esto?

    viernes, 24 de junio de 2016 15:47

Respuestas

  • Hola:

    Tengo una ligera sospecha que no usas las tablas INSERTED y DELETED que se generan en los triggers, hace algunos meses hice un artículos sobre dichas tablas que te pueden servir para reealizar dichas acciones de control, de esta manera puedes saber que fila se modifico, para establecerla a 0 e ingresar una nueva fila a tu tabla de control.

    TABLAS INSERTED, DELETED EN TRIGGERS

    SALUDOS


    SERGIO SANCHEZ ARIAS
    facebook twitter blogger google

    • Marcado como respuesta José De Alva jueves, 30 de junio de 2016 14:48
    viernes, 24 de junio de 2016 16:04

Todas las respuestas

  • Bpotro82,

    ¿El trigger actualiza y luego inserta o sólo inserta a razón de una actualización? ¿Por qué un trigger? Ambos procesos los deberías tener desacoplados, ¿de donde obtienes los datos para la inserción?

    Avanzando, la condición para la actualización debería basarse en el campo [NOMBRE] pero deberías reforzar la condición para que sólo actualice la fila que esté activa.

    UPDATE MiTabla
    SET
            REGISTROACTIVO = 0
    WHERE
            (NOMBRE = 'juan') AND (REGISTROACTIVO = 1);

    De esa forma la actualización sólo impactará sobre una fila

    viernes, 24 de junio de 2016 15:58
  • Hola:

    Tengo una ligera sospecha que no usas las tablas INSERTED y DELETED que se generan en los triggers, hace algunos meses hice un artículos sobre dichas tablas que te pueden servir para reealizar dichas acciones de control, de esta manera puedes saber que fila se modifico, para establecerla a 0 e ingresar una nueva fila a tu tabla de control.

    TABLAS INSERTED, DELETED EN TRIGGERS

    SALUDOS


    SERGIO SANCHEZ ARIAS
    facebook twitter blogger google

    • Marcado como respuesta José De Alva jueves, 30 de junio de 2016 14:48
    viernes, 24 de junio de 2016 16:04
  • Muchas gracias las revisare, y en el trigger si uso esas tablas, hago el update a registro activo =0 al que estaba vigente y luego inseto un registro con los cambios y registro activo =1 desde inserted, supuestamente lo tenia resuleto ya que para cada actualizacion lo mandaba en la condicion con REgistroActivo=1 como dijo Williams, pero el problema es qe si alguien puede hacer un simple update sin esa restriccion entonces se me inflara y desfazará todo el historico.
    viernes, 24 de junio de 2016 16:28
  • Bpotro82,

    ¿Podrías mostrar el (o los) trigger(s) de inserción/actualización?

    viernes, 24 de junio de 2016 16:44
  • SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    ALTER TRIGGER [PagoCC].[TR_VigenciaTitular] ON [PagoCC].[HabilitacionTitularPagoCC]
    WITH EXECUTE AS CALLER
    INSTEAD OF UPDATE
    AS
    BEGIN
    
        declare @insertado bigint
        declare @anterior bigint
        select @anterior=IdHabilitacionTitularCC from deleted
        
        /*DAMOS DE BAJA EL REGISTRO ANTERIOR*/
        update PagoCC.HabilitacionTitularPagoCC 
            set FechaFinVigencia=DATEADD(d,-1,getdate()),RegistroActivo=0 
        from PagoCC.HabilitacionTitularPagoCC a
            inner join deleted d on d.NUP = a.NUP and d.NumeroCertificado = a.NumeroCertificado and d.IdBeneficioOtorgado=a.IdBeneficioOtorgado
        where a.RegistroActivo=1
        
        /*INSERTAMOS UN NUEVO REGISTRO CON LOS CAMBIOS*/
        insert into PagoCC.HabilitacionTitularPagoCC
            (IdGrupoBeneficio,IdBeneficioOtorgado,NumeroCertificado,NUP,PeriodoSolicitud,FechaSolicitud,NumeroSolicitud,
            TipoCambio1 ,MontoOriginal ,SalarioBase ,TipoCambio2 ,IdTipoAjuste ,PorcentajeAjuste,AniosInsalubres,MontoAjustado,IdEstadoBeneficio,
    		FraccionComplementaria,IdTipoPlanilla ,IdTipoPension,FechaInicioVigencia ,FechaFinVigencia ,RegistroActivo,IdEntidadPagadora )
        select IdGrupoBeneficio,IdBeneficioOtorgado,NumeroCertificado,NUP,PeriodoSolicitud,FechaSolicitud,NumeroSolicitud,
            TipoCambio1 ,MontoOriginal ,SalarioBase ,TipoCambio2 ,IdTipoAjuste ,PorcentajeAjuste,AniosInsalubres,MontoAjustado,IdEstadoBeneficio,
    		FraccionComplementaria,IdTipoPlanilla, IdTipoPension,getdate() ,null ,1,IdEntidadPagadora
        from inserted
        
        /*ACTUALIZAMOS LA REFERENCIA DE VINCULACION CON LOS NUEVOS IdHabTit*/
        update PagoCC.HabilitacionDerechohabientePagoCC
        set IdHabilitacionTitularCC=b.IdHabilitacionTitularCC
        from PagoCC.HabilitacionDerechohabientePagoCC a inner join PagoCC.HabilitacionTitularPagoCC b
        on a.NUPAsegurado=b.NUP and a.IdBeneficioOtorgado=b.IdBeneficioOtorgado and a.RegistroActivo=1 and b.RegistroActivo=1
        inner join deleted d on b.NUP=d.NUP and b.IdBeneficioOtorgado=d.IdBeneficioOtorgado and b.NumeroCertificado=d.NumeroCertificado
    
    END
    SET ANSI_NULLS ON

    ahi les mando el completo
    viernes, 24 de junio de 2016 19:09