共用方式為


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

管理應用程式會發出 WMI 查詢語言 (WQL) 語句,以使用伺服器事件的 WMI 提供者存取 SQL Server 事件。 WQL 是結構化查詢語言 (SQL) 的簡化子集,具有一些 WMI 特定的擴充功能。 在使用 WQL 時,應用程式會針對 SQL Server、資料庫或資料庫物件的特定實例擷取事件類型(目前唯一支援的對像是佇列)。 WMI Provider for Server Events 會將查詢轉譯成事件通知,該通知是在資料庫範圍或物件範圍事件通知的目標資料庫中建立,或在伺服器範圍事件通知的主資料庫中建立。

例如,請考慮下列 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  

WQL 查詢子DDL_DATABASE_LEVEL_EVENTS句中的FROM自變數可以是任何有效的事件,可以建立事件通知。 和 WHERE 子句中的SELECT自變數可以指定與事件或其父事件相關聯的任何事件屬性。 如需有效事件和事件屬性的清單,請參閱事件通知(資料庫引擎)。

WMI Provider for Server Events 明確支援下列 WQL 語法。 可以指定其他 WQL 語法,但並非此提供者專屬,而是由 WMI 主機服務剖析。 如需 WMI 查詢語言的詳細資訊,請參閱Microsoft開發人員網路 (MSDN) 上的 WQL 檔。

語法

  
SELECT { event_property [ ,...n ] | * }  
FROM event_type   
WHERE where_condition  

引數

event_property
這是事件的屬性。 範例包括 PostTimeSPIDLoginName。 查閱 WMI Provider for Server 事件類別和屬性中列出的每個事件,以判斷其保留的屬性。 例如,DDL_DATABASE_LEVEL_EVENTS事件會保存 DatabaseNameUserName 屬性。 它也會從其父事件繼承 SQLInstanceLoginNamePostTimeSPIDComputerName 屬性。

...n
表示event_property可以多次查詢,並以逗號分隔。

*
指定查詢與事件相關聯的所有屬性。

event_type
這是可以建立事件通知的任何事件。 如需可用事件的清單,請參閱 伺服器事件類別和屬性的 WMI 提供者。 請注意,事件類型名稱會對應至使用 CREATE EVENT NOTIFICATION 手動建立事件通知時可以指定的相同event_type | event_group。 事件類型的範例包括CREATE_TABLE、LOCK_DEADLOCK、DDL_USER_EVENTS和TRC_DATABASE。

注意

某些執行類似 DDL 作業的系統預存程式也可以引發事件通知。 測試您的事件通知,以判斷其對執行之系統預存程序的回應。 例如,CREATE TYPE 語句和 sp_addtype 預存程式都會引發在CREATE_TYPE事件上建立的事件通知。 不過, sp_rename 預存程式不會引發任何事件通知。 如需詳細資訊,請參閱DDL 事件

where_condition
這是由event_property名稱和邏輯和比較運算子所組成的 WHERE 子句查詢述詞。 where_condition會決定目標資料庫中註冊對應事件通知的範圍。 它也可以做為篩選條件,以目標為要查詢 event_type的特定架構或物件。 如需詳細資訊,請參閱本主題稍後的一節。

=只有操作數可以搭配DatabaseNameSchemaNameObjectName一起使用。 其他表達式不能與這些事件屬性搭配使用。

備註

WMI Provider for Server Events 語法的where_condition會決定下列各項:

  • 提供者嘗試擷取指定 event_type的範圍:伺服器層級、資料庫層級或物件層級(目前唯一支援的對像是佇列)。 最後,此範圍會決定在目標資料庫中建立的事件通知類型。 此程序稱為事件通知註冊。

  • 要註冊的資料庫、架構和物件,在適當情況下。

伺服器事件的 WMI 提供者會使用由下而上、最符合的演算法,為基礎 EVENT NOTIFICATION 產生最窄的範圍。 此演算法會嘗試將 SQL Server 實例與 WMI 主機進程之間的內部活動與網路流量降到最低。 提供者會 檢查 FROM 子句中指定的event_type ,以及 WHERE 子句中的條件,並嘗試以最窄的範圍註冊基礎 EVENT NOTIFICATION。 如果提供者無法在最窄的範圍註冊,它會嘗試在連續較高的範圍註冊,直到註冊最終成功為止。 如果達到伺服器層級的最高範圍且失敗,則會將錯誤傳回給取用者。

