Работа с поставщиком 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 NOTIFICATION
CONTROL SERVER
ALTER ANY EVENT NOTIFICATION
илиCREATE DDL EVENT NOTIFICATION
CREATE 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 для классов и свойств событий сервера.