管理應用程式會發出 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 查詢子FROM句中的DDL_DATABASE_LEVEL_EVENTS自變數可以是任何有效的事件,可以建立事件通知。 和 SELECT 子句中的WHERE自變數可以指定與事件或其父事件相關聯的任何事件屬性。 如需有效事件和事件屬性的清單,請參閱事件通知(資料庫引擎)。
WMI Provider for Server Events 明確支援下列 WQL 語法。 可以指定其他 WQL 語法,但並非此提供者專屬,而是由 WMI 主機服務剖析。 如需 WMI 查詢語言的詳細資訊,請參閱Microsoft開發人員網路 (MSDN) 上的 WQL 檔。
語法
SELECT { event_property [ ,...n ] | * }
FROM event_type
WHERE where_condition
引數
event_property
這是事件的屬性。 範例包括 PostTime、SPID 和 LoginName。 查閱 WMI Provider for Server 事件類別和屬性中列出的每個事件,以判斷其保留的屬性。 例如,DDL_DATABASE_LEVEL_EVENTS事件會保存 DatabaseName 和 UserName 屬性。 它也會從其父事件繼承 SQLInstance、 LoginName、 PostTime、 SPID和 ComputerName 屬性。
,...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的特定架構或物件。 如需詳細資訊,請參閱本主題稍後的一節。
=只有操作數可以搭配DatabaseName、 SchemaName和ObjectName一起使用。 其他表達式不能與這些事件屬性搭配使用。
備註
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='AW1' 之類的DatabaseName='AW2'複合表達式,則會嘗試在伺服器範圍註冊單一事件通知,而不是兩個不同的事件通知。 如果呼叫用戶端具有許可權,註冊就會成功。
如果 SchemaName='X' AND ObjectType='Y' AND ObjectName='Z' 子句中WHERE都指定了 ,則會嘗試直接在架構 Z中的對象X上註冊事件通知。 如果用戶端具有許可權,註冊就會成功。 請注意,目前只有佇列支援物件層級事件,而且只支援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. 查詢資料庫範圍的事件,並依架構和對象進行篩選
下列查詢會擷取數據表 ALTER_TABLE上發生之任何AdventureWorks.Sales.SalesOrderDetail事件的所有事件屬性。
SELECT * FROM ALTER_TABLE
WHERE DatabaseName = 'AdventureWorks' AND SchemaName = 'Sales'
AND ObjectType='Table' AND ObjectName = 'SalesOrderDetail'