分享方式:


使用伺服器事件的 WMI 提供者

適用於:SQL Server

本文提供您應該先考慮的指導方針,再使用伺服器事件的 WMI 提供者進行程序設計。

啟用 Service Broker

WMI Provider for Server 事件的運作方式是將事件 WQL 查詢轉譯為您目標資料庫中的事件通知。 瞭解事件通知在針對提供者進行程序設計時如何運作對您很有用。 如需詳細資訊,請參閱 伺服器事件的 WMI 提供者概念

特別是,因為 WMI 提供者所建立的事件通知會使用 SQL Server 來傳送伺服器事件的相關訊息,因此無論事件產生的位置,都必須啟用此服務。 如果您的程式在伺服器實例上查詢事件,則必須啟用該實例中的 msdb Service Broker,因為這是提供者所建立的目標 Service Broker 服務位置(名為 SQL/Notifications/ProcessWMIEventProviderNotification/v1.0)。 如果您的程式查詢資料庫中或特定資料庫物件上的事件,則必須啟用該目標資料庫中的 Service Broker。 如果在部署應用程式之後未啟用對應的 Service Broker,基礎事件通知所產生的任何事件都會傳送至事件通知所使用的服務佇列,但在啟用 Service Broker 之前不會傳回至 WMI 管理應用程式。

下列查詢會決定在伺服器實例上啟用哪些 Service Broker,以及 Broker 實例 GUID:

SELECT name, is_broker_enabled, service_broker_guid FROM sys.databases;

的 Service Broker GUID msdb 特別感興趣,因為這是提供者目標服務的位置。

若要在資料庫中啟用 Service Broker,請使用 ALTER DATABASE 語句的 ENABLE_BROKER SET 選項。

指定 連接字串

應用程式會藉由連線至提供者所定義的 WMI 命名空間,將 WMI Provider for Server 事件導向至 SQL Server 的實例。 Windows WMI 服務會將此命名空間對應至提供者 DLL、Sqlwep.dll,並將其載入記憶體中。 SQL Server 的每個實例都有自己的 WMI 命名空間,預設為:\\.\root\Microsoft\SqlServer\ServerEvents\instance_name instance_name SQL Server 的預設安裝中預設為 MSSQLSERVER。

許可權和伺服器驗證

若要存取伺服器事件的 WMI 提供者,WMI 管理應用程式來源的客戶端必須對應至應用程式 連接字串 所指定 SQL Server 實例中的 Windows 驗證登入或群組。

許可權和事件通知範圍

伺服器事件的 WMI 提供者會將 WQL 查詢轉譯成目標資料庫中的事件通知。 因此,呼叫端應用程式不僅必須具備存取提供者所需的最低許可權,而且必須在資料庫中擁有正確的許可權,才能建立必要的事件通知。 以下是權限:

  • 若要建立限定於資料庫的事件通知,至少需要目前資料庫中的 CREATE DATABASE DDL EVENT NOTIFICATION 許可權。

  • 若要在限定於伺服器的 DDL 語句上建立事件通知,至少需要伺服器的 CREATE DDL EVENT NOTIFICATION 許可權。

  • 若要在追蹤事件上建立事件通知,至少需要伺服器的 CREATE TRACE EVENT NOTIFICATION 許可權。

  • 若要建立範圍設定為佇列的事件通知,至少需要佇列的 ALTER 許可權。

如需 WQL 查詢範圍的相關信息,請參閱 搭配伺服器事件的 WMI 提供者使用 WQL。

若要說明範圍,請考慮包含下列 WQL 查詢的 WMI 提供者應用程式:

SELECT * FROM ALTER_TABLE
WHERE DatabaseName = "AdventureWorks2022"
    AND SchemaName = "Person"
    AND ObjectName = "Person"
    AND ObjectType = "TABLE";

WMI 提供者會將此查詢轉譯成資料庫中 AdventureWorks2022 建立的事件通知。 這表示呼叫端必須具有建立這類事件通知的必要許可權,特別是資料庫中的 CREATE DATABASE DDL EVENT NOTIFICATION 許可權 AdventureWorks2022

如果 WQL 查詢指定範圍在伺服器層級的事件通知,例如發出查詢 SELECT * FROM ALTER_TABLE,呼叫端應用程式必須具有伺服器層級 CREATE DDL EVENT NOTIFICATION 許可權。 伺服器範圍的事件通知會儲存在 master 資料庫中。 您可以使用 sys.server_event_notifications 目錄檢視來查看其元數據。

注意

WMI 提供者所建立的事件通知範圍(伺服器、資料庫或物件)最終取決於WMI提供者所使用的許可權驗證程序結果。 這會受到呼叫提供者之使用者的許可權集合所影響,以及正在查詢之資料庫的驗證。

在上一個範例中,提供者會先嘗試建立範圍設定為資料庫的事件通知(ON DATABASE)。 如果提供者確認資料庫存在,且呼叫端具有建立事件通知的必要許可權,註冊就會成功。 如果它未成功,提供者會嘗試在伺服器上建立事件通知 (ON SERVER)。 假設此嘗試成功,伺服器上發生的所有 ALTER_TABLE 事件都會從 SQL Server 行程傳送至 WMI 服務進程。 不過,提供者會篩選掉任何不適用於 AdventureWorks2022 資料庫的事件。 雖然此程式可能會增加事件範圍所需的網路流量量,但此程式也可讓您彈性地在資料庫上註冊 WQL 查詢,再建立資料庫並啟動 DDL 活動之後接收事件數據。

許可權和訊息驗證

如果下列兩個條件成立,WMI 提供者不會傳送事件通知的訊息:

  • 透過 WMI 提供者建立事件通知的使用者已不存在於資料庫中,或不再具有建立類似事件通知的必要許可權。

  • 事件通知會在下列事件上建立:

    • DROP_LOGIN

    • ALTER_LOGIN

    • DROP_USER

    • ALTER_USER

    • ADD_ROLE_MEMBER

    • DROP_ROLE_MEMBER

    • ADD_SERVER_ROLE_MEMBER

    • DROP_SERVER_ROLE_MEMBER

    • DENYREVOKE (僅適用於 ALTER DATABASEALTER ANY DATABASE EVENT NOTIFICATIONCREATE DATABASE DDL EVENT NOTIFICATIONCONTROL SERVERALTER ANY EVENT NOTIFICATIONCREATE DDL EVENT NOTIFICATION、 或 CREATE TRACE EVENT NOTIFICATION 許可權。

在用戶端使用事件數據

在目標資料庫中建立必要事件通知的 WMI 提供者之後,事件通知會將事件數據傳送至名為 SQL/Notifications/ProcessWMIEventProviderNotification/v1.0 的目標服務msdb。 目標服務會將事件放入名為 WMIEventProviderNotificationQueuemsdb佇列中。 (當提供者第一次連線到 SQL Server 時,服務與佇列都會動態建立。提供者接著會從這個佇列讀取 XML 事件數據,並將它轉換成 Managed 物件格式 (MOF),然後再將它傳回用戶端應用程式。 MOF 數據是由 WQL 查詢要求為 Common Information Model (CIM) 類別定義的事件屬性所組成。 每個屬性都有對應的 CIM 類型。 例如, SPID 屬性會以 CIM 類型 Sint32 傳回。 每個屬性的 CIM 類型都會列在 WMI 事件類別和屬性WMI 提供者下。