我使用了 SQL Service Broker 和 SQL Table Dependency,并在表中启动了 SQL 表依赖,以获取表数据更改的通知。我已经给了SQL表依赖文档中列出的数据库的所有权限。一段时间后,可能处于空闲状态,它的状态为“等待通知。
当我在表中更改(插入新记录)时,状态没有更改(等待通知)并给出错误:
ErrorSystem.Data.SqlClient.SqlException (0x80131904): The conversation handle "1FBDE14B-0A07-EB11-B81C-3CECEF20BFDC" is not found.
An error was raised during trigger execution. The batch has been aborted and the user transaction, if any, has been rolled back.
_sqlTableDependencyOrders = new SqlTableDependency<OrderTrigger>(DBConnection.GetOnlineConnectionString(), "Order");
_sqlTableDependencyOrders.OnChanged += OnDatabaseEventChanged;
_sqlTableDependencyOrders.Start();
错误消息表明无法识别 SQL Service Broker 会话句柄。发生这种情况的原因有多种,解决此问题可能需要执行多个过程。您可以采取以下一些步骤来帮助识别并解决问题:
确保 SQL Service Broker 已打开:首先,确保在包含您正在监视的表的数据库上启用 SQL Service Broker。这可以使用 SQL 查询进行验证:
SELECT is_broker_enabled FROM sys.databases WHERE name = 'YourDatabaseName';
如果未启用,您可以使用以下方法启用它:
ALTER DATABASE YourDatabaseName SET ENABLE_BROKER;
检查对话端点:检查聊天端点是否设置正确且可运行。以下 SQL 查询可用于检查端点:
SELECT * FROM sys.conversation_endpoints;
如果存在任何困难或端点不活动,您可能需要评估 Service Broker 设置,并可能需要重建端点。
Service Broker 已启动并正在运行:检查 SQL Service Broker 是否处于活动状态。您可以使用以下内容来确定其当前状态:
SELECT is_broker_enabled FROM sys.databases WHERE name = 'YourDatabaseName';
如果它没有运行,您可以使用以下命令启动它:
ALTER DATABASE YourDatabaseName SET NEW_BROKER;