Hoy vengo a ustedes con el sig. trigger, y me gustaria saber si le dan el visto bueno, o le cambiarian algo.
Lo he probado y funciona, pero no se si lo estoy haciendo de la manera mas Optima.
Alla Vamos.
================================================== =======
El panorama es el siguiente, tengo un WebService, lo que deseo hacer, es que un usuario que tenga 3 errores seguidos (cualquier tipo de error, llamese autenticación, invocación o de funcion) se bloquee por 5 minutos.
Estos 3 errores seguidos, deben ser en un lapso menor de 3 minutos, entre cada invocación, osea que si, en menos de 1 minuto hago 3 intentos, y en los 3 obtengo error, se me bloquea, si hago 2 errores seguidos, y despues una petición exitosa se borre el historial, si hago 2 errores seguidos y espero 3 minutos y vuelvo a intenta, independiente que sea exitosa o erronea, el conteo se borre.
Para esto, cree 2 tablas, 1 de IntentosFallidos y otra de UsuarioBloqueado, en intentos fallidos, voy insertando el usuario y la hora, en que fallo, la otra tabla, ya cuando el usuario este bloqueado y la hora, lo demas lo controlo mediante codigo.
================================================== ==
el trigger que valida eso es el siguiente.
Código SQL:
Como ven? lo he probado y funciona, pero me pregunto, si estare en lo correcto o es que esta funcionando de otra manera.Ver original
DECLARE @Usuario VARCHAR(50) DECLARE @UltimoIntento datetime DECLARE @Intentos NUMERIC DECLARE @Fecha datetime SELECT @Usuario = (SELECT Usuario FROM inserted) SELECT @UltimoIntento = (SELECT TOP 1 Fecha FROM tblIntentosFallidos WHERE Usuario = @Usuario) SELECT @Fecha = (GETDATE()) IF(DATEDIFF("MI", @UltimoIntento,@Fecha) > 3) BEGIN DELETE FROM tblIntentosFallidos WHERE Usuario = @Usuario END ELSE SELECT @Intentos = (SELECT COUNT(*) FROM tblIntentosFallidos WHERE Usuario = @Usuario) IF (@Intentos = 3) BEGIN INSERT INTO tblUsuarioBloqueado VALUES (@Usuario,@Fecha) DELETE FROM tblIntentosFallidos WHERE Usuario = @Usuario END
Saludos.