Principales respuestas
Trigger Control de Cambios selectivo

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?
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
- Marcado como respuesta José De Alva jueves, 30 de junio de 2016 14:48
Todas las respuestas
-
¿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
-
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
- Marcado como respuesta José De Alva jueves, 30 de junio de 2016 14:48
-
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.
-
-
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