Share via


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

管理應用程式可藉由發出 WMI 查詢語言 (WQL) 陳述式,使用 WMI Provider for Server Events 來存取 SQL Server 事件。WQL 是結構化查詢語言 (SQL) 的簡化子集,具有一些 WMI 特定的延伸模組。在使用 WQL 時,應用程式會針對 SQL Server 的特定執行個體、資料庫或資料庫物件 (目前唯一支援的物件是佇列) 來擷取事件類型。WMI Provider for Server Events 會將查詢轉譯為事件通知,此通知會在目標資料庫中針對資料庫範圍或物件範圍的事件通知而建立,或在 master 資料庫中針對伺服器範圍的事件通知而建立。

例如,請看下列的 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 查詢的 FROM 子句中的引數 (DDL_DATABASE_LEVEL_EVENTS) 可以是能在其上建立事件通知的任何有效事件。SELECT 和 WHERE 子句中的引數可以指定與事件或其上層事件相關的任何事件屬性。如需有效事件和事件屬性的清單,請參閱<伺服器事件類別和屬性的 WMI 提供者>。

下列 WQL 語法會由 WMI Provider for Server Events 明確支援。也可以指定其他的 WQL 語法,但該語法並非此提供者所專屬,而會改由其他的 WMI 主機服務進行剖析。如需有關 WMI 查詢語言的詳細資訊,請參閱 Microsoft Developer Network (MSDN) 上的 WQL 文件集。

語法

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

引數

  • event_property
    這是事件的屬性。範例包括 PostTime、SPID 和 LoginName。請查閱<WMI Provider for Server Events 類別和屬性>中所列的每個事件,以判斷事件所保存的屬性。例如,DDL_DATABASE_LEVEL_EVENTS 事件會保存 DatabaseName 和 UserName 屬性。它也會從其上層事件繼承 SQLInstance、LoginName、PostTime、SPID 和 ComputerName 屬性。

  • ,...n
    指出可以查詢 event_property 多次,並以逗號分隔。

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

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

    [!附註]

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

  • where_condition
    這是 WHERE 子句查詢述詞,由 event_property 名稱以及邏輯和比較運算子組成。where_condition 會判斷對應的事件通知在目標資料庫中註冊的範圍。這個引數也可以當做篩選器,以鎖定特定的結構描述或物件來從其查詢 event_type。如需詳細資訊,請參閱本主題稍後的「備註」一節。

    只有 = 運算子可以搭配 DatabaseName、SchemaName 和 ObjectName 使用。其他運算式無法搭配這些事件屬性使用。

備註

WMI Provider for Server Event 語法的 where_condition 可判斷下列項目:

  • 提供者嘗試用來擷取指定之 event_type 的範圍:伺服器層級、資料庫層級或物件層級 (目前唯一支援的物件是佇列)。這個範圍最終會判斷在目標資料庫中所建立之事件通知的類型。這個程序稱為事件通知註冊。

  • 可以其上註冊之資料庫、結構描述和物件 (視何者適當)。

WMI Provider for Server Events 會使用由下而上 (Bottom-Up)、最先合適 (First-Fit) 演算法,針對基礎 EVENT NOTIFICATION 產生最小的可能範圍。此種演算法會嘗試將伺服器上的內部活動以及 SQL Server 執行個體和 WMI 主機處理序之間的網路傳輸量降至最低。提供者會檢查在 FROM 子句以及 WHERE 子句的條件中指定的 event_type,並嘗試用最小的可能範圍註冊基礎的 EVENT NOTIFICATION。如果提供者不能以最窄的範圍註冊,就會嘗試以連續的較高範圍註冊,直到註冊終於成功為止。如果在達到最高的範圍 (伺服器層級) 時仍舊失敗,就會對取用者傳回錯誤。

例如,如果在 WHERE 子句中指定 DatabaseName='AdventureWorks',則提供者會嘗試在 AdventureWorks 資料庫中註冊事件通知。如果 AdventureWorks 資料庫存在,而且呼叫用戶端具有在 AdventureWorks 中建立事件通知的必要權限,註冊作業就會成功,否則系統會嘗試在伺服器層級註冊事件通知。如果 WMI 用戶端擁有必要的權限,註冊就會成功。不過,在此種情況下,在建立 AdventureWorks 資料庫之前,不會對用戶端傳回事件。

where_condition 也可以當做篩選器,以條件式地將查詢限制於特定的資料庫、結構描述或物件。例如,請看下列的 WQL 查詢:

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

依註冊程序的結果,這個 WQL 查詢可能會註冊於資料庫或伺服器層級。不過,即使此查詢註冊於伺服器層級,提供者最終仍會篩選出不適用於 AdventureWorks.Sales.SalesOrderDetail 資料表的任何 ALTER_TABLE 事件。換言之,提供者只會傳回在該特定資料表上所發生之 ALTER_TABLE 事件的屬性。

如果指定了 DatabaseName='AW1' OR DatabaseName='AW2' 之類的複合運算式,則會嘗試以伺服器範圍註冊單一的事件通知,而不會註冊兩個個別的事件通知。如果呼叫用戶端擁有權限,註冊就會成功。

如果 SchemaName='X' AND ObjectType='Y' AND ObjectName='Z' 都指定在 WHERE 子句中,就會嘗試直接在 X 結構描述的 Z 物件上註冊事件通知。如果用戶端擁有權限,註冊就會成功。請注意,目前物件層級的事件僅在佇列上受到支援,而且只為 QUEUE_ACTIVATION event_type 提供支援。

請注意,並非所有事件都可以在任何的特定範圍上查詢。例如,在追蹤事件 (例如 Lock_Deadlock) 或追蹤事件群組 (例如 TRC_LOCKS) 上的 WQL 查詢都只能在伺服器層級註冊。同樣地,CREATE_ENDPOINT 事件和 DDL_ENDPOINT_EVENTS 事件群組也只能在伺服器層級註冊。如需有關註冊事件適用範圍的詳細資訊,請參閱<設計事件通知>。event_type 只能註冊於伺服器層級的 WQL 查詢一定會在伺服器層級進行註冊。如果 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'