Share via


Usando o WQL com o Provedor WMI para eventos de servidor

Os aplicativos de gerenciamento acessam eventos SQL Server usando o Provedor WMI para Eventos de Servidor emitindo instruções WQL (WMI Query Language). O WQL é um subconjunto simplificado da linguagem SQL, com algumas extensões específicas do WMI. Ao usar o WQL, um aplicativo recupera um tipo de evento em relação a uma instância específica de SQL Server, um banco de dados ou um objeto de banco de dados (o único objeto com suporte no momento é a fila). O Provedor WMI para Eventos de Servidor converte a consulta em uma notificação de evento criada no banco de dados de destino para notificações de eventos no escopo do banco de dados ou no escopo do objeto ou no banco de dados master para notificações de eventos no escopo do servidor.

Por exemplo, considere a seguinte consulta WQL:

SELECT * FROM DDL_DATABASE_LEVEL_EVENTS WHERE DatabaseName = 'AdventureWorks'  

A partir dessa consulta, o Provedor WMI tenta gerar o equivalente dessa notificação de eventos no 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  

O argumento na cláusula FROM da consulta WQL (DDL_DATABASE_LEVEL_EVENTS) pode ser qualquer evento válido no qual uma notificação de eventos pode ser criada. Os argumentos nas cláusulas SELECT e WHERE podem especificar qualquer propriedade de evento associada com um evento ou seu evento pai. Para obter uma lista de eventos válidos e propriedades de evento, consulte Notificações de eventos (Mecanismo de Banco de Dados).

Há suporte explícito do Provedor WMI para eventos de servidor à sintaxe WQL a seguir. É possível especificar sintaxe WQL adicional, mas ela não é específica deste provedor e é analisada pelo serviço de host WMI. Para obter mais informações sobre a linguagem de consulta WMI, consulte a documentação do WQL no MSDN (Microsoft Developer Network).

Sintaxe

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

Argumentos

event_property
É uma propriedade de um evento. Exemplos incluem PostTime, SPID e LoginName. Pesquise cada evento listado no Provedor WMI para Classes e Propriedades de Eventos de Servidor para determinar quais propriedades ele contém. Por exemplo, o evento DDL_DATABASE_LEVEL_EVENTS contém as propriedades DatabaseName e UserName. Ele também herda as propriedades SQLInstance, LoginName, PostTime, SPID e ComputerName de seus eventos pai.

,... N
Indica que event_property podem ser consultados várias vezes, separados por vírgulas.

*
Especifica que todas as propriedades associadas com um evento são consultadas.

event_type
É qualquer evento no qual uma notificação de eventos pode ser criada. Para obter uma lista de eventos disponíveis, consulte Provedor WMI para classes e propriedades de eventos de servidor. Observe que os nomes de tipo de evento correspondem ao mesmo event_type | event_group que podem ser especificados quando você cria manualmente uma notificação de evento usando CREATE EVENT NOTIFICATION. Exemplos de tipo de evento incluem CREATE_TABLE, LOCK_DEADLOCK, DDL_USER_EVENTS e TRC_DATABASE.

Observação

Certos procedimentos armazenados do sistema que executam operações similares a DDL também podem acionar notificações de eventos. Teste as notificações de eventos para determinar suas respostas aos procedimentos armazenados que são executados. Por exemplo, a instrução CREATE TYPE e sp_addtype procedimento armazenado dispararão uma notificação de evento criada em um evento CREATE_TYPE. No entanto, o sp_rename procedimento armazenado não dispara nenhuma notificação de evento. Para obter mais informações, consulteEventos DDL.

where_condition
É um predicado de consulta da cláusula WHERE composto por nomes de event_property e operadores lógicos e de comparação. O where_condition determina o escopo no qual a notificação de evento correspondente é registrada no banco de dados de destino. Ele também pode atuar como um filtro para direcionar um esquema ou objeto específico do qual consultar event_type. Para obter mais informações, consulte a seção Comentários mais adiante neste tópico.

Somente o operando = pode ser usado juntamente com DatabaseName, SchemaName e ObjectName. Não é possível usar outras expressões com essas propriedades de eventos.

Comentários

O where_condition da sintaxe do Provedor WMI para Eventos de Servidor determina o seguinte:

  • O escopo pelo qual o provedor tenta recuperar o event_type especificado: o nível do servidor, o nível do banco de dados ou o nível do objeto (o único objeto com suporte no momento é a fila). Por fim, esse escopo determina o tipo de notificação de eventos criado no banco de dados de destino. Esse processo chamou o registro de notificação de eventos.

  • O banco de dados, o esquema e o objeto, quando apropriado, no qual registrar.

