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


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