Compartir a través de


Usar WQL con el proveedor WMI para eventos de servidor

Las aplicaciones de administración acceden a eventos 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. En el uso de 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 de objeto, o en la base de datos maestra para las notificaciones de eventos con ámbito de servidor.

Por ejemplo, considere la siguiente consulta WQL:

SELECT * FROM DDL_DATABASE_LEVEL_EVENTS WHERE DatabaseName = 'AdventureWorks'  

En esta consulta, el proveedor WMI intenta generar el equivalente de esta notificación de eventos en el servidor de destino:

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  

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, vea Notificaciones de eventos (motor de base de datos).

El proveedor WMI de eventos de servidor admite explícitamente la sintaxis WQL siguiente. Se puede especificar sintaxis WQL adicional, pero no es específica de este proveedor y es analizada en su lugar por el servicio de host de 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
Es una propiedad de un evento. Entre los ejemplos se incluyen PostTime, SPID y LoginName. Busque cada evento que aparezca en el proveedor WMI para 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, separadas por comas.

*
Especifica que se consultan todas las propiedades asociadas a un evento.

event_type
Es cualquier evento sobre el que se puede crear una notificación de eventos. Para obtener una lista de los eventos disponibles, vea Proveedor WMI para clases y propiedades de eventos de servidor. Tenga en cuenta que los nombres de tipo de evento corresponden al mismo event_type | event_group que se pueden especificar al crear manualmente una notificación de eventos mediante CREATE EVENT NOTIFICATION. Entre los ejemplos de tipo de evento se incluyen 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 CREATE TYPE y sp_addtype procedimiento almacenado activarán una notificación de eventos que se crea en un evento CREATE_TYPE. Sin embargo, el procedimiento almacenado sp_rename no desencadena ninguna notificación de eventos. Para obtener más información, veaEventos DDL.

where_condition
Es un predicado de consulta de cláusula WHERE 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 más adelante en este tema.

Solo se puede utilizar el operando = junto con DatabaseName, SchemaName y ObjectName. Otras expresiones no se pueden utilizar con estas propiedades de evento.

Observaciones

El where_condition de la sintaxis del 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 de eventos de servidor usa un algoritmo ascendente de tipo "el primero que sea válido" para generar un ámbito lo más restringido posible para la EVENT NOTIFICATION subyacente. 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 cláusula FROM y las condiciones de la cláusula WHERE e intenta registrar la NOTIFICACIÓN DE EVENTOS subyacente con el ámbito más reducido posible. Si el proveedor no se puede registrar en el ámbito más restringido, intenta registrarse en ámbitos superiores consecutivamente hasta que el registro resulta satisfactorio finalmente. Si llega al ámbito superior en el nivel de servidor y se produce un error, devuelve un error al consumidor.

Por ejemplo, si DatabaseName=**'AdventureWorks'**se especifica en la cláusula WHERE, el proveedor intenta registrar una notificación de eventos en la base de datos AdventureWorks2012 . Si existe la base de datos AdventureWorks2012 y el cliente que realiza la llamada tiene los permisos necesarios para crear una notificación de eventos en AdventureWorks2012, el registro se realiza correctamente. 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 base de datos AdventureWorks2012 .

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 = 'AdventureWorks' AND SchemaName = 'Sales'   
    AND ObjectType='Table' AND ObjectName = 'SalesOrderDetail'  

Dependiendo del resultado del proceso de registro, esta consulta WQL se puede registrar en el nivel de base de datos o de servidor. Sin embargo, aunque se registre en el nivel del servidor, el proveedor filtra finalmente los eventos ALTER_TABLE que no se aplican a la tabla AdventureWorks.Sales.SalesOrderDetail. 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 notificación de eventos única en el ámbito de 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' se especifican todos en la cláusula , se intenta registrar la notificación de eventos directamente en el objeto Z en el WHERE esquema X. El registro es satisfactorio si el cliente que realiza la llamada tiene permisos. Tenga en cuenta que actualmente, los eventos de nivel de objeto solo se admiten en colas y solo para el event_type de QUEUE_ACTIVATION.

Observe que no todos los eventos se pueden consultar en cualquier á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. De forma similar, el evento CREATE_ENDPOINT y el grupo de eventos DDL_ENDPOINT_EVENTS también se pueden registrar solo en el nivel de servidor. Para obtener más información sobre el ámbito adecuado para registrar eventos, vea 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. En algunos casos, sin embargo, puede utilizar todavía la cláusula WHERE como filtro para los eventos en el nivel de servidor basados en las propiedades que corresponden al evento. Por ejemplo, muchos eventos de seguimiento tienen una propiedad DatabaseName que se puede utilizar en la cláusula WHERE como filtro.

Las notificaciones de eventos con ámbito de servidor se crean en la base de datos maestra y se pueden consultar para los metadatos mediante la vista de catálogo de sys.server_event_notifications .

Las notificaciones de eventos con ámbito de base de datos o 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

A. Consultar eventos en el ámbito de servidor

La siguiente consulta WQL recupera todas las propiedades de evento para cualquier SERVER_MEMORY_CHANGE evento de seguimiento que se produzca en la instancia de SQL Server.

SELECT * FROM SERVER_MEMORY_CHANGE  

B. Consultar eventos en el ámbito de base de datos

La consulta WQL siguiente recupera propiedades de evento concretas de los eventos que se produzcan en la base de datos AdventureWorks y existan bajo el grupo de eventos DDL_DATABASE_LEVEL_EVENTS.

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

C. Consultar eventos en el ámbito de base de datos, filtrar por esquema y objeto

La consulta siguiente recupera todas las propiedades de evento de los eventos ALTER_TABLE que se produzcan en la tabla AdventureWorks.Sales.SalesOrderDetail.

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

Consulte también

Conceptos del proveedor WMI para eventos de servidor
Notificaciones de eventos (motor de base de datos)