【问题标题】:Service broker - changing service to default contract causes error服务代理 - 将服务更改为默认合同会导致错误
【发布时间】:2021-06-11 14:00:49
【问题描述】:

前段时间在 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-server service-broker


    【解决方案1】:

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

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

    因为您已从服务中删除了该合同,所以它不再正常工作并出现错误。

    【讨论】:

    • 啊,我忘了那些 - 它们在存储过程中,你能从开始对话框中删除合同并发送命令吗?
    • 可以,但我认为最好是明确的。无论您如何做,您都可以通过三个步骤来完成您提议的更改。 1. 允许服务以允许新合同。 2. 更改您的程序以发送新合同。 3. 与旧合同的任何公开对话完成后,从您的服务中删除旧合同。
    猜你喜欢
    • 1970-01-01
    • 2011-01-08
    • 2017-04-03
    • 2017-04-07
    • 1970-01-01
    • 2020-04-19
    • 1970-01-01
    • 1970-01-01
    • 2021-04-17
    相关资源
    最近更新 更多