Работы сами по себе слишком мало значат. Это всего лишь набор команд с возможностью построения логики, но пока что мы умеем выполнять работы вручную, а это идентично простому сценарию на языке Transact-SQL и выполнению его в программе Query Analyzer. Но если мы научимся доверять наши работы планировщику задач, то это уже будет что-то действительно полезное. Это уже невозможно сделать с помощью простого файла сценария.
Создание работ достаточно трудоемкий процесс, но если работа должна и будет выполняться по расписанию, то все затраты на создание самой работы и ее шагов окупятся уменьшением ваших трудозатрат на сопровождение базы данных. Вы сможете тратить свое рабочее время на более полезные задачи или заняться изучением чего-то нового. Хороший администратор это тот, который 99% рабочего времени спит, а остальное время пьет кофе :). Это является признаком того, что все работает, а администратор должен только наблюдать и вмешиваться в работу только в экстренных ситуациях. Штатные проблемы должны решаться автоматически и это можно сделать именно с помощью работ.
Планировщики, как и работы, выполняются сервисом SQL Service Agent, поэтому он должен быть запущен, желательно, чтобы он запускался автоматически после загрузки ОС.
Для добавления работы в планировщик, используется процедура sp_add_jobschedule, которая выглядит следующим образом:
sp_add_jobschedule [ @job_id = ] job_id, | [ @job_name = ] 'job_name', [ @name = ] 'name' [ , [ @enabled = ] enabled ] [ , [ @freq_type = ] freq_type ] [ , [ @freq_interval = ] freq_interval ] [ , [ @freq_subday_type = ] freq_subday_type ] [ , [ @freq_subday_interval = ] freq_subday_interval ] [ , [ @freq_relative_interval = ] freq_relative_interval ] [ , [ @freq_recurrence_factor = ] freq_recurrence_factor ] [ , [ @active_start_date = ] active_start_date ] [ , [ @active_end_date = ] active_end_date ] [ , [ @active_start_time = ] active_start_time ] [ , [ @active_end_time = ] active_end_time ]
Рассмотрим параметры процедуры:
На первый взгляд, все очень сильно накручено и разработчики немного перемудрили. Но не так страшен черт, как ад, поэтому все встанет на свои места после того, как мы рассмотрим несколько примеров создания планировщика. Но сначала необходимо дать некоторые пояснения параметра @freq_interval.
Смысл значения параметра @freq_interval зависит от @freq_type, поэтому тут требуется дополнительное пояснение:
В остальных случаях (при @freq_type равному 1, 64 или 128), значение в параметре @freq_interval не используется.
Если в параметре @freq_type указано значение 32, то в параметре @freq_relative_interval указывается в какую неделю нужно выполнять задание. Здесь могут быть следующие значения:
Теперь давайте посмотрим простой пример создания планировщика для нашей тестовой работы:
EXEC sp_add_jobschedule @job_name = 'Тестовая работа 2', @name = 'План выполнения тестовой работы', @freq_type = 4, @freq_interval = 2, @active_start_date = 20050102, @active_start_time = 020300, @active_end_time = 30300
Параметр @freq_type равен 4, значит, выполнение будет работы происходить с интервалом в дни. Параметр @freq_interval равен 2, а значит выполнение будет происходить каждые два дня. Параметр @active_start_date задает начальную дату 2 января 2005-го года, после которой задание будет активным и работа сможет выполняться.
Время выполнения с 2:03 (параметр @active_start_time). Именно в это время сервис SQL Server Agent запустит работу и она должна закончить выполнение до 3:03 (параметр @active_end_time).
EXEC sp_add_jobschedule @job_name = 'Тестовая работа 2', @name = 'План выполнения тестовой работы', @freq_type = 8, @freq_interval = 32, @freq_recurrence_factor = 2, @active_start_time = 020300
Интервал выполнения задан в неделях (параметр @freq_type равен 8) и задание будет выполняться по пятницам (@freq_interval равен 32). Так как параметр @freq_recurrence_factor равен 2, выполнение будет происходить каждые две недели в 2 часа 3 минуты.
Рассмотрим еще один пример:
EXEC sp_add_jobschedule @job_name = 'Тестовая работа 2', @name = 'План выполнения тестовой работы', @freq_type = 32, @freq_interval = 3, @freq_relative_interval = 2, @freq_recurrence_factor = 2, @active_start_time = 020300
Так как параметр @freq_type равен 32, то значение 3 в параметре @freq_interval указывает на то, что задание будет выполняться по вторникам. Параметр @freq_relative_interval со значением 2 означает, что выполнение будет во вторую неделю. Параметр @freq_recurrence_factor означает выполнение через каждые два месяца.
У одной работы может быть несколько планировщиков, например, один выполняет работу каждый понедельник, а другой планировщик 1-го числа каждого месяца. Одним планировщиком такое реализовать невозможно, а вот с помощью двух, достаточно просто.
Для обновления планировщика используется процедура sp_update_jobschedule, которая выглядит следующим образом:
sp_update_jobschedule [@job_id =] job_id, | [@job_name =] 'job_name', [@name =] 'name' [, [@new_name =] 'new_name'] [, [@enabled =] enabled] [, [@freq_type =] freq_type] [, [@freq_interval =] freq_interval] [, [@freq_subday_type =] freq_subday_type] [, [@freq_subday_interval =] freq_subday_interval] [, [@freq_relative_interval =] freq_relative_interval] [, [@freq_recurrence_factor =] freq_recurrence_factor] [, [@active_start_date =] active_start_date] [, [@active_end_date =] active_end_date] [, [@active_start_time =] active_start_time] [, [@active_end_time =] active_end_time]
С помощью параметров @job_id или @job_name процедура определяет работу, планировщик которой нужно изменить, а с помощью параметра @name задается обновляемый планировщик. Остальные параметры такие же, как и у процедуры создания. Пример использования:
EXEC sp_update_jobschedule @job_name = 'Тестовая работа 2', @name = 'План выполнения тестовой работы', @freq_type = 32, @freq_interval = 4, @freq_relative_interval = 1, @freq_recurrence_factor = 3, @active_start_time = 043000
Для удаления планировщика используется процедура sp_delete_jobschedule, которой нужно передать в параметре @job_id или @job_name работу, планировщик которой нужно удалить, а с помощью параметра @name задается удаляемый планировщик.
Пример использования:
EXEC sp_delete_jobschedule @job_name = 'Тестовая работа 2', @name = 'План выполнения тестовой работы',
Для получения информации о планировщиках используется процедура EXEC sp_help_jobschedule, которая выглядит следующим образом:
sp_help_jobschedule [ @job_id =] job_id | [ @job_name = ] 'job_name' [ , [ @schedule_name = ] 'schedule_name' ] | [ , [ @schedule_id = ] schedule_id ]
С помощью параметров @job_id или @job_name мы указываем работу, информацию о планировщиках которого мы хотим получить. С помощью параметров @schedule_name или @schedule_id можно указать конкретный планировщик. Если планировщик не указан, а только работа, то будут показаны все планировщики для данной работы.