Partilhar via


Use o WQL com o fornecedor WMI para eventos de servidor

Aplica-se a:SQL Server

As aplicações de gestão acedem a eventos SQL Server usando o WMI Provider for Server Events, emitindo instruções WMI Query Language (WQL). WQL é um subconjunto simplificado da linguagem de consulta estruturada (SQL), com algumas extensões específicas para WMI. Ao usar WQL, uma aplicação recupera um tipo de evento contra uma instância específica do SQL Server, uma base de dados ou um objeto de base de dados (o único objeto atualmente suportado é a fila). O Fornecedor WMI para Eventos de Servidor traduz a consulta numa notificação de evento criada na base de dados de destino para notificações de eventos com âmbito de base de dados ou objetos, ou na master base de dados para notificações de eventos com âmbito de servidor.

Por exemplo, considere a seguinte consulta WQL:

SELECT * FROM DDL_DATABASE_LEVEL_EVENTS WHERE DatabaseName = 'AdventureWorks2022'

A partir desta consulta, o Fornecedor WMI tenta produzir o equivalente desta notificação de evento no servidor alvo:

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 FROM cláusula da consulta WQL (DDL_DATABASE_LEVEL_EVENTS) pode ser qualquer evento válido sobre o qual uma notificação de evento possa ser criada. Os argumentos nas SELECT cláusulas e WHERE podem especificar qualquer propriedade de evento associada a um evento ou ao seu evento pai. Para uma lista de eventos válidos e propriedades de eventos, consulte Notificações de Eventos (Motor de Base de Dados).

A seguinte sintaxe WQL é suportada explicitamente pelo Fornecedor WMI para Eventos de Servidor. Pode ser especificada uma sintaxe WQL adicional, mas não é específica deste fornecedor e é analisada pelo serviço anfitrião WMI. Para mais informações sobre a WMI Query Language, consulte a documentação WQL na Microsoft Developer Network (MSDN).

Sintaxe

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

Arguments

event_property [ , ... n ] | *

Uma propriedade de um evento. Exemplos incluem PostTime, SPIDe LoginName. Procure cada evento listado no WMI Provider para classes e propriedades de Eventos de Servidor para determinar quais as propriedades que detém. Por exemplo, o evento DDL_DATABASE_LEVEL_EVENTS detém as DatabaseName propriedades e.UserName Também herda os SQLInstance, LoginName, PostTime, SPID, e ComputerName propriedades dos seus eventos pais.

  • , ... n

    Indica que event_property pode ser consultado várias vezes, separados por vírgulas.

  • *

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

event_type

Qualquer evento contra o qual uma notificação de evento possa ser criada. Para uma lista de eventos disponíveis, consulte WMI Provider para classes e propriedades de Eventos de Servidor. Os nomes dos tipos de evento correspondem aos mesmos event_type | event_group que podem ser especificados quando cria manualmente uma notificação de evento usando CREATE EVENT NOTIFICATION. Exemplos de tipos de evento incluem CREATE_TABLE, LOCK_DEADLOCK, DDL_USER_EVENTS, e TRC_DATABASE.

Observação

Certos procedimentos armazenados do sistema que realizam operações semelhantes a DDL também podem lançar notificações de eventos. Teste as notificações dos seus eventos para determinar as suas respostas aos procedimentos armazenados do sistema que são executados. Por exemplo, a instrução e CREATE TYPE o sp_addtype procedimento armazenado disparam ambos uma notificação de evento criada num CREATE_TYPE evento. No entanto, o sp_rename procedimento armazenado não lança notificações de eventos. Para mais informações, consulte Eventos DDL.

where_condition

Um WHERE predicado de consulta de cláusula, composto por nomes event_property e operadores lógicos e de comparação. O where_condition determina o âmbito em que a notificação de evento correspondente é registada na base de dados alvo. Também pode funcionar como um filtro para direcionar um esquema ou objeto específico a partir do qual consultar event_type. Para mais informações, consulte a secção de Observações .

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

Observações

A where_condition da sintaxe WMI Provider for Server Events determina o seguinte:

  • O âmbito pelo qual o fornecedor tenta recuperar a event_type especificada: o nível do servidor, nível da base de dados ou nível do objeto (o único objeto atualmente suportado é a fila). Em última análise, este âmbito determina o tipo de notificação de evento criada na base de dados alvo. Este processo chama-se registo de notificações de eventos.

  • A base de dados, o esquema e o objeto, quando apropriado, onde se deve registar.

