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


Использование WQL с поставщиком WMI для событий сервера

Приложения управления получают доступ к событиям SQL Server с помощью поставщика WMI для событий сервера путем выдачи инструкций WMI Language (WQL). WQL является упрощенным подмножеством языка SQL с некоторыми расширениями, специфичными для WMI. При использовании WQL приложение получает тип события для определенного экземпляра SQL Server, базы данных или объекта базы данных (единственный объект, поддерживаемый в настоящее время— очередь). Поставщик WMI для событий сервера преобразует запрос в уведомление о событиях, созданное в целевой базе данных для уведомлений о событиях с областью базы данных или в области объектов, или в базе данных master для уведомлений о событиях на уровне сервера.

Например, рассмотрим следующий WQL-запрос.

SELECT * FROM DDL_DATABASE_LEVEL_EVENTS WHERE DatabaseName = 'AdventureWorks'  

На основе этого запроса поставщик WMI совершает попытку создать эквивалент этого уведомления о событии на целевом сервере.

USE AdventureWorks ;  
GO  
  
CREATE EVENT NOTIFICATION SQLWEP_76CF38C1_18BB_42DD_A7DC_C8820155B0E9  
    ON DATABASE  
    WITH FAN_IN  
    FOR DDL_DATABASE_LEVEL_EVENTS  
    TO SERVICE   
        'SQL/Notifications/ProcessWMIEventProviderNotification/v1.0',  
        'A7E5521A-1CA6-4741-865D-826F804E5135';  
GO  

Аргумент в предложении FROM WQL-запроса (DDL_DATABASE_LEVEL_EVENTS) может представлять любое допустимое событие, о котором может быть создано уведомление. Аргументы в предложениях SELECT и WHERE могут указывать любые свойства событий, связанные с событием или его родительским событием. Список допустимых событий и свойств событий см. в разделе "Уведомления о событиях" (ядро СУБД).

Следующий синтаксис языка WQL явно поддерживается поставщиком WMI для событий сервера. Может быть указан дополнительный синтаксис WQL, но он не зависит от этого поставщика и вместо этого анализируется службой узлов WMI. Дополнительные сведения о языке запросов WMI см. в документации по WQL на веб-узле MSDN.

Синтаксис

  
SELECT { event_property [ ,...n ] | * }  
FROM event_type   
WHERE where_condition  

Аргументы

event_property
Свойство события. Например, PostTime, SPID и LoginName. Просмотрите каждое событие, указанное в поставщике WMI для классов событий сервера и свойств , чтобы определить, какие свойства он содержит. Например, событие DDL_DATABASE_LEVEL_EVENTS имеет свойства DatabaseName и UserName. Также оно наследует свойства SQLInstance, LoginName, PostTime, SPID и ComputerName от родительских событий.

, ... n
Указывает, что event_property можно запрашивать несколько раз, разделенных запятыми.

*
Указывает, что запрашиваются все свойства, связанные с событием.

event_type
Событие, для которого может быть создано уведомление. Список доступных событий см. в разделе "Поставщик WMI" для классов и свойств событий сервера. Обратите внимание, что имена типов событий соответствуют тем же event_type event_group | , которые можно указать при создании уведомления о событии вручную с помощью CREATE EVENT NOTIFICATION. Примерами типа события являются CREATE_TABLE, LOCK_DEADLOCK, DDL_USER_EVENTS и TRC_DATABASE.

Примечание.

Определенные системные хранимые процедуры, выполняющие DDL-подобные операции, могут также вызывать формирование уведомления о событиях. Протестируйте свои уведомления о событиях, чтобы определить их реакцию на системные хранимые процедуры. Например, инструкция CREATE TYPE и хранимая процедура sp_addtype вызовет уведомление о событии, созданное в событии CREATE_TYPE. Однако хранимая процедура sp_rename не запускает уведомления о событиях. Дополнительные сведения см. в разделе"События DDL".

where_condition
Представляет собой предикат запроса предложения WHERE, состоящий из event_property имен и логических и операторов сравнения. Where_condition определяет область, в которой соответствующее уведомление о событии зарегистрировано в целевой базе данных. Он также может выступать в качестве фильтра для целевой схемы или объекта, из которого запрашивать event_type. Дополнительные сведения см. в разделе "Примечания" далее в этом разделе.

Только операнд = может использоваться вместе с DatabaseName, SchemaName и ObjectName. Другие выражения нельзя использовать с этими свойствами событий.

Замечания

Where_condition поставщика WMI для событий сервера определяет следующее:

  • Область, с помощью которой поставщик пытается получить указанные event_type: уровень сервера, уровень базы данных или уровень объекта (единственный объект, поддерживаемый в настоящее время, — очередь). В конечном счете эта область определяет тип уведомления о событии, создаваемого в базе данных-получателе. Этот процесс называется регистрацией уведомления о событии.

  • База данных, схема и объект (если применимо), в которых выполняется регистрация.

