了解伺服器事件的 WMI 提供者
伺服器事件的 WMI 提供者可讓您使用 Windows Management Instrumentation (WMI),在 SQL Server 中監視事件。提供者的運作方式是將 SQL Server 轉換成 Managed WMI 物件。使用這個提供者的 WMI 可利用在 SQL Server 中產生事件通知的任何事件。另外,因為 SQL Server Agent 是與 WMI 互動的管理應用程式,所以它可回應這些事件,方法是增加 SQL Server Agent 在舊版本上所涵蓋的事件範圍。
SQL Server Agent 之類的管理應用程式可藉由發出 WMI 查詢語言 (WQL) 陳述式,使用伺服器事件的 WMI 提供者來存取 SQL Server 事件。WQL 是結構化查詢語言 (SQL) 的簡化子集,具有一些 WMI 特定的延伸模組。在使用 WQL 時,應用程式會針對特定的資料庫或資料庫物件來擷取事件類型。伺服器事件的 WMI 提供者會將查詢轉譯為事件通知,以便在目標資料庫中有效地建立事件通知。如需有關事件通知如何在 SQL Server 中運作的詳細資訊,請參閱<事件通知 (Database Engine)>。可以查詢的事件會列在<伺服器事件類別和屬性的 WMI 提供者>中。
當觸發事件通知傳送訊息的事件發生時,訊息會移至 msdb 中,名稱為 SQL/Notifications/ProcessWMIEventProviderNotification/v1.0 之預先定義的目標服務。此服務會將事件放入 msdb 中,名稱為 WMIEventProviderNotificationQueue 之預先定義的佇列 (當此服務手冊連接到 SQL Server 時,提供者會同時動態地建立服務和佇列)。接著,提供者會從此佇列讀取事件資料,並將其轉換為 Managed 物件格式 (MOF),然後再將其傳回到應用程式。下圖顯示這項程序。
例如,請考慮使用下列 WQL 查詢:
SELECT * FROM DDL_DATABASE_LEVEL_EVENTS
WHERE DatabaseName = 'AdventureWorks'
回應此查詢時,伺服器事件的 WMI 提供者會在目標資料庫中建立相等的事件通知:
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 是 GUID,可識別 msdb 資料庫中的 Broker 執行個體。
如需有關如何使用 WQL 的詳細資訊,請參閱<搭配伺服器事件的 WMI 提供者使用 WQL>。
管理應用程式會藉由連接到提供者所定義的 WMI 命名空間,將該伺服器事件的 WMI 提供者導向至 SQL Server 的執行個體。Windows WMI 服務會將此命名空間對應至提供者 DLL (Sqlwep.dll,) 並將其載入至記憶體。提供者會針對 SQL Server 的每個執行個體管理伺服器事件的 WMI 命名空間,而且格式為:\\.\root\Microsoft\SqlServer\ServerEvents\instance_name,其中 instance_name 預設為 MSSQLSERVER。如需有關如何連接到 SQL Server 執行個體之 WMI 命名空間的詳細資訊,請參閱<使用伺服器事件的 WMI 提供者>。
不管伺服器上有多少 SQL Server 執行個體,都只會將提供者 DLL (Sqlwep.dll) 載入到伺服器作業系統的 WMI 主機服務一次。
如需使用伺服器事件的 WMI 提供者之 SQL Server Agent 管理應用程式範例,請參閱<範例:使用伺服器事件的 WMI 提供者建立 SQL Server Agent 警示>。如需在 Magaged 程式碼中使用伺服器事件的 WMI 提供者之管理應用程式範例,請參閱<範例:搭配 .NET Framework 使用 WMI 事件提供者>。在 Microsoft.NET Framework SDK 中也提供有關 WMI 的詳細資訊。