了解 WMI Provider for Server Events
借助适用于服务器事件的 WMI 提供程序,可以使用 Windows Management Instrumentation (WMI) 监视SQL Server中的事件。 提供程序的工作原理是将SQL Server转换为托管 WMI 对象。 WMI 可以使用此提供程序在 SQL Server 中生成事件通知的任何事件。 此外,作为与 WMI 交互的管理应用程序,SQL Server 代理可以响应这些事件,从而在早期版本中增加SQL Server 代理涵盖的事件范围。
SQL Server 代理 等管理应用程序可以通过发出 WMI 查询语言 (WQL) 语句,使用 WMI 提供程序的服务器事件访问SQL Server事件。 WQL 是结构化查询语言 (SQL) 的简化子集,它还包含一些特定于 WMI 的扩展。 在使用 WQL 时,应用程序将针对特定数据库或数据库对象来检索事件类型。 WMI Provider for Server Events 会将查询转换成事件通知,实际上就是在目标数据库中创建事件通知。 有关事件通知在 SQL Server 中的工作原理的详细信息,请参阅服务器事件的 WMI 提供程序概念。 可以查询的事件列在 WMI 提供程序的服务器事件类和属性中。
当发生触发事件通知以发送消息的事件时,该消息将转到 msdb 中名为 SQL/Notifications/ProcessWMIEventProviderNotification/v1.0 的预定义目标服务。 该服务将事件放入名为 WMIEventProviderNotificationQueue的 msdb 中的预定义队列中。 (服务和队列在提供程序首次连接到 SQL Server 时由提供程序动态创建。) 提供程序随后从此队列读取事件数据,并将其转换为托管对象格式 (MOF) ,然后再将其返回到应用程序。 下图显示了此过程。
例如,请考虑下列 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
是一个 Transact-SQL 标识符,它由前缀 SQLWEP_
和 GUID 组成。 SQLWEP
为每个标识符创建一个新的 GUID。 子句中的TO SERVICE
值A7E5521A-1CA6-4741-865D-826F804E5135
是标识 msdb 数据库中的代理实例的 GUID。
有关如何使用 WQL 的详细信息,请参阅 将 WQL 与服务器事件的 WMI 提供程序配合使用。
管理应用程序通过连接到提供程序定义的 WMI 命名空间,将用于服务器事件的 WMI 提供程序定向到 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 事件提供程序。 Microsoft .NET Framework SDK 中还提供了有关 WMI 的详细信息。