|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
9.4.6. Работа с событиями в WMIСобытия объектов WMI, событийные запросы, метод ExecNotificationQuery(), метод NextEvent() Возможно, у вас уже возник вопрос — а зачем нужны такие сложности? Работать с объектами SMO или SQL-DMO намного проще, и функциональных возможностей у них больше. Ответ прост: в WMI реализованы очень мощные средства для работы с событиями. В WMI предусмотрено понятие получателя события. Получатель события — это программа, которой будет отправлена информация от службы WMI о том, что событие наступило. Получатель события может быть постоянным или временным. Информация о постоянном получателе записывается в репозитарий WMI, и когда наступает событие, для которого зарегистрирован этот получатель, служба WMI проверяет, запущен получатель или нет. Если он работает, то ему просто передается информация о событии, а если нет — служба WMI автоматически запускает получателя (т. е. соответствующую программу). Временным получателем может быть любая программа, которая подключилась к службе WMI и выполнила специальный событийный запрос при помощи метода ExecNotificationQuery() объекта SwbemServices. В рассматриваемом примере такими программами будут скрипты. Пример соответствующего скрипта, который будет реагировать на любые изменения для служб SQL Server, может выглядеть так: Dim oLocator Set oLocator = CreateObject("wbemScripting.Swbemlocator")
Dim oServices Set oServices = oLocator.ConnectServer("LONDON7", _ "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 (обратите внимание на два подчеркивания в начале) — одно из девяти событий, на которые можно настроить реакцию: q __ClassCreationEvent, __ClassDeletionEvent, __ClassModificationEvent — это, соответственно, создание, удаление и изменение класса; q __InstanceCreationEvent, __InstanceDeletionEvent, __InstanceModificationEvent — создание, удаление и изменение объекта; q __NamespaceCreationEvent, __NamespaceDeletionEvent, __NamespaceModificationEvent — то же самое для пространства имен (эти события используются редко). Чаще всего применяются события, связанные с экземпляром класса (instance), т. е. с конкретным объектом WMI. Событие __InstanceModificationEvent сработает, если изменится любое свойство объекта. Оператор 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$SQL2005' В результате выполнения метода ExecQueryNotification() вам вернется объект SwbemEventSource. Обычно для него вызывается метод NextEvent(), который ожидает появления события и при срабатывании возвращает стандартный объект SwbemObject, представляющий пойманное событие. А затем используется стандартное свойство TargetInstance для объекта SwbemObject, чтобы обратиться к свойствам и методам конечного объекта (в данном примере — SQLService). Чтобы опрос происходил непрерывно, нужно поместить этот код в бесконечный цикл: 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 выглядит несколько иначе. Она будет рассмотрена в разд. 9.4.8.
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||
Получить учебные материалы по этому курсу |
||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||