查詢通知 - sys.dm_qn_subscriptions

適用於:SQL Server

傳回伺服器中作用中查詢通知訂閱的相關資訊。 您可以使用此檢視來檢查伺服器或指定資料庫中的作用中訂閱,或檢查指定的伺服器主體。

資料行名稱 資料類型 描述
id int 訂用帳戶的識別碼。
database_id int 執行通知查詢的資料庫識別碼。 此資料庫會儲存與此訂用帳戶相關的資訊。
varbinary(85) 建立並擁有此訂用帳戶之伺服器主體的安全性識別碼。
object_id int 儲存訂用帳戶參數相關資訊的內部資料表識別碼。
創建 datetime 建立訂閱的日期和時間。
timeout int 訂閱的逾時以秒為單位。 在經過此時間之後,通知將會標示為引發。

注意:實際的引發時間可能大於指定的逾時時間。不過,如果使訂閱失效的變更會在指定的逾時之後發生,但在引發訂閱之前,SQL Server 可確保在進行變更時引發。
status int 指出訂用帳戶的狀態。 如需程式代碼清單,請參閱備註底下的表格。

關聯性基數

另一 類型
sys.dm_qn_subscriptions sys.databases database_id 多對一
sys.dm_qn_subscriptions sys.internal_tables object_id 多對一

備註

狀態碼 0 表示未定義的狀態。

下列狀態碼表示因為變更而引發訂用帳戶:

代碼 次要狀態 資訊
65798 因為資料已變更而引發訂閱 插入所觸發的訂用帳戶
65799 因為資料已變更而引發訂閱 刪除
65800 因為資料已變更而引發訂閱 更新
65801 因為資料已變更而引發訂閱 合併
65802 因為資料已變更而引發訂閱 截斷資料表
66048 訂用帳戶因為逾時過期而引發 未定義的資訊模式
66315 因為物件已變更而引發訂閱 物件或使用者已卸載
66316 因為物件已變更而引發訂閱 物件已改變
66565 因為資料庫已中斷連結或卸載而引發訂閱 伺服器或資料庫重新開機
66571 因為資料庫已中斷連結或卸載而引發訂閱 物件或使用者已卸載
66572 因為資料庫已中斷連結或卸載而引發訂閱 物件已改變
67341 訂用帳戶因為伺服器上缺少 od 資源而觸發 訂用帳戶因為伺服器上缺少 od 資源而觸發

下列狀態碼表示訂用帳戶無法建立:

代碼 次要狀態 資訊
132609 訂用帳戶建立失敗,因為不支援 語句 查詢太複雜
132610 訂用帳戶建立失敗,因為不支援 語句 不正確訂用帳戶語句
132611 訂用帳戶建立失敗,因為不支援 語句 訂用帳戶的設定選項無效
132612 訂用帳戶建立失敗,因為不支援 語句 不正確隔離等級
132622 訂用帳戶建立失敗,因為不支援 語句 在內部使用
132623 訂用帳戶建立失敗,因為不支援 語句 超過每個資料表的範本限制

下列狀態碼會在內部使用,並分類為 check kill 和 init 模式:

代碼 次要狀態 資訊
198656 在內部使用:檢查 kill 和 init 模式 未定義的資訊模式
198928 訂用帳戶已終結 因為已附加 db 而引發訂用帳戶
198929 訂用帳戶已終結 因為使用者已卸載而引發訂用帳戶
198930 訂用帳戶已終結 因為重新訂閱而卸載訂用帳戶
198931 訂用帳戶已終結 訂用帳戶已終止
199168 訂閱使用中 未定義的資訊模式
199424 已初始化訂閱,但尚未使用中 未定義的資訊模式

權限

需要伺服器的 VIEW SERVER STATE 許可權。

注意

如果使用者沒有 VIEW SERVER STATE 許可權,此檢視會傳回目前使用者所擁有的訂閱相關資訊。

SQL Server 2022 和更新版本的權限

需要伺服器上的 VIEW SERVER PERFORMANCE STATE 權限。

範例

A. 傳回目前使用者的作用中查詢通知訂閱

下列範例會傳回目前使用者的作用中查詢通知訂閱。 如果使用者具有 VIEW SERVER STATE 許可權,則會傳回伺服器中的所有使用中訂閱。

SELECT id, database_id, sid, object_id, created, timeout, status  
FROM sys.dm_qn_subscriptions;  
GO  

B. 傳回指定使用者的作用中查詢通知訂閱

下列範例會傳回登入 Ruth0 所訂閱的作用中查詢通知訂閱。

SELECT id, database_id, sid, object_id, created, timeout, status  
FROM sys.dm_qn_subscriptions  
WHERE sid = SUSER_SID('Ruth0');  
GO  

C. 傳回查詢通知訂閱的內部資料表中繼資料

下列範例會傳回查詢通知訂閱的內部資料表中繼資料。

SELECT qn.id AS query_subscription_id  
    ,it.name AS internal_table_name  
    ,it.object_id AS internal_table_id  
FROM sys.internal_tables AS it  
JOIN sys.dm_qn_subscriptions AS qn ON it.object_id = qn.object_id  
WHERE it.internal_type_desc = 'QUERY_NOTIFICATION';  
GO  

另請參閱

動態管理檢視和函數 (Transact-SQL)
查詢通知相關的動態管理檢視 (Transact-SQL)
KILL QUERY NOTIFICATION SUBSCRIPTION (Transact-SQL)