В качестве администратора SQL Server вы отвечаете за управление и поддержку различных задач и процессов в вашей среде SQL Server. Одной из ключевых компонентов SQL Server является SQL Server Agent, который позволяет вам планировать и автоматизировать выполнение заданий в определенное время или с определенным интервалом.
Однако информация о расписании, предоставляемая SQL Server Agent по умолчанию, может быть сложной для интерпретации и понимания, особенно когда вам необходимо предоставить эту информацию аудиторам или другим заинтересованным сторонам. В этой статье мы рассмотрим, как вы можете легко преобразовать внутренние расписания для заданий SQL Agent в более понятный формат для людей.
В настоящее время расписания заданий SQL Agent представлены с использованием числовых значений, которые могут быть непонятными для людей. Чтобы нам было легче понять расписания, было бы полезно иметь таблицу перевода, которая сопоставляет эти числовые значения с более понятными описаниями. К сожалению, SQL Server не предоставляет такую таблицу перевода по умолчанию.
Однако с помощью простого скрипта мы можем получить расписания заданий SQL Agent из экземпляра MSDB и преобразовать числовые значения в понятные описания. Вот пример скрипта:
USE msdb;
GO
DECLARE @weekDay TABLE
(
mask INT,
maskValue VARCHAR(32)
);
INSERT INTO @weekDay
SELECT 1, 'Воскресенье'
UNION ALL
SELECT 2, 'Понедельник'
UNION ALL
SELECT 4, 'Вторник'
UNION ALL
SELECT 8, 'Среда'
UNION ALL
SELECT 16, 'Четверг'
UNION ALL
SELECT 32, 'Пятница'
UNION ALL
SELECT 64, 'Суббота';
WITH myCTE AS (
SELECT
sched.name AS 'scheduleName',
sched.enabled AS SchedEnabled,
sched.schedule_id,
jobsched.job_id,
CASE
WHEN sched.freq_type = 1 THEN 'Один раз'
WHEN sched.freq_type = 4 AND sched.freq_interval = 1 THEN 'Ежедневно'
WHEN sched.freq_type = 4 THEN 'Каждые ' + CAST(sched.freq_interval AS VARCHAR(5)) + ' дней'
WHEN sched.freq_type = 8 THEN REPLACE(REPLACE(REPLACE((
SELECT maskValue
FROM @weekDay AS x
WHERE sched.freq_interval & x.mask <> 0
ORDER BY mask
FOR XML RAW
), '"/>
', '') +
CASE
WHEN sched.freq_recurrence_factor <> 0 AND sched.freq_recurrence_factor = 1 THEN '; еженедельно'
WHEN sched.freq_recurrence_factor <> 0 THEN '; каждые ' + CAST(sched.freq_recurrence_factor AS VARCHAR(10)) + ' недели'
END
WHEN sched.freq_type = 16 THEN 'В день ' + CAST(sched.freq_interval AS VARCHAR(10)) + ' каждые ' + CAST(sched.freq_recurrence_factor AS VARCHAR(10)) + ' месяцев'
WHEN sched.freq_type = 32 THEN
CASE
WHEN sched.freq_relative_interval = 1 THEN 'Первый'
WHEN sched.freq_relative_interval = 2 THEN 'Второй'
WHEN sched.freq_relative_interval = 4 THEN 'Третий'
WHEN sched.freq_relative_interval = 8 THEN 'Четвертый'
WHEN sched.freq_relative_interval = 16 THEN 'Последний'
END +
CASE
WHEN sched.freq_interval = 1 THEN ' Воскресенье'
WHEN sched.freq_interval = 2 THEN ' Понедельник'
WHEN sched.freq_interval = 3 THEN ' Вторник'
WHEN sched.freq_interval = 4 THEN ' Среда'
WHEN sched.freq_interval = 5 THEN ' Четверг'
WHEN sched.freq_interval = 6 THEN ' Пятница'
WHEN sched.freq_interval = 7 THEN ' Суббота'
WHEN sched.freq_interval = 8 THEN ' День'
WHEN sched.freq_interval = 9 THEN ' Рабочий день'
WHEN sched.freq_interval = 10 THEN ' Выходной день'
END +
CASE
WHEN sched.freq_recurrence_factor <> 0 AND sched.freq_recurrence_factor = 1 THEN '; ежемесячно'
WHEN sched.freq_recurrence_factor <> 0 THEN '; каждые ' + CAST(sched.freq_recurrence_factor AS VARCHAR(10)) + ' месяцев'
END
WHEN sched.freq_type = 64 THEN 'При запуске'
WHEN sched.freq_type = 128 THEN 'Простой'
END AS Frequency,
ISNULL('Каждые ' + CAST(sched.freq_subday_interval AS VARCHAR(10)) +
CASE
WHEN sched.freq_subday_type = 2 THEN ' секунд'
WHEN sched.freq_subday_type = 4 THEN ' минут'
WHEN sched.freq_subday_type = 8 THEN ' часов'
END, 'Один раз') AS SubFrequency,
REPLICATE('0', 6 - LEN(sched.active_start_time)) + CAST(sched.active_start_time AS VARCHAR(6)) AS start_time,
REPLICATE('0', 6 - LEN(sched.active_end_time)) + CAST(sched.active_end_time AS VARCHAR(6)) AS end_time,
REPLICATE('0', 6 - LEN(jobsched.next_run_time)) + CAST(jobsched.next_run_time AS VARCHAR(6)) AS next_run_time,
CAST(jobsched.next_run_date AS CHAR(8)) AS next_run_date
FROM msdb.dbo.sysschedules AS sched
INNER JOIN msdb.dbo.sysjobschedules AS jobsched ON sched.schedule_id = jobsched.schedule_id
WHERE sched.enabled = 1
)
SELECT
j.name AS JobName,
j.enabled,
j.category_id,
sp.name AS JobOwner,
c.name,
c.category_class,
js.step_id,
js.step_name,
js.subsystem,
js.command,
js.database_name,
js.database_user_name,
ct.next_run_date,
ct.next_run_time,
ct.start_time,
ct.end_time,
ct.Frequency,
ct.SubFrequency,
ct.scheduleName AS ScheduleName,
ct.SchedEnabled
FROM dbo.sysjobs j
INNER JOIN dbo.sysjobsteps js ON j.job_id = js.job_id
INNER JOIN dbo.syscategories c ON j.category_id = c.category_id
INNER JOIN sys.server_principals sp ON j.owner_sid = sp.sid
INNER JOIN myCTE ct ON ct.job_id = j.job_id;
Этот скрипт извлекает расписания заданий SQL Agent из экземпляра MSDB и предоставляет более понятное представление расписаний. Он преобразует числовые значения в описательные термины, такие как “Один раз”, “Ежедневно”, “Каждые X дней”, “Еженедельно”, “Ежемесячно” и так далее.
Запустив этот скрипт и документируя расписания в удобном для чтения формате, вы можете предоставить этот отчет аудиторам и руководителям, что облегчит им понимание и проверку расписаний заданий. Это поможет вам стать звездой в вашей организации!
Следите за будущими статьями, в которых мы рассмотрим, как получить информацию о расписании