2016-10-07 3 views
1

Мне нужно отключить все задания, выполняемые на сервере. Я побежал следующий код:Задания агента SQL Server работают, хотя я отключил расписание в сценарии

declare @t table (schedule_id int, [name] varchar(300)) 

    update msdb.dbo.sysschedules 
      set enabled = 0 
    output inserted.schedule_id, inserted.name into @t 
    from msdb.dbo.sysjobs j 


    join msdb.dbo.sysjobschedules js 
    on j.job_id = js.job_id 
    join msdb.dbo.sysschedules s 
    on js.schedule_id = s.schedule_id 
    where j.[name] not like 'DB -%' and j.[name] not like 'sys%' and j.[name] not like 'Maintenance%' 

    select * from @t 

Когда я проверяю данную работу и связанное с ним расписание, либо из графического интерфейса агента SQL или через SQL, я могу видеть график отключен. Тем не менее, задания все еще работают, и я могу видеть даты следующего запуска в будущем, если я проверю msdb.dbo.sysjobschedules.

Единственные вещи, которые я видел в Интернете, показывают, что есть фоновый поток, который необходимо обновить, чтобы поднять это изменение? И для этого мне нужно запустить sp_sqlagent_refresh_job (не помогло) или перезапустить сервер.

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

ответ

1

Почему вы беспокоитесь о графиках? Используйте sp_update_job с динамическим SQL отключить все задания:

DECLARE @sql nvarchar(max) 

;WITH cte AS (
SELECT j.job_id, 
     j.[name] 
FROM msdb.dbo.sysjobs j 
WHERE j.[name] not like 'DB -%' 
    and j.[name] not like 'sys%' 
    and j.[name] not like 'Maintenance%' 
) 

SELECT @sql = (
    SELECT 'EXEC msdb.dbo.sp_update_job @job_id = '''+CAST(job_id as nvarchar(max))+''', @enabled = 0;'+CHAR(10) 
    FROM cte 
    FOR XML PATH('') 
) 

EXEC sp_executesql @sql 

Если вы PRINT @sql до того EXEC вы увидите сгенерированный запрос:

EXEC msdb.dbo.sp_update_job @job_id = 'CCCF8FC0-FCD4-4260-9A48-518AF5826297', @enabled = 0; 
EXEC msdb.dbo.sp_update_job @job_id = '48BB41E6-6BEC-452B-8D42-760AECDBB808', @enabled = 0; 

Если вам нужно остановить работы использовать sp_stop_job.

+0

Это хорошее решение, спасибо. Мне в основном интересно, что я пропустил, что приводит к тому, что графики продолжают работать. Интересно, удалил ли я следующую дату выполнения из msdb.dbo.sysjobschedules, что бы это сделать? – Quicksilver

+0

Вы были на правильном пути, есть одна заметка об этой таблице: она обновляется каждые 20 минут. Поэтому, если вы отключили расписания в sysschedules, sysjobschedules будут обновляться через следующие 20 минут, поэтому вы не сможете сразу увидеть изменения расписаний работы. – gofr1

+0

И даже если вы отключите расписания, будут запускаться задания, начатые ранее. Чтобы остановить их, используйте sp_stop_job. – gofr1