首页 > 解决方案 > 服务代理 - 将服务更改为默认合同会导致错误

问题描述

前段时间在 SQL Server 2016 中,我创建了一个服务代理队列:

CREATE QUEUE [dbo].[NotificationsQueue] 
WITH STATUS=ON, 
RETENTION=OFF,
POISON_MESSAGE_HANDLING (STATUS=ON)
ON [PRIMARY]
GO

另外,我创建了一个服务:

CREATE SERVICE [ChangeNotifications]
AUTHORIZATION [dbo]
ON QUEUE [dbo].[NotificationsQueue]
(
[http://schemas.microsoft.com/SQL/Notifications/PostQueryNotification]
)
GO

这工作得很好,允许从一些监控队列的代码中根据需要发送 XML 消息。

我们的新要求是我们不想再被绑定到 XML。因此,由于系统 PostQueryNotification 合同中有 xml 验证,我想使用根本没有验证的默认值。

所以我改变了服务:

ALTER SERVICE ChangeNotifications (ADD CONTRACT [DEFAULT], DROP CONTRACT [http://schemas.microsoft.com/SQL/Notifications/PostQueryNotification])

现在,当我从队列中读取 message_body 字段时,我得到

Target service 'ChangeNotifications' does not support contract 'http://schemas.microsoft.com/SQL/Notifications/PostQueryNotification'

所以我现在很困惑,因为当你想更改验证时,我只做了很多博客告诉我的事情。

我究竟做错了什么?

标签: sql-serverservice-broker

解决方案


根据您使用的名称,您是否正在实施查询通知?如果是这样,我认为您无法控制正在使用的合同。也就是说,任何试图发送查询通知的进程都会(在某些时候)发出类似以下的问题:

begin dialog @handle
  from service sourceService
  to service 'ChangeNotifications'
  on contract [http://schemas.microsoft.com/SQL/Notifications/PostQueryNotification]

因为您已经从服务中删除了该合同,所以它不再有效并且错误地出现了。


推荐阅读