Работа с поставщиком 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 для классов событий и свойств сервера.