Поставщик WMI для событий сервера использует восходящий алгоритм «первый подходящий» для создания наиболее узкой области для базового уведомления EVENT NOTIFICATION. Алгоритм пытается свести к минимуму внутренние действия на сервере и сетевом трафике между экземпляром SQL Server и процессом узла WMI. Поставщик проверяет event_type , указанные в предложении FROM и условия в предложении WHERE, и пытается зарегистрировать базовое УВЕДОМЛЕНИЕ EVENT с максимальной возможной областью. Если поставщику не удается выполнить регистрацию в наиболее узкой области, он пытается выполнить ее в областях более высокого уровня, пока регистрация не пройдет успешно. Если достигнут самый высокий уровень (уровень сервера), а регистрация завершается сбоем, возвращается сообщение об ошибке.

Например, если DatabaseName=**'AdventureWorks'* указан в предложении WHERE, поставщик пытается зарегистрировать уведомление о событии в базе данных AdventureWorks2012. Если база данных AdventureWorks2012 существует, а вызывающий клиент имеет необходимые разрешения для создания уведомления о событии в AdventureWorks2012, регистрация выполнена успешно. В противном случае выполняется попытка зарегистрировать уведомление о событии на уровне сервера. Регистрация выполняется успешно, если клиент WMI имеет необходимые разрешения. Однако в этом сценарии события не возвращаются клиенту до создания базы данных AdventureWorks2012 .

Where_condition также может выступать в качестве фильтра, чтобы дополнительно ограничить запрос определенной базой данных, схемой или объектом. Например, рассмотрим следующий WQL-запрос.

SELECT * FROM ALTER_TABLE   
WHERE DatabaseName = 'AdventureWorks' AND SchemaName = 'Sales'   
    AND ObjectType='Table' AND ObjectName = 'SalesOrderDetail'  

В зависимости от результатов процесса регистрации WQL-запрос может быть зарегистрирован либо на уровне базы данных, либо на уровне сервера. Однако даже если он зарегистрирован на уровне сервера, поставщик в конечном итоге отфильтровывает любые события ALTER_TABLE, неприменимые к таблице AdventureWorks.Sales.SalesOrderDetail. Иными словами, поставщик возвращает только свойства событий ALTER_TABLE, возникших в конкретной таблице.

Если указано составное выражение (такое как DatabaseName='AW1' OR DatabaseName='AW2'), выполняется попытка зарегистрировать одиночное уведомление о событии на уровне сервера вместо регистрации двух отдельных уведомлений о событии. Регистрация выполняется успешно, если вызывающий клиент имеет необходимые разрешения.

Если SchemaName='X' AND ObjectType='Y' AND ObjectName='Z' все указано в WHERE предложении, попытка зарегистрировать уведомление о событии непосредственно в объекте Z в схеме X. Регистрация выполняется успешно, если клиент имеет необходимые разрешения. Обратите внимание, что в настоящее время события уровня объектов поддерживаются только в очередях и только для QUEUE_ACTIVATION event_type.

Следует иметь в виду, что не все события могут запрашиваться во всех областях действия. Например, WQL-запрос о событии трассировки, таком как Lock_Deadlock, или группе событий трассировки, такой как TRC_LOCKS, может быть зарегистрирован только на уровне сервера. Аналогичным образом событие CREATE_ENDPOINT и группа событий DDL_ENDPOINT_EVENTS также могут быть зарегистрированы только на уровне сервера. Дополнительные сведения о соответствующей области регистрации событий см. в разделе "Проектирование уведомлений о событиях". Попытка зарегистрировать WQL-запрос, event_type которого можно зарегистрировать только на уровне сервера, всегда выполняется на уровне сервера. Регистрация выполняется успешно, если клиент WMI имеет необходимые разрешения. Иначе клиенту возвращается ошибка. Однако в некоторых случаях можно использовать предложение WHERE в качестве фильтра для событий на уровне сервера на основе свойств, соответствующих событию. Например, многие события трассировки имеют свойство DatabaseName, которое можно использовать в предложении WHERE в качестве фильтра.

Уведомления о событиях с областью действия сервера создаются в базе данных master и могут запрашиваться для метаданных с помощью представления каталога sys.server_event_notifications .

Уведомления о событиях с областью действия базы данных или объекта создаются в указанной базе данных и могут запрашиваться для метаданных с помощью представления каталога sys.event_notifications . Представление каталога должно иметь префикс с именем соответствующей базы данных.

Примеры

А. Запросы событий на уровне сервера

Следующий запрос WQL извлекает все свойства события для любого SERVER_MEMORY_CHANGE события трассировки, которое происходит в экземпляре SQL Server.

SELECT * FROM SERVER_MEMORY_CHANGE  

B. Запросы событий на уровне базы данных

Следующий WQL-запрос получает конкретные свойства событий для любых событий, возникающих в базе данных AdventureWorks и существующих в группе событий DDL_DATABASE_LEVEL_EVENTS.

SELECT SPID, SQLInstance, DatabaseName FROM DDL_DATABASE_LEVEL_EVENTS   
WHERE DatabaseName = 'AdventureWorks'   

В. Запросы событий на уровне базы данных, фильтрация по схеме и объекту

Следующий запрос получает все свойства событий для любого события ALTER_TABLE, возникшего в таблице AdventureWorks.Sales.SalesOrderDetail.

SELECT * FROM ALTER_TABLE   
WHERE DatabaseName = 'AdventureWorks' AND SchemaName = 'Sales'   
    AND ObjectType='Table' AND ObjectName = 'SalesOrderDetail'  

См. также

Основные понятия о поставщике WMI для событий сервера
Уведомления о событиях (ядро СУБД)