Compartilhar via


Usar WQL com o provedor WMI para eventos de servidor

Aplica-se a:SQL Server

Os aplicativos de gerenciamento acessam eventos do SQL Server usando o Provedor WMI para Eventos do 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 uma instância específica do SQL Server, um banco de dados ou um objeto de banco de dados (o único objeto com suporte atualmente é fila). O Provedor WMI para Eventos do Servidor converte a consulta em uma notificação de evento criada no banco de dados de destino para notificações de eventos com escopo de banco de dados ou escopo de objeto, ou no master banco de dados para notificações de eventos com escopo de servidor.

Por exemplo, considere a seguinte consulta WQL:

SELECT * FROM DDL_DATABASE_LEVEL_EVENTS WHERE DatabaseName = 'AdventureWorks2022'

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

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 eventos, 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. A sintaxe WQL adicional pode ser especificada, mas não é específica para esse 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 [ , ... n ] | *

Uma propriedade de um evento. Exemplos incluem PostTime, SPID e LoginName. Procure cada evento listado em Provedor WMI para classes e propriedades de Eventos do 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 contra o qual uma notificação de evento pode ser criada. Para obter uma lista de eventos disponíveis, consulte Provedor WMI para classes e propriedades de eventos do servidor. Os nomes de tipo de evento correspondem às mesmas event_group event_type | que podem ser especificadas quando você cria manualmente uma notificação de evento usando CREATE EVENT NOTIFICATIONo . Exemplos de tipo de evento incluem CREATE_TABLE, LOCK_DEADLOCK, DDL_USER_EVENTSe 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 e sp_addtype o CREATE TYPE procedimento armazenado dispararão uma notificação de evento criada em um CREATE_TYPE evento. No entanto, o sp_rename procedimento armazenado não dispara nenhuma notificação de evento. Para obter mais informações, consulte Eventos DDL.

where_condition

Um WHERE predicado de consulta de cláusula, 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 determinado esquema ou objeto a partir do qual consultar event_type. Para obter mais informações, consulte a seção Comentários .

Somente o operando = pode ser usado juntamente com DatabaseName, SchemaName e ObjectName. Outras expressões não podem ser usadas com essas propriedades de evento.

Comentários

A where_condition da sintaxe do Provedor WMI para Eventos do 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 de baixo para cima, de primeiro ajuste, para produzir o escopo mais restrito possível para o .EVENT NOTIFICATION O algoritmo tenta minimizar a atividade interna no servidor e o tráfego de rede entre a instância do SQL Server e o processo de host WMI. O provedor examina os event_type especificados na FROM cláusula e as condições na WHERE cláusula e tenta registrar o subjacente EVENT NOTIFICATION com o escopo mais restrito possível. Se o provedor não puder se registrar no escopo mais restrito, ele tentará registrar em escopos sucessivamente mais altos até que um registro seja finalmente bem-sucedido. Se o escopo mais alto (o nível de servidor) for atingido e falhar, um erro será retornado ao consumidor.

Por exemplo, se DatabaseName='AdventureWorks2022' for especificado na WHERE cláusula, o provedor tentará registrar uma notificação de evento no AdventureWorks2022 banco de dados. Se o banco de dados AdventureWorks2022 existir e o cliente que fez a chamada tiver as permissões necessárias para criar uma notificação de eventos em AdventureWorks2022, o registro terá êxito. 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 AdventureWorks2022 banco de dados tenha sido criado.

O where_condition também pode atuar como um filtro para limitar adicionalmente 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 = 'AdventureWorks2022' 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 do banco de dados ou do servidor. No entanto, mesmo que esteja registrado no nível do servidor, o provedor filtra todos os ALTER_TABLE eventos que não se aplicam à Sales.SalesOrderDetail tabela. 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 evento no escopo do servidor em vez de duas notificações de evento 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. Atualmente, os eventos de nível de objeto são suportados apenas em filas e somente para o QUEUE_ACTIVATIONevent_type.

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, só pode ser registrada no nível do servidor. Da mesma forma, o CREATE_ENDPOINT evento e o grupo de DDL_ENDPOINT_EVENTS eventos também podem ser registrados somente no nível do 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 cujo event_type só pode ser registrado 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. Em alguns casos, no entanto, você ainda pode usar a WHERE cláusula como um filtro para eventos no nível do servidor com base nas propriedades que correspondem ao evento. Por exemplo, muitos eventos de rastreamento têm uma DatabaseName propriedade que pode ser usada na WHERE cláusula como um filtro.

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

As notificações de eventos com escopo de banco de dados ou escopo de objeto são criadas no banco de dados especificado e podem ser consultadas em busca de metadados usando o modo de 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

Os exemplos de código Transact-SQL neste artigo usam o AdventureWorks2022 banco de dados de exemplo, que você pode baixar da home page Microsoft SQL Server Samples and Community Projects .

R. Consulta de eventos no escopo do servidor

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

SELECT * FROM SERVER_MEMORY_CHANGE

B. Consulta de eventos no escopo do banco de dados

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

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

C. Consulta de eventos no escopo do 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 Sales.SalesOrderDetail.

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