Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Приложения управления получают доступ к событиям 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 для событий сервера
Уведомления о событиях (ядро СУБД)