O WMI Provider for Server Events utiliza um algoritmo bottom-up, first-fit, para produzir o âmbito mais estreito possível para o subjacente EVENT NOTIFICATION. O algoritmo tenta minimizar a atividade interna no tráfego do servidor e da rede entre a instância do SQL Server e o processo anfitrião do WMI. O prestador examina o event_type especificado na FROM cláusula e as condições da WHERE cláusula, e tenta registar o subjacente EVENT NOTIFICATION com o âmbito mais restrito possível. Se o fornecedor não conseguir registar-se no âmbito mais restrito, tenta registar-se em escopos sucessivamente superiores até que o registo seja finalmente bem-sucedido. Se atingir o escopo mais alto, o nível do servidor) e falhar, devolve um erro ao consumidor.

Por exemplo, se DatabaseName='AdventureWorks2022' for especificado na WHERE cláusula, o fornecedor tenta registar uma notificação de evento na AdventureWorks2025 base de dados. Se a AdventureWorks2025 base de dados existir e o cliente que chama tiver as permissões necessárias para criar uma notificação de evento em AdventureWorks2025, o registo é bem-sucedido. Caso contrário, é feita uma tentativa de registar a notificação do evento ao nível do servidor. O registo é bem-sucedido se o cliente WMI tiver as permissões necessárias. No entanto, neste cenário, os eventos não são devolvidos ao cliente até que a AdventureWorks2025 base de dados seja criada.

O where_condition pode também atuar como um filtro para limitar adicionalmente a consulta a uma base 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 registo, esta consulta WQL pode ser registada tanto ao nível da base de dados como do servidor. No entanto, mesmo que esteja registado ao nível do servidor, o fornecedor acaba por filtrar quaisquer ALTER_TABLE eventos que não se apliquem à Sales.SalesOrderDetail tabela. Por outras palavras, o fornecedor devolve apenas as propriedades dos ALTER_TABLE eventos que ocorrem nessa tabela específica.

Se uma expressão composta como DatabaseName='AW1' OR DatabaseName='AW2' a for especificada, tenta-se registar uma única notificação de evento no âmbito do servidor em vez de duas notificações de evento separadas. O registo é bem-sucedido se o cliente que chama tiver permissões.

Se SchemaName='X' AND ObjectType='Y' AND ObjectName='Z' todas forem especificadas na WHERE cláusula, tenta-se registar a notificação do evento diretamente no objeto Z no esquema X. O registo é bem-sucedido se o cliente tiver permissões. Atualmente, os eventos ao nível do objeto são suportados apenas em filas, e apenas para a QUEUE_ACTIVATIONevent_type.

Nem todos os eventos podem ser consultados num âmbito específico. Por exemplo, uma consulta WQL num evento de traço como Lock_Deadlock, ou num grupo de eventos de traço como TRC_LOCKS, só pode ser registada ao nível do servidor. De forma semelhante, o CREATE_ENDPOINT evento e o DDL_ENDPOINT_EVENTS grupo de eventos também podem ser registados apenas ao nível do servidor. Para mais informações sobre o âmbito adequado para o registo de eventos, consulte Designing Event Notifications. Uma tentativa de registar uma consulta WQL cujo event_type só pode ser registado ao nível do servidor é sempre feita ao nível do servidor. O registo é bem-sucedido se o cliente WMI tiver permissões. Caso contrário, um erro é devolvido ao cliente. Em alguns casos, no entanto, ainda pode usar a WHERE cláusula como filtro para eventos ao nível do servidor com base nas propriedades que correspondem ao evento. Por exemplo, muitos eventos de traço têm uma DatabaseName propriedade que pode ser usada na WHERE cláusula como filtro.

Notificações de eventos com âmbito de servidor são criadas na master base de dados e podem ser consultadas para obter metadados usando a vista de catálogo sys.server_event_notifications .

Notificações de eventos com âmbito de base de dados ou objetos são criadas na base de dados especificada e podem ser consultadas para metadados usando a vista de catálogo sys.event_notifications . (Deve prefixar a vista de catálogo com o nome da base de dados correspondente.)

Examples

Os exemplos de código neste artigo usam o banco de dados de exemplo AdventureWorks2025 ou AdventureWorksDW2025, que pode ser descarregado da página inicial de Exemplos e Projetos da Comunidade do Microsoft SQL Server.

A. Consulta para eventos no âmbito do servidor

A consulta WQL seguinte recupera todas as propriedades do evento de qualquer SERVER_MEMORY_CHANGE evento de rastreio que ocorra na instância do SQL Server.

SELECT * FROM SERVER_MEMORY_CHANGE

B. Consulta a eventos no âmbito da base de dados

A consulta WQL seguinte recupera propriedades específicas de eventos para qualquer evento que ocorra na AdventureWorks2025 base de dados e exista no grupo de DDL_DATABASE_LEVEL_EVENTS eventos.

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

C. Consulta a eventos no âmbito da base de dados, filtrando por esquema e objeto

A consulta seguinte recupera todas as propriedades do evento para qualquer ALTER_TABLE evento que ocorra na tabela Sales.SalesOrderDetail.

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