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 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 uma instância específica do 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 para notificações de eventos no escopo do master
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 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. 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
. 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 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 de servidor. Os nomes de tipo de evento correspondem ao mesmo event_group event_type | que pode ser especificado 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 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 esquema ou objeto específico 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 estreito 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 o event_type especificado na FROM
cláusula e as condições na WHERE
cláusula e tenta registrar o subjacente EVENT NOTIFICATION
com o escopo mais estreito possível. Se o provedor não puder se registrar no escopo mais restrito, ele tentará se registrar em escopos sucessivamente mais altos até que um registro finalmente seja 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 seja 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 a 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'
forem todos especificados na WHERE
cláusula, é feita uma tentativa de registrar a notificação de eventos diretamente no objeto Z
no esquema X
. O registro terá êxito se o cliente tiver as permissões. Atualmente, os eventos no nível do objeto têm suporte apenas em filas e apenas para o QUEUE_ACTIVATION
event_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 DDL_ENDPOINT_EVENTS
grupo de eventos também podem ser registrados apenas 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 no escopo do servidor são criadas no master
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 no escopo do banco de dados ou no escopo do objeto são criadas no banco de dados especificado e podem ser consultadas em busca de metadados usando a exibição do 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 do Transact-SQL deste artigo usa o banco de dados de exemplo AdventureWorks2022
ou AdventureWorksDW2022
, que pode ser baixado da home page Microsoft SQL Server Samples and Community Projects.
R. Consultar 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 ocorra na instância do SQL Server.
SELECT * FROM SERVER_MEMORY_CHANGE
B. Consultar 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'