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


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

Область применения: SQL Server

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

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

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

В частности, так как уведомления о событиях, созданные поставщиком 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 msdb компонента service broker имеет особый интерес, так как это расположение целевой службы поставщика.

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

Указание строки подключения

Приложения направляют поставщика WMI для событий сервера экземпляру SQL Server путем подключения к пространству имен WMI, определенному поставщиком. Служба Windows WMI сопоставляет это пространство имен с файлом поставщика Sqlwep.dll и загружает его в память. Каждый экземпляр SQL Server имеет собственное пространство имен WMI, которое по умолчанию имеет значение \\.\root\Microsoft\SqlServer\ServerEvents\instance_name. 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 = "AdventureWorks2022"
    AND SchemaName = "Person"
    AND ObjectName = "Person"
    AND ObjectType = "TABLE";

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

Если 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. Однако поставщик фильтрует все события, которые не применяются к AdventureWorks2022 базе данных. Хотя этот процесс потенциально может увеличить сетевой трафик, необходимый для области события, он также обеспечивает гибкость, позволяя регистрировать запросы WQL в базе данных до их создания, а затем получая данные событий после создания базы данных и начала операций DDL в ней.

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

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

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

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

    • DROP_LOGIN

    • ALTER_LOGIN

    • DROP_USER

    • ALTER_USER

    • ADD_ROLE_MEMBER

    • DROP_ROLE_MEMBER

    • ADD_SERVER_ROLE_MEMBER

    • DROP_SERVER_ROLE_MEMBER

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

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

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