訂閱通知涉及建立命令、將通知要求附加到命令,然後執行該命令。查詢通知訂閱必須由資料庫存取介面建立。Transact-SQL 未提供建立查詢通知訂閱的機制。
Database Engine 會立即以命令註冊 Transact-SQL 陳述式的通知。對於不符合查詢通知需求的每一個陳述式,Database Engine 就會立即建立通知。對於符合需求的那些陳述式,就會建立訂閱。應該小心避免將命令傳送給以下伺服器:同時包含符合需求的陳述式以及不符合兩方需求的陳述式。
附註: |
|---|
| Transact-SQL 未提供訂閱通知的方式。SQL Server 內裝載的 CLR 資料存取類別不支援查詢通知。 |
每個查詢通知訂閱都會產生一個通知事件。發生通知之後,SQL Server 就會將通知訂閱移除。因此,需要被再次通知的應用程式,必須以可擷取變更資料的命令要求新的通知。
要求查詢通知並非為交易式。使用命令要求通知時,無論交易是包含命令認可或命令回復,Database Engine 都會註冊該項通知。
查詢通知的訂閱是儲存於執行查詢的資料庫。動態管理檢視 sys.dm_qn_subscriptions 會在目前作用中的查詢通知訂閱上顯示資訊。目錄檢視 sys.internal_tables 則會顯示目前作用中的查詢通知訂閱使用的空間。
使用 SqlClient Managed 提供者選擇通知訂閱策略
要求通知訂閱有兩種方式。*「相依性」*可為查詢通知提供高階介面。應用程式只需要建立相依性類別的介面 (例如 ADO.NET 中的 SqlDependency),註冊處理常式以接收通知事件,然後將相依性物件增加到查詢命令。相依性物件會在發生通知時,呼叫處理常式。
*「通知要求」*可為查詢通知提供較為低階、但較有彈性的介面。和相依性一樣,應用程式會建立通知要求 (例如,ADO.NET 中的 SqlNotificationRequest 執行個體),然後將通知要求附加至查詢命令。和相依性不同的是,通知要求只會要求查詢的通知訂閱。應用程式本身必須從資料庫擷取通知訊息、處理訊息,然後據以採取動作。這允許在應用程式設計方面可有更多彈性,但需要多付出一點心力。通知要求適合在處理通知方面需要彈性的應用程式使用。例如,因為該應用程式存在時,就會終結相依性物件,所以定期執行的應用程式就無法使用相依性。但是,有了通知要求,應用程式就可以在啟動時檢查佇列,並視需要重新整理本機資料快取。
當註冊通知訂閱的應用程式同時身為將會處理通知的應用程式時、當應用程式將會維持繼續執行時,以及在應用程式執行時有資料庫連線可用時,應用程式就可以使用相依性。對於符合這些需求的應用程式,相依性提供可簡單使用查詢通知的方式。應用程式無法使用相依性時,就會使用通知要求。在此情況下,應用程式開發人員必須設計策略,以接收並將訊息處理成對應用程式有意義的訊息。
對於通知使用 SOAP
原始的 HTTP SOAP 支援包括「查詢通知」的支援。包含 <notificationRequest> 標頭的 SOAP 要求可建立查詢的通知訂閱。如同 SqlNotificationRequest 使用,要求者必須從資料庫擷取通知訊息、處理訊息,然後據以採取動作。這種方法十分適合 Web 服務應用程式使用,因為它不需要持續連接 SQL Server。
使用 SQL Server Native Client 進行通知
使用 SQL Server Native Client OLE DB 提供者或是 ODBC 驅動程式的應用程式也可以提交通知要求。如需利用 SQL Server Native Client 應用程式使用查詢通知的詳細資訊,請參閱<Working with Query Notifications>。
請參閱
概念
瞭解何時出現查詢通知
使用 SqlDependency 訂閱查詢通知
使用 SqlNotificationRequest 訂閱查詢通知
附註: