Правильный способ отключить / включить задания агента SQLServer - PullRequest
8 голосов
/ 23 марта 2011

У меня есть несколько запланированных заданий агента SQLServer, одно из которых выполняет полное резервное копирование базы данных. Я хочу отключить некоторые другие задания, когда начнется резервное копирование, и повторно включить их, как только будет выполнено резервное копирование. Какой правильный способ сделать это? Я думал о добавлении одной из следующих команд tsql к первому шагу задачи резервного копирования (и соответствующих команд включения к последнему шагу), но я не могу найти, какая из них лучше (или, возможно, есть другой способ).

UPDATE MSDB.dbo.sysjobs
SET Enabled = 0
WHERE [Name] IN (....)

Или число EXEC dbo.sp_update_job?
Спасибо.

Ответы [ 6 ]

6 голосов
/ 23 марта 2011

Определенно используйте sp_update_job.Если задание уже запланировано , то манипулирование таблицей sysjobs напрямую не обязательно приведет к пересчету кэшированного расписания.

Это может работать для флага ENABLED (не имеетпробовал), но я точно знаю, что не работает для таких столбцов, как start_step_id.

4 голосов
/ 23 марта 2011

Вам придется запустить EXEC dbo.sp_update_job, потому что вы не можете обновить системные таблицы напрямую (, хотя я не уверен, что sysjobs по-прежнему считается системной таблицей Митч говорит, что это можно обновить)

Я бы рассмотрел использование sp_getapplock и sp_releaseapplock для "блокировки" других заданий без фактического обновления заданий.

2 голосов
/ 23 марта 2011

Я бы использовал sp_update_job, поскольку он инкапсулирует поддерживаемую часть логики многократного использования.Зачем заново изобретать колесо.

http://msdn.microsoft.com/en-us/library/ms188745.aspx

1 голос
/ 16 марта 2012

Агент SQL кэширует включенный статус заданий.Поэтому, если вы просто обновите таблицу sysjobs, это фактически не помешает запуску расписания по расписанию.Хранимая процедура sp_update_job запускает обновление кэша, поэтому я рекомендую вам использовать это.

Если вы все еще хотите вручную установить значение в sysjobs, вам нужно запустить sp_sqlagent_notify, чтобы фактически получить агент sqlобновление - это кэш включенного состояния.Просто посмотрите на код sp_update_job для точных параметров, которые вам нужны.

1 голос
/ 23 марта 2011

Я не вижу ничего плохого в предложенном вами подходе. Вы также можете манипулировать с помощью категории работы:

UPDATE j
SET j.Enabled = 0
FROM MSDB.dbo.sysjobs j
INNER JOIN MSDB.dbo.syscategories c ON j.category_id = c.category_id
WHERE c.[Name] = 'Database Maintenance';

Я не профилировал это, но подозреваю

USE msdb ;
GO

EXEC dbo.sp_update_job
    @job_name = N'SomeJob',
    @enabled = 0;
GO

Будет генерировать тот же код, но встроенные проки, как правило, подходят для этого.

0 голосов
/ 23 марта 2011

Другой подход заключается в добавлении шага в начале других ваших заданий, который проверяет состояние задания резервного копирования, а затем либо прерывает, либо переводит в спящий режим текущее задание, если выполняется резервное копирование.

Мы имееминогда делайте это в обоих направлениях, зависит от того, насколько надежны / критичны различные задания, какая из них работает лучше.

...