Поделиться через


Работа с поставщиком WMI для событий сервера

В этом разделе приводятся рекомендации, которые следует учитывать при программировании с помощью поставщика WMI для событий сервера.

Включение компонента Service Broker

Поставщик WMI для событий сервера преобразует запросы WQL на события в уведомления о событиях в целевой базе данных. Понимание работы уведомлений о событиях полезно при программировании поставщика. Дополнительные сведения см. в разделе Уведомления о событиях (компонент Database Engine).

В частности, поскольку уведомления о событиях, созданные поставщиком WMI для событий сервера, используют SQL Server для отправки сообщений о событиях сервера, эту службу необходимо включить до формирования событий. Если программа запрашивает события на экземпляре сервера, необходимо включить компонент Service Broker в msdb этого экземпляра, поскольку здесь размещается целевая служба Service Broker (SQL/Notifications/ProcessWMIEventProviderNotification/v1.0), создающаяся поставщиком. Если программа запрашивает события в базе данных или в определенном объекте базы данных, необходимо включить компонент Service Broker в этой базе данных-получателе. Если соответствующий компонент не включен Service Broker после развертывания приложения, все события, сформированные базовым уведомлением о событиях, отправляются в очередь службы, которую использует уведомление о событиях, но не возвращаются приложению инструментария WMI, пока не будет включен компонент Service Broker.

Следующий запрос определяет, какой компонент Service Broker включен на экземпляре сервера, а также идентификатор GUID экземпляра компонента:

SELECT name, is_broker_enabled, service_broker_guid FROM sys.databases;

Особый интерес представляет идентификатор GUID компонента Service Broker базы данных msdb, поскольку здесь размещается целевая служба поставщика.

Для включения компонента Service Broker в базе данных используется параметр ENABLE_BROKER SET инструкции ALTER DATABASE.

Задание строки соединения

Приложения направляют поставщик WMI для событий сервера на экземпляр SQL Server, соединяясь с пространством имен WMI, заданным поставщиком. Служба Windows WMI сопоставляет это пространство имен с файлом поставщика Sqlwep.dll и загружает его в память. Каждый экземпляр SQL Server имеет собственное пространство имен, по умолчанию: \\.\корень\Microsoft\SqlServer\ServerEvents\имя_экземпляра. instance_name по умолчанию имеет значение MSSQLSERVER при стандартной установке SQL Server.

Разрешения и проверка подлинности сервера

Чтобы получить доступ к поставщику WMI для событий сервера, клиент, на котором выполняется приложение инструментария WMI, должен соответствовать имени входа или группе для проверки подлинности Windows в экземпляре SQL Server, заданном в строке соединения приложения.

Разрешения и область уведомления о событии

Поставщик WMI для событий сервера преобразует запросы WQL в уведомления о событиях в базе данных-получателе. Вследствие этого вызывающее приложение должно иметь не только необходимые минимальные разрешения для доступа к поставщику, но и соответствующие разрешения в базе данных для создания нужных уведомлений о событиях. Ниже представлены эти разрешения.

  • Чтобы создать уведомление о событии в области базы данных, как минимум, необходимо разрешение CREATE DATABASE DDL EVENT NOTIFICATION в текущей базе данных.

  • Чтобы создать уведомление о событии для инструкции DDL в области сервера, как минимум, необходимо разрешение CREATE DDL EVENT NOTIFICATION на сервере.

  • Чтобы создать уведомление о событии для события трассировки, как минимум, необходимо разрешение CREATE TRACE EVENT NOTIFICATION на сервере.

  • Чтобы создать уведомление о событии в области очереди, как минимум, необходимо разрешение ALTER для запроса.

Сведения об области запросов WQL см. в разделе Использование WQL с поставщиком WMI для событий сервера.

Чтобы проиллюстрировать область запросов, рассмотрим приложение поставщика WMI, включающего следующий WQL-запрос:

SELECT * FROM ALTER_TABLEWHERE DatabaseName = "AdventureWorks"     AND SchemaName = "Person"    AND ObjectName = "Contact"    AND ObjectType = "TABLE"

