Uso de WQL con el proveedor WMI para eventos de servidor
Se aplica a: SQL Server
Las aplicaciones de administración acceden a eventos de SQL Server mediante el proveedor WMI para eventos de servidor mediante la emisión de instrucciones WMI Query Language (WQL). WQL es un subconjunto simplificado de lenguaje de consulta estructurado (SQL) con algunas extensiones específicas de WMI. Al usar WQL, una aplicación recupera un tipo de evento en una instancia específica de SQL Server, una base de datos o un objeto de base de datos (el único objeto admitido actualmente es queue). El proveedor WMI para eventos de servidor traduce la consulta en una notificación de eventos que se crea en la base de datos de destino para las notificaciones de eventos con ámbito de base de datos o con ámbito de objeto, o en la master
base de datos para las notificaciones de eventos con ámbito de servidor.
Por ejemplo, considere la siguiente consulta WQL:
SELECT * FROM DDL_DATABASE_LEVEL_EVENTS WHERE DatabaseName = 'AdventureWorks2022'
En esta consulta, el proveedor WMI intenta generar el equivalente de esta notificación de eventos en el servidor de destino:
USE AdventureWorks2022;
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
El argumento de la cláusula FROM
de la consulta WQL (DDL_DATABASE_LEVEL_EVENTS
) puede ser cualquier evento válido en el que se pueda crear una notificación de eventos. Los argumentos de las cláusulas SELECT
y WHERE
pueden especificar cualquier propiedad de evento asociada a un evento o a su evento principal. Para obtener una lista de eventos y propiedades de eventos válidos, consulte Notificaciones de eventos (Motor de base de datos).
El proveedor WMI de eventos de servidor admite explícitamente la sintaxis WQL siguiente. Es posible especificar la sintaxis WQL adicional, pero no es específica de este proveedor y se analiza en su lugar mediante el servicio host WMI. Para obtener más información acerca del Lenguaje de consulta de WMI, vea la documentación de WQL en Microsoft Developer Network (MSDN).
Sintaxis
SELECT { event_property [ , ...n ] | * }
FROM event_type
WHERE where_condition
[ ; ]
Argumentos
event_property [ , ... n ] | *
Propiedad de un evento. Entre los ejemplos se incluyen PostTime
, SPID
y LoginName
. Busque cada evento que se muestra en el proveedor WMI para las clases y propiedades de eventos de servidor para determinar qué propiedades contiene. Por ejemplo, el evento DDL_DATABASE_LEVEL_EVENTS contiene las propiedades DatabaseName
y UserName
. También hereda las propiedades SQLInstance
, LoginName
, PostTime
, SPID
y ComputerName
de sus eventos principales.
, ... n
Indica que event_property se pueden consultar varias veces, separados por comas.
*
Especifica que se consultan todas las propiedades asociadas a un evento.
event_type
Cualquier evento en el que se pueda crear una notificación de eventos. Para obtener una lista de los eventos disponibles, consulte WMI Provider for Server Events classes and properties (Proveedor WMI para clases y propiedades de eventos de servidor). los nombres de tipo de evento corresponden al mismo event_type | event_group que se puede especificar al crear manualmente una notificación de eventos mediante .CREATE EVENT NOTIFICATION
Algunos ejemplos de tipo de evento son CREATE_TABLE
, LOCK_DEADLOCK
, DDL_USER_EVENTS
y TRC_DATABASE
.
Nota:
Determinados procedimientos almacenados del sistema que realizan operaciones similares a DDL también pueden activar notificaciones de eventos. Pruebe las notificaciones de eventos para determinar su respuesta a los procedimientos almacenados del sistema que se ejecutan. Por ejemplo, la instrucción y sp_addtype
el CREATE TYPE
procedimiento almacenado desencadenarán una notificación de eventos que se crea en un CREATE_TYPE
evento. Sin embargo, el sp_rename
procedimiento almacenado no desencadena ninguna notificación de eventos. Para obtener más información, vea Eventos DDL.
where_condition
Predicado WHERE
de consulta de cláusula, formado por nombres de event_property y operadores lógicos y de comparación. El where_condition determina el ámbito en el que se registra la notificación de eventos correspondiente en la base de datos de destino. También puede actuar como filtro para tener como destino un esquema o objeto determinado desde el que consultar event_type. Para obtener más información, vea la sección Comentarios .
Solo se puede utilizar el operando =
junto con DatabaseName
, SchemaName
y ObjectName
. No se pueden usar otras expresiones con estas propiedades de evento.
Comentarios
El where_condition de la sintaxis proveedor WMI para eventos de servidor determina lo siguiente:
Ámbito por el que el proveedor intenta recuperar el event_type especificado: el nivel de servidor, el nivel de base de datos o el nivel de objeto (el único objeto admitido actualmente es queue). Finalmente, este ámbito determina el tipo de notificación de eventos creado en la base de datos de destino. Este proceso efectuó una llamada al registro de notificación de eventos.
La base de datos, el esquema y el objeto, según corresponda, en que registrarse.
El proveedor WMI para eventos de servidor usa un algoritmo de ajuste inferior y adecuado para generar el ámbito más estrecho posible para el subyacente EVENT NOTIFICATION
. El algoritmo intenta minimizar la actividad interna en el servidor y el tráfico de red entre la instancia de SQL Server y el proceso de host WMI. El proveedor examina el event_type especificado en la FROM
cláusula y las condiciones de la WHERE
cláusula e intenta registrar el subyacente EVENT NOTIFICATION
con el ámbito más estrecho posible. Si el proveedor no puede registrarse en el ámbito más estrecho, intenta registrarse en ámbitos sucesivamente más altos hasta que un registro finalmente se realice correctamente. Si llega al ámbito superior en el nivel de servidor y se produce un error, devuelve un error al consumidor.
Por ejemplo, si DatabaseName='AdventureWorks2022'
se especifica en la WHERE
cláusula , el proveedor intenta registrar una notificación de eventos en la AdventureWorks2022
base de datos. Si la base de datos AdventureWorks2022
existe y el cliente que realiza la llamada tiene los permisos necesarios para crear una notificación de eventos en AdventureWorks2022
, el registro es satisfactorio. De lo contrario, se intenta registrar la notificación de eventos en el nivel de servidor. El registro es satisfactorio si el cliente de WMI tiene los permisos necesarios. Sin embargo, en este escenario, los eventos no se devuelven al cliente hasta que se haya creado la AdventureWorks2022
base de datos.
El where_condition también puede actuar como filtro para limitar además la consulta a una base de datos, un esquema o un objeto específicos. Por ejemplo, considere la siguiente consulta WQL:
SELECT * FROM ALTER_TABLE
WHERE DatabaseName = 'AdventureWorks2022' AND SchemaName = 'Sales'
AND ObjectType='Table' AND ObjectName = 'SalesOrderDetail'
En función del resultado del proceso de registro, esta consulta WQL se puede registrar en el nivel de base de datos o servidor. Sin embargo, incluso si se registra en el nivel de servidor, el proveedor filtra en última instancia los ALTER_TABLE
eventos que no se aplican a la Sales.SalesOrderDetail
tabla. En otras palabras, el proveedor devuelve solamente las propiedades de los eventos ALTER_TABLE
que se producen en esa tabla concreta.
Si se especifica una expresión compuesta como DatabaseName='AW1' OR DatabaseName='AW2'
, se intenta registrar una sola notificación de eventos en el ámbito del servidor en lugar de dos notificaciones de eventos independientes. El registro es satisfactorio si el cliente que realiza la llamada tiene permisos.
Si SchemaName='X' AND ObjectType='Y' AND ObjectName='Z'
todos se especifican en la WHERE
cláusula , se intenta registrar la notificación de eventos directamente en el objeto Z
del esquema X
. El registro es satisfactorio si el cliente que realiza la llamada tiene permisos. Actualmente, los eventos de nivel de objeto solo se admiten en colas y solo para el QUEUE_ACTIVATION
event_type.
No todos los eventos se pueden consultar en ningún ámbito determinado. Por ejemplo, una consulta WQL en un evento de seguimiento, como Lock_Deadlock, o un grupo de eventos de seguimiento como TRC_LOCKS
, solo se puede registrar en el nivel de servidor. Del mismo modo, el CREATE_ENDPOINT
evento y el DDL_ENDPOINT_EVENTS
grupo de eventos también se pueden registrar solo en el nivel de servidor. Para obtener más información sobre el ámbito adecuado para registrar eventos, consulte Diseño de notificaciones de eventos. Un intento de registrar una consulta WQL cuya event_type solo se puede registrar en el nivel de servidor siempre se realiza en el nivel de servidor. El registro es satisfactorio si el cliente de WMI tiene permisos. De lo contrario, se devuelve un error al cliente. Sin embargo, en algunos casos, todavía puede usar la WHERE
cláusula como filtro para eventos de nivel de servidor en función de las propiedades correspondientes al evento. Por ejemplo, muchos eventos de seguimiento tienen una DatabaseName
propiedad que se puede usar en la WHERE
cláusula como filtro.
Las notificaciones de eventos con ámbito de servidor se crean en la master
base de datos y se pueden consultar para los metadatos mediante la vista de catálogo de sys.server_event_notifications .
Las notificaciones de eventos de ámbito de base de datos o de ámbito de objeto se crean en la base de datos especificada y se pueden consultar para los metadatos mediante la vista de catálogo de sys.event_notifications . (Debe anteponer a la vista de catálogo el nombre de la base de datos correspondiente).
Ejemplos
Los ejemplos de código de Transact-SQL de este artículo utilizan la base de datos de ejemplo AdventureWorks2022
o AdventureWorksDW2022
, que se puede descargar desde la página principal de Ejemplos y proyectos de la comunidad de Microsoft SQL Server.
A Consulta de eventos en el ámbito del servidor
La siguiente consulta WQL recupera todas las propiedades de evento de cualquier SERVER_MEMORY_CHANGE
evento de seguimiento que se produzca en la instancia de SQL Server.
SELECT * FROM SERVER_MEMORY_CHANGE
B. Consulta de eventos en el ámbito de la base de datos
La consulta WQL siguiente recupera propiedades de evento concretas de los eventos que se produzcan en la base de datos AdventureWorks2022
y existan bajo el grupo de eventos DDL_DATABASE_LEVEL_EVENTS
.
SELECT SPID, SQLInstance, DatabaseName FROM DDL_DATABASE_LEVEL_EVENTS
WHERE DatabaseName = 'AdventureWorks2022'
C. Consulta de eventos en el ámbito de la base de datos, filtrado por esquema y objeto
La consulta siguiente recupera todas las propiedades de evento de los eventos ALTER_TABLE
que se produzcan en la tabla Sales.SalesOrderDetail
.
SELECT * FROM ALTER_TABLE
WHERE DatabaseName = 'AdventureWorks2022' AND SchemaName = 'Sales'
AND ObjectType='Table' AND ObjectName = 'SalesOrderDetail'