创建查询通知订阅
订阅通知就是创建命令,将通知请求附加到该命令,然后执行该命令的过程。必须从数据库访问接口创建查询通知订阅。Transact-SQL 不提供创建查询通知订阅的机制。
数据库引擎直接为该命令中的 Transact-SQL 语句注册通知。对于不满足查询通知要求的每个语句,数据库引擎将直接创建通知。对于那些满足要求的语句,将创建订阅。应多加小心,以避免将命令发送到既包含满足要求的语句又包含不满足要求的语句的服务器。
![]() |
---|
Transact-SQL 不提供订阅通知的方法。SQL Server 内承载的 CLR 数据访问类不支持查询通知。 |
每个查询通知订阅生成一个通知事件。通知发生后,SQL Server 将删除通知订阅。因此,再次需要通知的应用程序必须对检索已更改数据的命令请求新通知。
请求查询通知不是事务性的。对命令请求通知时,无论包含该命令的事务是提交还是回滚,数据库引擎都将注册该通知。
对查询通知的订阅存储在执行查询的数据库中。动态管理视图 sys.dm_qn_subscriptions 显示有关当前活动的查询通知订阅的信息。目录视图 sys.internal_tables 显示当前活动的查询通知订阅所使用的空间。
使用 SqlClient 托管提供程序选择通知订阅策略
请求通知订阅的方法有两种。“依赖项”为查询通知提供高级接口。应用程序可轻松创建依赖关系类(例如,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 应用程序中使用查询通知的信息,请参阅 使用查询通知。