问题描述
我正在 sql 服务器 Service broker 框架上进行 POC。设置是同一服务器上的多个数据库。我有一个数据库,该数据库设置为包含“核心代码”。我已经修改了一个名为 send_broker_message
的过程,它通常采用 FromService/ToService/Contract/MessageType/MessageBody 并发送它。这工作正常 - 有点......它只更新包含核心代码的数据库上的 que 。我所追求的是更新另一个数据库上的 que。所有消息、查询、合同和消息类型在所有数据库中都是相同的。
服务代理代码示例没有专门引用任何特定的数据库实例。理想情况下,我会创建一个合同或服务来引用不同的数据库实例。
我能看到的唯一解决方案是在每个数据库上都有通用代码,并为每个我不愿意做的数据库调用单独的 send_broker_message
(违背了核心代码库的概念)。
我的问题 - 是否可以将服务代理消息从一个数据库发送到另一个数据库,同时 SEND ON CONVERSATION
在第三个数据库上执行?如果是这样 - 代码会是什么样子?
重申一下 - 不打算跨服务器执行此操作(目前) - 所有数据库都在同一台服务器上。
更新:我已经让服务代理框架正常工作了。上述问题的答案是 - 不可能在另一个数据库上发送保护。
来自微软文档 FROM SERVICE 启动器_service_name 指定启动对话的服务。 指定的名称必须是当前数据库中的服务名称。为发起方服务指定的队列接收目标服务返回的消息和 Service broker 为此对话创建的消息。
所以“CodeRepository”数据库必须是发起者。不是 100% 理想,但我可以解决这个问题。
另一个问题是在另一个数据库上更新队列。以下能够给出抛出的错误;
SELECT * FROM [MyInitiatorDatabase].sys.transmission_queue
错误是;
An exception occurred while enqueueing a message in the target queue. Error: 916,State: 3.The server principal "sa" is not able to access the database "MyDatabase" under the current security context
原来我需要做的是SET TRUSTWORTHY ON
例如
ALTER DATABASE [MyDatabase] SET TRUSTWORTHY ON
以下帮助很大SQL Service Broker - The server principal "sa" is not able to access
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)