Es necesario en ciertas ocasiones, tener que auditar ciertos jobs sabiendo que su ejecución es crucial y no debe demorarse mas de cierto tiempo.
Para estos casos, si el mismo se encuentra ejecutando alguna rutina rara, o esta lockeado por otro proceso y nosotros no estamos chequeando los mismos por estar fuera de la oficina, es necesario contar con un control en backgroud que nos ayude a mantener las cosas en orden.
Este Stored Procedure, generado en la base Master por cuestiones de comodidad, sirve para determinar si todo esta Ok o no.
Si el mismo devuelve 1, esta todo dentro del tiempo estipulado en las siguientes variables:
@Minutes_FROM_LAST_DURATION = 40
@Minutes_FROM_LAST_START = 90
Es decir, dicho proceso no puede exceder su ejecución en mas de 40 minutos, y ademas, no puede pasar mas 1 hora 30 minutos desde su ultima ejecución exitosa.
En caso de que dicho Job finalice con error, dispondremos de otro sensor que audite dicho estado para su posterior informe.
El script del mismo es el siguiente.
CREATE PROC DBA_ChecheaDelayConsolidacion @JobName NVARCHAR(4000) AS DECLARE @Minutes_FROM_LAST_START SMALLINT DECLARE @Minutes_FROM_LAST_DURATION SMALLINT DECLARE @LastRunTime DATETIME DECLARE @StartTime AS DATETIME DECLARE @Duration AS DATETIME DECLARE @Duration_MINUTES AS INT DECLARE @EndExecution AS DATETIME ---------------------------------------- SET @Minutes_FROM_LAST_START = 90 SET @Minutes_FROM_LAST_DURATION = 40 ---------------------------------------- SELECT @StartTime = CAST(CONVERT(CHAR(10), CAST(STR(JH.run_date,8, 0) AS DATETIME), 112) + ' ' + STUFF(STUFF(RIGHT('000000' + CAST(JH.run_time AS VARCHAR(6)) ,6),5,0,':'),3,0,':') AS DATETIME), @Duration = CAST(STUFF(STUFF(RIGHT('000000' + CAST(JH.run_duration AS VARCHAR(6)),6),5,0,':'),3,0,':') AS DATETIME), @EndExecution = CAST(CONVERT(CHAR(10), CAST(STR(JH.run_date,8, 0) AS DATETIME), 112) + ' ' + STUFF(STUFF(RIGHT('000000' + CAST(JH.run_time AS VARCHAR(6)) ,6),5,0,':'),3,0,':') AS DATETIME) + CAST(STUFF(STUFF(RIGHT('000000' + CAST(JH.run_duration AS VARCHAR(6)),6),5,0,':'),3,0,':') AS DATETIME) FROM msdb.dbo.sysjobs J INNER JOIN msdb.dbo.sysjobhistory JH ON J.job_id = JH.job_id WHERE J.name = @JobName AND Jh.step_id = 0 AND JH.run_status = 1 /* SELECT @StartTime AS StartTime, @Duration AS Duration, @EndExecution AS EndExecution SELECT DATEDIFF(MINUTE, @EndExecution, GETDATE()) AS Diferencia SELECT @EndExecution AS EndExecution SELECT GETDATE() */ SELECT @Duration_MINUTES = DATEPART(HOUR,@Duration) * 60 + DATEPART(MINUTE,@Duration) IF DATEDIFF(MINUTE, @EndExecution, GETDATE()) > @Minutes_FROM_LAST_START OR @Duration_MINUTES>@Minutes_FROM_LAST_DURATION BEGIN PRINT 'Proceso Demorado en mas de 1 hora...' SELECT 1/0 AS 'Error Forzado' END ELSE BEGIN PRINT 'Proceso en Tiempo OK !!!' SELECT 1 END END
Nuestra ejecución seria de esta forma
EXEC master.dbo.DBA_ChecheaDelayJob @JobName = 'Nombre_Job'