啟用查詢通知
取用查詢通知的應用程式有一組常見需求。 您必須正確設定資料來源才能支援 SQL 查詢通知,而且使用者必須具有正確的用戶端及伺服器端權限。
若要使用查詢通知,您必須:
啟用資料庫的查詢通知。
確定用來連線到資料庫的使用者識別碼具備必要權限。
使用 SqlCommand 物件搭配關聯的通知物件 (SqlDependency 或 SqlNotificationRequest) 執行有效 SELECT 陳述式。
提供程式碼來處理受監視的資料發生變更時要發出的通知。
查詢通知需求
只有符合一組特定需求的 SELECT 陳述式才支援查詢通知。 下表將提供 SQL Server 文件中 Service Broker 和查詢通知文件的連結。
SQL Server 文件
啟用查詢通知來執行範例程式碼
若要透過使用 SQL Server Management Studio,在 AdventureWorks 資料庫上啟用 Service Broker,請執行下列 Transact-SQL 陳述式:
ALTER DATABASE AdventureWorks SET ENABLE_BROKER;
為了讓查詢通知範例正確執行,必須在資料庫伺服器上執行下列 Transact-SQL 陳述式。
CREATE QUEUE ContactChangeMessages;
CREATE SERVICE ContactChangeNotifications
ON QUEUE ContactChangeMessages
([http://schemas.microsoft.com/SQL/Notifications/PostQueryNotification]);
查詢通知使用權限
若使用者執行的命令會要求通知,則必須有伺服器上的訂閱查詢通知資料庫權限。
在部分信任狀況下執行的用戶端程式碼需要 SqlClientPermission。
下列程式碼會建立將 PermissionState 設定為 Unrestricted 的 SqlClientPermission 物件。 如果在呼叫堆疊中較高的所有呼叫端都尚未被授與此權限,Demand 將在執行階段強制執行 SecurityException。
// Code requires directives to
// System.Security.Permissions and
// System.Data.SqlClient
private bool CanRequestNotifications()
{
SqlClientPermission permission =
new SqlClientPermission(
PermissionState.Unrestricted);
try
{
permission.Demand();
return true;
}
catch (System.Exception)
{
return false;
}
}
' Code requires directives to
' System.Security.Permissions and
' System.Data.SqlClient
Private Function CanRequestNotifications() As Boolean
Dim permission As New SqlClientPermission( _
PermissionState.Unrestricted)
Try
permission.Demand()
Return True
Catch ex As Exception
Return False
End Try
End Function
選擇通知物件
查詢通知 API 提供兩個物件來處理通知:SqlDependency 和 SqlNotificationRequest。 一般而言,大多數非 ASP.NET 應用程式應使用 SqlDependency 物件。 ASP.NET 應用程式應使用較高層級的 SqlCacheDependency,其包裝了 SqlDependency,並提供用於管理通知及快取物件的架構。
使用 SqlDependency
若要使用 SqlDependency,所使用的 SQL Server 資料庫必須啟用 Service Broker,且使用者必須具有接收通知的使用權限。 系統會預先定義 Service Broker 物件,例如通知佇列。
此外,SqlDependency 會自動啟動工作執行緒,以便在公佈到佇列時處理通知;它也會剖析 Service Broker 訊息,將資訊做為事件引數資料公開。 SqlDependency 必須透過呼叫 Start
方法來初始化,以建立對資料庫的相依性。 這是一種靜態方法,您僅需要在所要求之每個資料庫連接的應用程式初始化期間內,呼叫一次。 對於每個進行的相依性連線,Stop
方法應該在應用程式終止時呼叫。
使用 SqlNotificationRequest
相反地,SqlNotificationRequest 需要您自行實作整個接聽基礎結構。 此外,必須定義所有支援的 Service Broker 物件,如佇列、服務及佇列所支援的訊息類型。 如果您的應用程式需要特殊的通知訊息或通知行為,或如果您的應用程式是較大型 Service Broker 應用程式的一部分,此手動方法就很有用。
另請參閱
- SQL Server 中的查詢通知
- ADO.NET 概觀 \(部分機器翻譯\)