Работа с поставщиком 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_TABLE
WHERE DatabaseName = "AdventureWorks2008R2"
AND SchemaName = "Production"
AND ObjectName = "Product"
AND ObjectType = "TABLE"
Поставщик WMI преобразует этот запрос в уведомление о событии, создающееся в базе данных База данных AdventureWorks2008R2. Это означает, что вызывающий объект должен иметь разрешения на создание такого уведомления о событии, а именно, разрешение CREATE DATABASE DDL EVENT NOTIFICATION в базе данных База данных AdventureWorks2008R2.
Если 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. Однако поставщик отфильтровывает все события, не применимые к базе данных База данных AdventureWorks2008R2. Хотя этот процесс потенциально может увеличить сетевой трафик, необходимый для области события, он также обеспечивает гибкость, позволяя регистрировать запросы 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 для классов и свойств событий сервера.