Академия Специальных Курсов по Компьютерным Технологиям
    Главная страница Послать письмо
 
AskIt.ru  
   
   
   
   
   
   
 
 
  Главная / Заказные курсы / Microsoft SQL Server 2005 для администраторов
 
 

Получить учебные материалы по этому курсу


<-- Назад Читать дальше -->

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.

 

   
   
   
   
   
   
   
   
   
   
 
<-- Назад Читать дальше -->

Получить учебные материалы по этому курсу


 
© 2004-2008, Академия Специальных Курсов
по Информационным Технологиям
.
Все права защищены.

Разработка NevaStudio
г. Санкт-Петербург, Васильевский остров,
20-я линия, д. 7
Офис 101, 2-й этаж
Телефон: 8(812)922-47-60
E-mail: info@askit.ru