啟用查詢通知

取用查詢通知的應用程式有一組常見需求。 您必須正確設定資料來源才能支援 SQL 查詢通知,而且使用者必須具有正確的用戶端及伺服器端權限。

若要使用查詢通知,您必須:

  • 啟用資料庫的查詢通知。

  • 確定用來連線到資料庫的使用者識別碼具備必要權限。

  • 使用 SqlCommand 物件搭配關聯的通知物件 (SqlDependencySqlNotificationRequest) 執行有效 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 設定為 UnrestrictedSqlClientPermission 物件。 如果在呼叫堆疊中較高的所有呼叫端都尚未被授與此權限,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 提供兩個物件來處理通知:SqlDependencySqlNotificationRequest。 一般而言,大多數非 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 應用程式的一部分,此手動方法就很有用。

另請參閱