例如,如果在 WHERE 子句中指定 DatabaseName=**'AdventureWorks'**,提供者會嘗試在 AdventureWorks2012 資料庫中註冊事件通知。 如果 AdventureWorks2012 資料庫存在,且呼叫端用戶端具有在 AdventureWorks2012建立事件通知所需的許可權,註冊就會成功。 否則,嘗試在伺服器層級註冊事件通知。 如果 WMI 用戶端具有必要的許可權,註冊就會成功。 不過,在此案例中,在 AdventureWorks2012 資料庫建立之前,不會將事件傳回給用戶端。

where_condition也可以做為篩選條件,以將查詢額外限製為特定資料庫、架構或物件。 例如,請考慮下列 WQL 查詢:

SELECT * FROM ALTER_TABLE   
WHERE DatabaseName = 'AdventureWorks' AND SchemaName = 'Sales'   
    AND ObjectType='Table' AND ObjectName = 'SalesOrderDetail'  

根據註冊程序的結果,此 WQL 查詢可能會在資料庫或伺服器層級註冊。 不過,即使已在伺服器層級註冊,提供者最終還是會篩選 ALTER_TABLE 任何不適用於 AdventureWorks.Sales.SalesOrderDetail 數據表的事件。 換句話說,提供者只會傳回在該特定數據表上發生的事件屬性 ALTER_TABLE

如果指定了 OR DatabaseName='AW2' 之類的DatabaseName='AW1'複合表達式,則會嘗試在伺服器範圍註冊單一事件通知,而不是兩個不同的事件通知。 如果呼叫用戶端具有許可權,註冊就會成功。

如果 SchemaName='X' AND ObjectType='Y' AND ObjectName='Z' 子句中WHERE都指定了 ,則會嘗試直接在架構 X中的對象Z上註冊事件通知。 如果用戶端具有許可權,註冊就會成功。 請注意,目前只有佇列支援物件層級事件,而且只支援QUEUE_ACTIVATION event_type

請注意,並非所有事件都可以在任何特定範圍查詢。 例如,追蹤事件上的 WQL 查詢,例如Lock_Deadlock,或追蹤事件群組,例如TRC_LOCKS,只能在伺服器層級註冊。 同樣地,CREATE_ENDPOINT事件和DDL_ENDPOINT_EVENTS事件群組也只能在伺服器層級註冊。 如需註冊事件之適當範圍的詳細資訊,請參閱 設計事件通知。 嘗試註冊 WQL 查詢, 其event_type 只能在伺服器層級註冊,一律是在伺服器層級進行。 如果 WMI 用戶端具有許可權,註冊就會成功。 否則,錯誤會傳回給用戶端。 不過,在某些情況下,您仍然可以根據對應至事件的屬性,使用 WHERE 子句做為伺服器層級事件的篩選。 例如,許多追蹤事件都有 DatabaseName 可在WHERE子句中使用做為篩選的屬性。

伺服器範圍的事件通知是在 master 資料庫中建立,而且可以使用sys.server_event_notifications目錄檢視來查詢元數據

資料庫範圍或物件範圍事件通知是在指定的資料庫中建立,而且可以使用sys.event_notifications目錄檢視來查詢元數據。 (您必須在目錄檢視前面加上對應的資料庫名稱。

範例

A. 查詢伺服器範圍中的事件

下列 WQL 查詢會擷取 SQL Server 實例上發生之任何 SERVER_MEMORY_CHANGE 追蹤事件的所有事件屬性。

SELECT * FROM SERVER_MEMORY_CHANGE  

B. 查詢資料庫範圍的事件

下列 WQL 查詢會擷取資料庫中發生 AdventureWorks 且存在於事件群組下 DDL_DATABASE_LEVEL_EVENTS 之任何事件的特定事件屬性。

SELECT SPID, SQLInstance, DatabaseName FROM DDL_DATABASE_LEVEL_EVENTS   
WHERE DatabaseName = 'AdventureWorks'   

C. 查詢資料庫範圍的事件,並依架構和對象進行篩選

下列查詢會擷取數據表 AdventureWorks.Sales.SalesOrderDetail上發生之任何ALTER_TABLE事件的所有事件屬性。

SELECT * FROM ALTER_TABLE   
WHERE DatabaseName = 'AdventureWorks' AND SchemaName = 'Sales'   
    AND ObjectType='Table' AND ObjectName = 'SalesOrderDetail'  

另請參閱

伺服器事件的 WMI 提供者概念
事件通知(資料庫引擎)