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

本主題會提供您使用伺服器事件的 WMI 提供者進行程式設計前應該考慮的指導方針。

啟用 Service Broker

伺服器事件的 WMI 提供者可透過將事件的 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;  

msdb 的 Service Broker GUID 特別需要注意,因為那是提供者目標服務的位置。

若要在資料庫中啟用 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。 在預設安裝SQL Server時,instance_name預設為 MSSQLSERVER。

權限和伺服器驗證

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

權限和事件通知範圍

伺服器事件的 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 = "AdventureWorks2012"   
    AND SchemaName = "Person"  
    AND ObjectName = "Person"  
    AND ObjectType = "TABLE";  

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

如果 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 服務進程。 不過,提供者會篩選出沒有套用到 AdventureWorks 資料庫的任何事件。 雖然此處理可能會增加事件範圍所需的網路流量,但是也可讓您擁有在建立 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

    • DENY 或 REVOKE (僅適用於 ALTER DATABASE、ALTER ANY DATABASE EVENT NOTIFICATION、CREATE DATABASE DDL EVENT NOTIFICATION、CONTROL SERVER、ALTER ANY EVENT NOTIFICATION、CREATE DDL EVENT NOTIFICATION 或 CREATE TRACE EVENT NOTIFICATION 權限)。

使用用戶端上的事件資料

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

另請參閱

伺服器事件的 WMI 提供者概念