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

问题描述

不久前在 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'

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

我做错了什么?

解决方法

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

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

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