Поставщик WMI преобразует этот запрос в уведомление о событии, создающееся в базе данных AdventureWorks. Это означает, что вызывающий объект должен иметь разрешения на на создание такого уведомления о событии, а именно, разрешение CREATE DATABASE DDL EVENT NOTIFICATION в базе данных AdventureWorks.

Если WQL-запрос задает уведомление о событиях с областью действия на уровне сервера, например, с помощью запроса SELECT * FROM ALTER_TABLE, вызывающее приложение должно иметь разрешение на уровне сервера CREATE DDL EVENT NOTIFICATION. Обратите внимание, что уведомления о событиях уровня сервера хранятся в базе данных master. Для просмотра их метаданных можно использовать представление каталога sys.server_event_notifications.

ПримечаниеПримечание

Область уведомления о событии, созданном поставщиком WMI (сервер, база данных или объект) в конечном счёте зависит от результата проверки разрешений для поставщика WMI. На него влияет набор разрешений пользователя, вызывающего поставщик, и проверка запрашиваемой базы данных.

В предыдущем примере поставщик вначале пытается создать уведомление о событии с областью базы данных (ON DATABASE). Если поставщик убеждается, что база данных существует и что вызывающий объект имеет необходимые разрешения для создания в ней уведомления о событии, регистрация проходит успешно. В случае неуспеха поставщик пытается создать уведомление о событии на сервере (ON SERVER). Предполагая, что эта попытка окажется успешной, все события ALTER_TABLE, возникающие на сервере, отправляются из процесса SQL Server в процесс службы WMI. Но поставщик отфильтровывает все события, не применимые к базе данных AdventureWorks. Хотя этот процесс потенциально может увеличить сетевой трафик, необходимый для области события, он также обеспечивает гибкость, регистрируя запросы WQL в базе данных до того, как они созданы, а затем получает данные событий после создания базы данных и начала операций DDL.

Разрешения и проверка сообщений

Поставщик WMI не отправляет сообщения для уведомлений о событиях, если соблюдаются оба следующих условия.

  • Пользователь, создавший уведомление о событии с помощью поставщика WMI, больше не существует в базе данных или не имеет необходимых разрешений на создание уведомления о событии.

  • Уведомления о событиях созданы для следующих событий:

    • DROP_LOGIN

    • ALTER_LOGIN

    • DROP_USER

    • ALTER_USER

    • ADD_ROLE_MEMBER

    • DROP_ROLE_MEMBER

    • ADD_SERVER_ROLE_MEMBER

    • DROP_SERVER_ROLE_MEMBER

    • DENY or REVOKE (применимо только к разрешениям ALTER DATABASE, ALTER ANY DATABASE EVENT NOTIFICATION, CREATE DATABASE DDL EVENT NOTIFICATION, CONTROL SERVER, ALTER ANY EVENT NOTIFICATION, CREATE DDL EVENT NOTIFICATION или CREATE TRACE EVENT NOTIFICATION.)

Работа с данными событий на стороне клиента

После того, как поставщик WMI для событий сервера создает в базе данных-получателе нужное уведомление о событии, это уведомление о событии отправляет данные события целевой службе в базе данных msdb с именем SQL/Notifications/ProcessWMIEventProviderNotification/v1.0. Целевая служба ставит событие в очередь с именем WMIEventProviderNotificationQueue в базе данных msdb. (Очередь и служба динамически создаются поставщиком при первом соединении с SQL Server.) Затем поставщик считывает XML-данные события из этой очереди и преобразует их в данные MOF прежде чем возвратить их в клиентское приложение. Данные MOF составляются из свойств события, получаемого WQL-запросом как определение класса общей информационной модели (CIM). Каждое свойство имеет соответствующий тип CIM. Например, свойство SPID возвращается как тип CIM Sint32. Типы CIM для каждого свойства приводятся в списке в Поставщик WMI для классов событий и свойств сервера.