服务代理 - 将服务更改为默认合同会导致错误

Service broker - changing service to default contract causes error

前段时间在SQLServer 2016中,我创建了一个service broker队列:

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'

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

我做错了什么?

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

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

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