.

После загрузки модуля SQLPS, как описано в статье «Сбор сведений об экземпляре SQL Server с помощью PowerShell» (опубликованной в Windows IT Pro/RE № 2 за 2014 год), я задаю переменную со значением имени целевого экземпляра.

$inst = 'WS12SQL'

В своих сценариях я обычно использую его как аргумент командной строки. Когда у меня есть имя экземпляра, я могу подключиться к этому экземпляру.

$svr = new-object ('Microsoft.SqlServer.Management.Smo.Server') $inst

Объекты SQL Server Agent — часть объекта JobServer, под объектом Server в иерархии SMO. В объекте JobServer определяются коллекции заданий (Jobs), предупреждений (Alerts) и расписаний (Schedules). Сейчас я могу создать задание Agent путем создания объекта Job, определив объект JobServer сервера как один параметр и имя задания как другой.

$j = new-object ('Microsoft.SqlServer.Management.Smo.Agent.Job') ($svr.JobServer, 'StartPerfCapt')

Создавая объект Job, я могу задать его свойства.

$j.Description = 'Start Perfmon data capture'
$j.OwnerLoginName = 'sa'
$j.Create()

Далее я создаю объект JobStep, в качестве параметров используя Job и имя шага, затем определяю свойства шага. Создаваемый шаг будет нужен для типа задания PowerShell, поэтому свойство Command получает командную строку PowerShell. Это задание будет запускать сценарий, чтобы накапливать данные производительности; оно имеет три параметра:

  1. Управляемый сервер.
  2. Количество секунд режима «сна» между накоплением данных.
  3. «Дата окончания» – дата, после которой сценарий прекращает свою работу.

Поскольку у меня всегда целевой экземпляр в переменной, я могу использовать переменную в тексте команды, применяя двойные кавычки («), когда определяю ее. Это характерная особенность PowerShell: когда вы используете двойные кавычки для определения строки, любые переменные, которые вставляются, заменяются их текущими значениями. Если вы используете одиночные кавычки (') для определения переменной, замена переменной не выполняется.

$js = new-object ('Microsoft.SqlServer.Management.Smo.Agent.JobStep') ($j, 'Step 01')
$js.SubSystem = 'PowerShell'
$js.Command =»c:\Scripts\getperf.ps1 '$inst' 60 '2199-12-31 23:59:59'"
$js.OnSuccessAction = 'QuitWithSuccess'
$js.OnFailAction = 'QuitWithFailure'
$js.Create()

При создании объекта JobStep мне нужно получить ID этого шага, а потом я устанавливаю режим, чтобы задание начиналось с него. Также мне необходимо, чтобы задание выполнялось на моем целевом сервере, и я устанавливаю эти свойства и изменяю задание.

$jsid = $js.ID
$j.ApplyToTargetServer($s.Name)
$j.StartStepID = $jsid
$j.Alter()

Заключительный шаг – создание объекта JobSchedule для задания, опять же в качестве параметров применяются Job и имя расписания. Я устанавливаю свойство FrequencyTypes в AutoStart, поскольку хочу, чтобы задание запускалось всегда, когда начинает работать SQL Server Agent, и устанавливаю свойство ActiveStartDate в текущую дату/время, так что задание автоматически запустится в следующий раз, когда заработает SQL Server Agent.

$jsch = new-object ('Microsoft.SqlServer.Management.Smo.Agent.JobSchedule') ($j, 'Sched 01')
$jsch.FrequencyTypes = 'AutoStart'
$jsch.ActiveStartDate = get-date
$jsch.Create()

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