Estoy corrigiendo defectos de una aplicación y uno de los que me reportaron me ha dado muchos dolores de cabeza.
Es una aplicación web y cuando un usuario realiza cierta operación que debe generar un registro en una tabla, se generan 2 o 3 entradas duplicadas, con 100 milisegundos de diferencia, lo se por que tengo una columna con un getdate al insertar, además de que queda con diferente id
Tratando de corregir el problema puse una llave compuesta por 4 campos, pero no funciona por la diferencia en milisengundos de la fecha de inserción, y el problema continuaba generando inconsistencias serias en la aplicacion.
Mi solución un trigger, tomo los campos con los que cotrolo la inserción duplicada y dado el caso si se halla duplicado hago un rollback. Asi:
ALTER TRIGGER SOL_REPETIDAS
on Solicitud_vac
AFTER INSERT
AS
BEGIN
-- SET NOCOUNT ON
SET NOCOUNT ON;
DECLARE @fecha_in datetime
DECLaRE @usu_crea varchar(20)
DECLARE @fecha_inicio datetime
declare @sol_id int
select @sol_id=sol_id, @fecha_in = Sol_Fecha, @usu_crea=Sol_Usu_Crea, @fecha_inicio=Sol_Fecha_Ini from inserted
print @fecha_in
--Condicion para determinar un registro similar en la tabla
if((select count( sol_id) from solicitud_vac where DATEDIFF(mi,sol_fecha,@fecha_in) < 4 and sol_usu_crea=@usu_crea and Sol_Fecha_Ini=@fecha_inicio and sol_id <>@sol_id) >0 )
ROLLBACK /*Si se encontraron registros similares se hace un rollback, que echa atras la transaccion, incluyendo el insert, update o delete que lanzo el trigger*/
END
Otra arma en nuestra linea de batalla para evitar inconsistencias.
Bye