Compartir por


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_EVENTSy 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 pueden 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'