O Provedor WMI para eventos de servidor usa um algoritmo ascendente, o primeiro que for válido (first fit), a fim de gerar o escopo mais restrito possível para a EVENT NOTIFICATION subjacente. O algoritmo tenta minimizar a atividade interna no servidor e no tráfego de rede entre a instância do SQL Server e o processo de host WMI. O provedor examina a event_type especificada na cláusula FROM e as condições na cláusula WHERE e tenta registrar a EVENT NOTIFICATION subjacente com o escopo mais estreito possível. Se o provedor não puder registrar com o escopo mais restrito, ele tentará registrar com escopos sucessivamente superiores, até que um registro finalmente tenha êxito. Se o escopo mais alto (o nível de servidor) for atingido e falhar, um erro será retornado ao consumidor.

Por exemplo, se DatabaseName=**'AdventureWorks'**for especificado na cláusula WHERE, o provedor tentará registrar uma notificação de evento no banco de dados AdventureWorks2012 . Se o banco de dados AdventureWorks2012 existir e o cliente de chamada tiver as permissões necessárias para criar uma notificação de evento no AdventureWorks2012, o registro será bem-sucedido. Caso contrário, será feita uma tentativa de registrar a notificação de eventos no nível de servidor. O registro terá êxito se o cliente WMI tiver as permissões necessárias. No entanto, nesse cenário, os eventos não são retornados ao cliente até que o banco de dados AdventureWorks2012 tenha sido criado.

O where_condition também pode atuar como um filtro para limitar a consulta a um banco de dados, esquema ou objeto específico. Por exemplo, considere a seguinte consulta WQL:

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

Dependendo do resultado do processo de registro, essa consulta WQL pode ser registrada no nível de banco de dados ou de servidor. Entretanto, mesmo se registrada no nível de servidor, no final o provedor filtra quaisquer eventos ALTER_TABLE que não se aplicam à tabela AdventureWorks.Sales.SalesOrderDetail. Em outras palavras, o provedor retorna apenas as propriedades dos eventos ALTER_TABLE que ocorrem naquela tabela específica.

Se uma expressão composta, como DatabaseName='AW1' OR DatabaseName='AW2', for especificada, será feita uma tentativa de registrar uma única notificação de eventos no escopo do servidor, em vez de duas notificações de eventos separadas. O registro terá êxito se o cliente que fez a chamada tiver as permissões.

Se SchemaName='X' AND ObjectType='Y' AND ObjectName='Z' todos forem especificados na WHERE cláusula , será feita uma tentativa de registrar a notificação de evento diretamente no objeto Z no esquema X. O registro terá êxito se o cliente tiver as permissões. Observe que, atualmente, os eventos no nível do objeto têm suporte apenas em filas e somente para o QUEUE_ACTIVATION event_type.

Observe que nem todos os eventos podem ser consultados em qualquer escopo específico. Por exemplo, uma consulta WQL em um evento de rastreamento, como Lock_Deadlock, ou um grupo de eventos de rastreamento, como TRC_LOCKS, podem ser registrado apenas no nível de servidor. De forma semelhante, o evento CREATE_ENDPOINT e o grupo de eventos DDL_ENDPOINT_EVENTS também podem ser registrados apenas no nível de servidor. Para obter mais informações sobre o escopo apropriado para registrar eventos, consulte Criando notificações de eventos. Uma tentativa de registrar uma consulta WQL cuja event_type só pode ser registrada no nível do servidor é sempre feita no nível do servidor. O registro terá êxito se o cliente WMI tiver as permissões. Caso contrário, será retornado um erro ao cliente. Entretanto, em alguns casos, você ainda pode usar a cláusula WHERE como um filtro para eventos em nível de servidor com base nas propriedades que correspondem ao evento. Por exemplo, vários eventos de rastreamento têm uma propriedade DatabaseName que pode ser usada na cláusula WHERE como um filtro.

As notificações de evento no escopo do servidor são criadas no banco de dados master e podem ser consultadas para metadados usando a exibição de catálogo sys.server_event_notifications.

As notificações de evento no escopo do banco de dados ou no escopo do objeto são criadas no banco de dados especificado e podem ser consultadas para metadados usando a exibição de catálogo sys.event_notifications . (A exibição do catálogo deve ser prefixada com o nome do banco de dados correspondente.)

Exemplos

a. Consultando eventos no escopo de servidor

A consulta WQL a seguir recupera todas as propriedades de evento para qualquer SERVER_MEMORY_CHANGE evento de rastreamento que ocorra na instância do SQL Server.

SELECT * FROM SERVER_MEMORY_CHANGE  

B. Consultando eventos no escopo de banco de dados

A consulta WQL a seguir recupera propriedades de evento específicas de qualquer evento que ocorre no banco de dados AdventureWorks e existe que existe no grupo de eventos DDL_DATABASE_LEVEL_EVENTS.

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

C. Consultando eventos no escopo de banco de dados, filtrando por esquema e objeto

A consulta a seguir recupera todas as propriedades de evento de qualquer evento ALTER_TABLE que ocorre na tabela AdventureWorks.Sales.SalesOrderDetail.

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

Consulte Também

Provedor WMI para conceitos de eventos de servidor
Notificações de eventos (Mecanismo de Banco de Dados)