搭配伺服器事件的 WMI 提供者使用 WQL
適用於:SQL Server
管理應用程式會發出 WMI 查詢語言 (WQL) 語句,以使用伺服器事件的 WMI 提供者存取 SQL Server 事件。 WQL 是結構化查詢語言 (SQL) 的簡化子集,具有一些 WMI 特定的擴充功能。 在使用 WQL 時,應用程式會針對 SQL Server、資料庫或資料庫物件的特定實例擷取事件類型(目前唯一支援的對像是佇列)。 伺服器事件的 WMI 提供者會將查詢轉譯成事件通知,該通知是在資料庫範圍或物件範圍事件通知的目標資料庫中建立,或在 master
伺服器範圍事件通知的資料庫中建立。
例如,請考慮下列 WQL 查詢:
SELECT * FROM DDL_DATABASE_LEVEL_EVENTS WHERE DatabaseName = 'AdventureWorks2022'
在此查詢中,WMI 提供者會嘗試在目標伺服器上產生此事件通知的對等專案:
USE AdventureWorks2022;
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 [ , ...n ] |*
事件的屬性。 範例包括 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 提供者。 事件類型名稱會對應至當您使用 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
WHERE
子句查詢述詞,由event_property名稱和邏輯和比較運算符組成。 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
。 如果提供者無法在最窄的範圍註冊,它會嘗試在連續較高的範圍註冊,直到註冊最終成功為止。 如果達到伺服器層級的最高範圍且失敗,則會將錯誤傳回給取用者。
例如,如果在 DatabaseName='AdventureWorks2022'
子句中 WHERE
指定 ,提供者會嘗試在 AdventureWorks2022
資料庫中註冊事件通知。 AdventureWorks2022
如果資料庫存在,而且呼叫用戶端具有在 中AdventureWorks2022
建立事件通知的必要許可權,註冊就會成功。 否則,嘗試在伺服器層級註冊事件通知。 如果 WMI 用戶端具有必要的許可權,註冊就會成功。 不過,在此案例中,在建立資料庫之前 AdventureWorks2022
,不會將事件傳回給用戶端。
where_condition也可以做為篩選條件,以將查詢額外限製為特定資料庫、架構或物件。 例如,請考慮下列 WQL 查詢:
SELECT * FROM ALTER_TABLE
WHERE DatabaseName = 'AdventureWorks2022' AND SchemaName = 'Sales'
AND ObjectType='Table' AND ObjectName = 'SalesOrderDetail'
根據註冊程序的結果,此 WQL 查詢可能會在資料庫或伺服器層級註冊。 不過,即使已在伺服器層級註冊,提供者最終也會篩選 ALTER_TABLE
任何未套用至 Sales.SalesOrderDetail
數據表的事件。 換句話說,提供者只會傳回在該特定數據表上發生的事件屬性 ALTER_TABLE
。
如果指定了 之類的 DatabaseName='AW1' OR DatabaseName='AW2'
復合運算式,就會嘗試在伺服器範圍註冊單一事件通知,而不是兩個不同的事件通知。 如果呼叫用戶端具有許可權,註冊就會成功。
如果 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目錄檢視來查詢元數據。 (您必須在目錄檢視前面加上對應的資料庫名稱。
範例
本文 Transact-SQL 程式碼範例使用 AdventureWorks2022
或 AdventureWorksDW2022
範例資料庫,從 Microsoft SQL Server Samples 和 Community Projects (Microsoft SQL Server 範例和社群專案)首頁即可下載。
A. 查詢伺服器範圍中的事件
下列 WQL 查詢會擷取 SQL Server 實例上發生之任何 SERVER_MEMORY_CHANGE
追蹤事件的所有事件屬性。
SELECT * FROM SERVER_MEMORY_CHANGE
B. 查詢資料庫範圍的事件
下列 WQL 查詢會擷取資料庫中發生 AdventureWorks2022
且存在於事件群組下 DDL_DATABASE_LEVEL_EVENTS
之任何事件的特定事件屬性。
SELECT SPID, SQLInstance, DatabaseName FROM DDL_DATABASE_LEVEL_EVENTS
WHERE DatabaseName = 'AdventureWorks2022'
C. 查詢資料庫範圍的事件,並依架構和對象進行篩選
下列查詢會擷取數據表 Sales.SalesOrderDetail
上發生之任何ALTER_TABLE
事件的所有事件屬性。
SELECT * FROM ALTER_TABLE
WHERE DatabaseName = 'AdventureWorks2022' AND SchemaName = 'Sales'
AND ObjectType='Table' AND ObjectName = 'SalesOrderDetail'