了解 WMI Provider for Server Events

通过 WMI Provider for Server Events,可以使用 Windows Management Instrumentation (WMI) 监视 SQL Server 中的事件。该提供程序的运行方式是将 SQL Server 转换为托管的 WMI 对象。通过使用该提供程序,WMI 可以利用在 SQL Server 中生成事件通知的任何事件。另外,SQL Server 代理作为与 WMI 交互的管理应用程序,可以对这些事件做出响应,从而使 SQL Server 代理所覆盖的事件范围超过了以前的版本。

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

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

WMI Provider for Server Events 的流程图

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

SELECT * FROM DDL_DATABASE_LEVEL_EVENTS
WHERE DatabaseName = 'AdventureWorks'

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

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

在该示例中,SQLWEP_76CF38C1_18BB_42DD_A7DC_C8820155B0E9 是由前缀 SQLWEP_ 和 GUID 组成的 Transact-SQL 标识符。SQLWEP 为每个标识符创建一个新的 GUID。TO SERVICE 子句中的值 A7E5521A-1CA6-4741-865D-826F804E5135 是用于标识 msdb 数据库中 Broker 实例的 GUID。

有关如何使用 WQL 的详细信息,请参阅将 WQL 与 WMI Provider for Server Events 结合使用

通过连接到由 WMI Provider for Server Events 定义的 WMI 命名空间,管理应用程序将该提供程序定向到 SQL Server 实例。Windows WMI 服务将该命名空间映射到提供程序 DLL Sqlwep.dll,并将它加载到内存中。对于每个 SQL Server 实例,该提供程序均管理着一个针对服务器事件的 WMI 命名空间,格式是:\\.\根目录\Microsoft\SqlServer\ServerEvents\instance_name,其中,instance_name 默认为 MSSQLSERVER。有关如何连接到 SQL Server 实例的 WMI 命名空间的详细信息,请参阅使用 WMI Provider for Server Events

提供程序 DLL Sqlwep.dll 仅会加载一次以载入到服务器操作系统的 WMI 主机服务中,而不管服务器上有多少个 SQL Server 实例。

若要查看使用 WMI Provider for Server Events 的 SQL Server 代理管理应用程序的示例,请参阅示例:使用 WMI Provider for Server Events 创建 SQL Server 代理警报。若要查看通过托管代码使用 WMI Provider for Server Events 的管理应用程序的示例,请参阅示例:与 .NET Framework 结合使用 WMI 事件提供程序。有关 WMI 的详细信息,还可以参考 Microsoft.NET Framework SDK。