logo
SQL2008_Administration

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

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

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

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'"

Здесь:

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

SELECT * FROM __InstanceModificationEvent _

WITHIN 10 WHERE TargetInstance ISA 'SQLService' _

GROUP WITHIN 30 BY TargetInstance.ServiceName _

HAVING NumberOfEvents > 5

Если нужно включить в запрос дополнительные условия, применяется оператор 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 выглядит несколько по другому.