了解用于服务器事件的 WMI 提供程序

适用于SQL Server

使用服务器事件的 WMI 提供程序,可以使用 Windows Management Instrumentation (WMI) 监视 SQL Server 中的事件。 提供程序的工作原理是将 SQL Server 转换为托管 WMI 对象。 WMI 可以使用此提供程序利用任何可以在 SQL Server 中生成事件通知的事件。 此外,作为与 WMI 交互的管理应用程序,SQL Server 代理可以响应这些事件,从而增加早期版本中SQL Server 代理涵盖的事件范围。

SQL Server 代理等管理应用程序可以通过发出 WMI 查询语言(WQL)语句,使用 WMI Provider for Server 事件访问 SQL Server 事件。 WQL 是结构化查询语言 (SQL) 的简化子集,它还包含一些特定于 WMI 的扩展。 在使用 WQL 时,应用程序将针对特定数据库或数据库对象来检索事件类型。 WMI Provider for Server Events 会将查询转换成事件通知,实际上就是在目标数据库中创建事件通知。 有关事件通知在 SQL Server 中的工作方式的详细信息,请参阅 WMI Provider for Server Events 概念。 可查询的事件列在 WMI Provider for Server Events 类和属性

当发生触发事件通知以发送消息的事件时,该消息将转到该名称SQL/Notifications/ProcessWMIEventProviderNotification/v1.0中的msdb预定义目标服务。 服务将事件放入名为的预定义队列msdbWMIEventProviderNotificationQueue中。 (服务与队列在首次连接到 SQL Server 时由提供程序动态创建。然后,提供程序从此队列中读取事件数据,并将其转换为托管对象格式(MOF),然后再将其返回到应用程序。 下图显示了此过程。

用于服务器事件的 WMI 提供程序的流程图。

例如,请考虑下列 WQL 查询:

SELECT * FROM DDL_DATABASE_LEVEL_EVENTS
WHERE DatabaseName = 'AdventureWorks2022';

在响应该查询时,WMI Provider for Server Events 将在目标数据库中创建等效的事件通知:

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

在此示例中, SQLWEP_76CF38C1_18BB_42DD_A7DC_C8820155B0E9 是一个由前缀 SQLWEP_ 和 GUID 构成的 Transact-SQL 标识符。 SQLWEP 为每个标识符创建一个新的 GUID。 子句中的TO SERVICEA7E5521A-1CA6-4741-865D-826F804E5135是标识数据库中的中转站实例的 msdb GUID。

有关如何使用 WQL 的详细信息,请参阅 将 WQL 与用于服务器事件的 WMI 提供程序配合使用。

管理应用程序通过连接到提供程序定义的 WMI 命名空间,将 WMI Provider for Server 事件定向到 SQL Server 实例。 Windows WMI 服务将此命名空间映射到提供程序 DLL, sqlwep.dll并将其加载到内存中。 提供程序管理每个 SQL Server 实例的服务器事件的 WMI 命名空间, \\.\<root>\Microsoft\SqlServer\ServerEvents\<instance_name>格式默认为 <instance_name> MSSQLSERVER。 有关如何连接到 SQL Server 实例的 WMI 命名空间的详细信息,请参阅 将 WQL 与用于服务器事件的 WMI 提供程序配合使用。

提供程序 DLL sqlwep.dll仅加载一次到服务器的操作系统的 WMI 主机服务,而不考虑服务器上的 SQL Server 实例数。

有关使用 WMI 提供程序的服务器事件的SQL Server 代理管理应用程序的示例,请参阅示例:使用 WMI 提供程序创建SQL Server 代理警报。 有关使用托管代码中用于服务器事件的 WMI 提供程序的管理应用程序的示例,请参阅 示例:将 WMI 事件提供程序与 .NET Framework 配合使用。 有关 Microsoft .NET Framework SDK 中的 WMI 的详细信息。