SQL Server — TSQL для обнаружения пропущенных заданий агента из-за переполнения

Я пытаюсь разработать TSQL, чтобы определить, не превысило ли задание задание и не пропустило ли его следующее расписание.

Сценарий: Задание запланировано для запуска каждый час (может быть включено более одного расписания), но по какой-то причине, например из-за сетевых задержек, задание перестает выполняться через 10 минут и теперь выполняется в течение 90 минут, поэтому отсутствует его почасовой запуск.

Существует таблица с именем msdb.dbo.sysjobactivity, в которой есть столбец с именем next_scheduled_run_date, но эта дата обновляется только после завершения текущего задания. Это то же поведение, что и монитор активности заданий, дата следующего запуска обновляется только после завершения текущего задания.

msdb.dbo.sysjobactivity обновляется в соответствии с подробностями в: https://dba.stackexchange.com/questions/22644/how-and-when-does-sql-agent-update-next-run-значениядаты-следующего-времени-выполнения

Вопрос. Как рассчитать следующий запланированный запуск задания на основе текущего времени запуска задания во время его выполнения. Может быть назначено более одного расписания.

Любые указатели приветствуются.


person user3329538    schedule 25.02.2016    source источник


Ответы (1)


Это сложно. Во-первых, ссылка на stackexchange, которую вы включили, превосходна. Я следовал этому, а также делал свой собственный след. Приведенный ниже код направит вас в правильном направлении. Возможно, вам придется провести подробное тестирование, я обнаружил, что у меня были некоторые проблемы со временем, когда ответ был в ту же минуту, но секунды немного отставали. Вы, конечно, можете изменить это по мере необходимости.

вот первый черновик кода, который должен указать вам правильное направление

declare @jobname [sysname] = 'Check'
Select   
     nextOne = min(
        case freq_subday_type 
            when 8 then dateadd(hour  , (Datediff(hour  , [dbo].[agent_datetime](sjs.next_run_date, sjs.next_run_time), getdate())/freq_subday_interval + 1) * freq_subday_interval, [dbo].[agent_datetime](sjs.next_run_date, sjs.next_run_time))
            when 4 then dateadd(minute, (Datediff(minute, [dbo].[agent_datetime](sjs.next_run_date, sjs.next_run_time), getdate())/freq_subday_interval + 1) * freq_subday_interval, [dbo].[agent_datetime](sjs.next_run_date, sjs.next_run_time))
            when 2 then dateadd(second, (Datediff(minute, [dbo].[agent_datetime](sjs.next_run_date, sjs.next_run_time), getdate())/freq_subday_interval + 1) * freq_subday_interval, [dbo].[agent_datetime](sjs.next_run_date, sjs.next_run_time))
        end)
FROM msdb.[dbo].[sysschedules] ss
inner join msdb.[dbo].[sysjobschedules] sjs on ss.schedule_id = sjs.schedule_id
inner join msdb.[dbo].[sysjobs] sj on sjs.job_id = sj.job_id
where sj.Name = @jobname  and ss.enabled = 1
person cameront    schedule 26.02.2016