共用方式為


瞭解何時出現查詢通知

查詢通知背後的概念是,除非收到通知訊息,否則應用程式都可以信賴快取資料。如果 SQL Server 無法繼續保證快取資料的可靠性,SQL Server 就會傳送通知訊息。發生下列任一事件時,SQL Server 便會傳送訂閱的查詢通知:

  • 查詢的結果可能有所改變。
  • 訂閱已過期。
  • 伺服器重新啟動。
  • 無法建立查詢通知訂閱 (例如,SELECT 陳述式不符合<為通知建立查詢>中所指定的需求)。
  • 伺服器的負載量過大。
  • 訂閱相依的物件遭到卸除或修改。

請注意,SQL Server 可能會針對未變更資料的事件,或是實際上並不影響查詢結果的變更,而產生回應的查詢通知。例如,當 UPDATE 陳述式變更了查詢所傳回的其中一個資料列時,即使該資料列的新值與舊值相同,還是會引發通知。查詢通知的主要目的是針對快取資料的應用程式,支援其增進效能的整體目標。當伺服器的負載量過大時,SQL Server 可能就會產生訂閱的查詢通知訊息,而不去判斷查詢的結果是否有變更。

在 Database Engine 執行訂閱要求中的每個陳述式之前,就會先產生通知訂閱。因此,如果命令同時包含了查詢以及會變更查詢所傳回資料的陳述式,那麼在包含訂閱要求的命令完成之前,應用程式就會先收到通知訊息。

每個訂閱都有指定的最小存留期間。過了最小存留期間之後,SQL Server 就會移除訂閱,並建立通知訊息。該訊息會告知應用程式該通知已失效,且 SQL Server 不會再追蹤查詢的變更。

當 SQL Server 啟動時,伺服器會為資料庫中所有的查詢通知訂閱,自動建立查詢通知訊息。這樣可以讓應用程式立即重新整理快取的資料,並讓 SQL Server 直接啟動,而不去處理每個通知中的查詢。當您卸除資料庫時,Database Engine 會針對在資料庫中註冊的所有訂閱,產生查詢通知訊息。

如果所提交的通知訂閱要求中,含有與查詢通知需求不符的查詢,資料庫會立即產生查詢通知訊息。此訊息會通知應用程式,說明該查詢與訂閱的需求不符。此外,由於 SQL Server 無法追蹤查詢的變更,所以應用程式應將該查詢視同即將過期。

ms188323.note(zh-tw,SQL.90).gif附註:
如果應用程式與資料庫之間的連接失敗,由相依物件 (例如:ADO.NET 中的 SqlDependency) 所管理的查詢通知訂閱並不會產生事件。然而,當應用程式可以再度連接資料庫時,應用程式就會立刻收到在無法連接資料庫的這段期間,所建立的任何通知。

當命令產生通知訊息時,建立及傳送通知訊息的程序會放在陳述式中進行,而此陳述式則位於產生通知訊息的交易中。如果 Database Engine 無法順利建立及傳送通知訊息,則該命令失敗,並且會將失敗的狀況記錄在 SQL Server 錯誤記錄中。請注意,當通知訊息產生時,Database Engine 就會移除通知訂閱 (無論 Database Engine 是否能順利產生該通知訊息)。

ms188323.note(zh-tw,SQL.90).gif附註:
發生下列其中一種情形時,會在不產生通知訊息的情況下即將訂閱移除:卸除或停用建立訂閱的資料庫使用者帳戶、附加內含訂閱的資料庫,或者使用 KILL QUERY NOTIFICATION SUBSCRIPTION 移除訂閱。

請參閱

概念

為通知建立查詢
查詢通知訊息

說明及資訊

取得 SQL Server 2005 協助