.
После загрузки модуля 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. Это задание будет запускать сценарий, чтобы накапливать данные производительности; оно имеет три параметра:
- Управляемый сервер.
- Количество секунд режима «сна» между накоплением данных.
- «Дата окончания» – дата, после которой сценарий прекращает свою работу.
Поскольку у меня всегда целевой экземпляр в переменной, я могу использовать переменную в тексте команды, применяя двойные кавычки («), когда определяю ее. Это характерная особенность 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()
Помещая эти шаги в сценарий, я получаю простой способ убедиться в том, что сбор данных производительности выполняется всегда на любом сервере, с настройкой в автоматическом режиме.