启用查询通知 (ADO.NET)

更新:November 2007

使用查询通知的应用程序有一组通用的要求。必须正确配置数据源才能支持 SQL 查询通知,并且用户必须具有正确的客户端和服务器端权限。

要使用查询通知,必须符合下列条件:

  • 使用 SQL Server 2005 或 SQL Server 2008。

  • 对数据库启用查询通知。

  • 确保用于连接数据库的用户 ID 具有必要的权限。

  • 使用 SqlCommand 对象执行有效的 SELECT 语句,包含关联的通知对象 — SqlDependencySqlNotificationRequest

  • 提供所监视的数据更改时用于处理通知的代码。

查询通知要求

仅对满足一系列特定要求的 SELECT 语句支持查询通知。下表提供指向“SQL Server 联机丛书”中的 Service Broker 和“查询通知”文档的链接。

SQL Server 2005 联机丛书

SQL Server 2008 联机丛书

为通知创建查询

为通知创建查询

Service Broker 的安全注意事项

安全性和保护 (Service Broker)

Notification Services 的安全注意事项

查询通知权限

Service Broker 的国际化注意事项

解决方案设计注意事项 (Service Broker)

Service Broker 开发人员信息中心

开发人员指南 (Service Broker)

启用查询通知运行示例代码

若要通过使用 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
([https://schemas.microsoft.com/SQL/Notifications/PostQueryNotification]);

查询通知权限

执行请求通知的命令的用户必须在服务器上具有 SUBSCRIBE QUERY NOTIFICATIONS 数据库权限。

在部分信任情况下运行的客户端代码要求 SqlClientPermission

下面的代码创建一个 SqlClientPermission 对象,将 PermissionState 设置为 Unrestricted。如果尚未为调用堆栈中的所有高级调用方授予该权限,则 Demand 将在运行时强制引发 SecurityException

' 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
// 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;
    }
}

选择通知对象

查询通知 API 提供两个用于处理通知的对象:SqlDependencySqlNotificationRequest。通常情况下,大多数非 ASP.NET 应用程序应使用 SqlDependency 对象。ASP.NET 应用程序应使用更高级别的 SqlCacheDependency,以便包装 SqlDependency 并为管理通知和缓存对象提供框架。

使用 SqlDependency

要使用 SqlDependency,必须对所使用的 SQL Server 数据库启用 Service Broker,并且用户必须具有接收通知的权限。Service Broker 对象(例如通知队列)已预定义。

此外,SqlDependency 会自动启动一个辅助线程以在通知发布到队列中时处理这些通知;它还会分析 Service Broker 消息,将此信息作为事件参数数据公开。必须通过调用 Start 方法初始化 SqlDependency,以建立与数据库的相关性。此方法是静态方法,在为每个所需的数据库连接初始化应用程序期间只需调用一次。必须在应用程序终止时为执行的每个相关连接调用 Stop 方法。

使用 SqlNotificationRequest

相对而言,SqlNotificationRequest 要求您自己实现整个侦听基础结构。此外,必须定义队列所支持的所有支持 Service Broker 对象(例如队列、服务和消息类型)。如果应用程序要求特殊的通知消息或通知行为,或应用程序是更大的服务中介应用程序的一部分,此手动方法非常有用。

请参见

其他资源

SQL Server 中的查询通知 (ADO.NET)