Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
SQL2008_Administration.doc
Скачиваний:
91
Добавлен:
08.11.2018
Размер:
3.38 Mб
Скачать

7.4.6. Работа с событиями в wmi

В WMI предусмотрено понятие получателя события. Получатель события — это программа, которая получит информацию от службы WMI о том, что событие наступило.

Получатель события может быть:

  • Постоянным. Информация о постоянном получателе записывается в репозитарий WMI, и когда наступает событие, для которого зарегистрирован этот получатель, служба WMI проверяет, запущен получатель или нет. Если запущен, то ему передается информация о событии, а если нет — служба WMI автоматически запускает получателя (то есть соответствующую программу).

  • Временным. Временным получателем может быть любая программа, которая подключилась к службе WMI и выполнила специальный событийный запрос при помощи метода ExecNotificationQuery() объекта SWbemServices. Пример скрипта, который будет реагировать на любые изменения для служб SQL Server, может выглядеть так:

Dim oLocator

Set oLocator = CreateObject("wbemScripting.Swbemlocator")

Dim oServices

Set oServices = oLocator.ConnectServer("LONDON", "root\Microsoft\SqlServer\ComputerManagement")

Dim oEventSource

Set oEventSource = oServices.ExecNotificationQuery _

("SELECT * FROM __InstanceModificationEvent " & _

"WITHIN 10 WHERE TargetInstance ISA 'SqlService'")

i = 0

Do While i = 0

Set oWbemObject = oEventSource.NextEvent

MsgBox oWbemObject.TargetInstance.ServiceName & vbTab & oWbemObject.TargetInstance.State

Loop

Если вы, к примеру, остановите или запустите службу SQL Server или SQL Server Agent, этот скрипт автоматически выведет соответствующее сообщение.

Событийный запрос в нашем случае выглядит так:

"SELECT * FROM __InstanceModificationEvent WITHIN 10 WHERE TargetInstance ISA 'SqlService'"

Здесь:

  • __InstanceModificationEvent (обратите внимание на два подчеркивания в начале) — одно из девяти событий, на которые можно настроить реакцию:

  • __ClassCreationEvent, __ClassDeletionEvent, __ClassModificationEvent — соответственно, создание, удаление и изменение класса;

  • __InstanceCreationEvent, __InstanceDeletionEvent, __InstanceModificationEvent — создание, удаление и изменение объекта;

  • __NamespaceCreationEvent, __NamespaceDeletionEvent, __NamespaceModificationEvent — то же самое для пространства имен (используется редко).

  • WITHIN 10 – оператор, определяющий, что опрос службы WMI будет производиться каждые 10 секунд (чтобы не расходовать лишние системные ресурсы). К этому оператору можно добавлять выражение GROUP BY: сгруппированные по какому-то признаку события за период рассматриваются как одно событие и HAVING — порог на количество событий. Если количество событий ниже этого порога, то событие считается не наступившим.

Полный синтаксис запроса с использованием всех этих операторов может выглядеть, например, так:

SELECT * FROM __InstanceModificationEvent _

WITHIN 10 WHERE TargetInstance ISA 'SQLService' _

GROUP WITHIN 30 BY TargetInstance.ServiceName _

HAVING NumberOfEvents > 5

  • Последняя часть запроса — WHERE TargetInstance ISA 'SQLService' позволяет отфильтровать источник событий. Настоятельно рекомендуется определять его как можно более точно. В данном случае оператор ISA используется, чтобы указать, что нас интересуют все экземпляры класса SQLService.

Если нужно включить в запрос дополнительные условия, применяется оператор AND:

SELECT * FROM __InstanceModificationEvent _

WHERE TargetInstance ISA 'SQLService' _

AND TargetInstance.ServiceName = ' SQLAgent$SQL2008'

В результате выполнения метода ExecQueryNotification() нам возвращается объект SWbemEventSource. Обычно для него вызывается метод NextEvent(). Этот метод ожидает появления события и при его появлении возвращает стандартный объект SWbemObject, который представляет пойманное событие. А затем мы используем его стандартное свойство TargetInstance, чтобы обратиться к свойствам и методам данного объекта. Чтобы опрос происходил постоянно, нужно поместить этот код в бесконечный цикл:

i = 0

Do While i = 0

Set oWbemObject = oEventSource.NextEvent

MsgBox oWbemObject.TargetInstance.ServiceName & vbTab & oWbemObject.TargetInstance.State

Loop

Теперь, пока вы не остановите работу скрипта, в окна сообщений будет выводиться информация о любых изменениях свойств служб SQL Server, например, изменения свойства State (то есть состояние службы — остановлена, запущена и т.п.)

Отметим, что этот подход применяется ко всем стандартным поставщикам WMI, в том числе WMI Provider for Configuration Management. Работа со специальным событийным поставщиком WMI Provider for Server Events выглядит несколько по другому.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]