我正在尝试使用Windows登录用户将消息从1台服务器发送到另一台服务器。我为此创建了路线:
CREATE ROUTE [SB_Server1_Server2Route]
AUTHORIZATION [COMPANY\SVC.SQLServiceBroker]
WITH SERVICE_NAME = '//Server1/Server2/UpdatedRecord_TargetService',
ADDRESS = 'tcp://Server2:4022';
我正在使用以下查询/程序发送消息:
EXEC [dbo].[SB_SendBrokerMessage] '//Server1/Server2/UpdatedRecord_InitiatorService',
'//Server1/Server2/UpdatedRecord_TargetService', @XML;
CREATE PROCEDURE [dbo].[SB_SendBrokerMessage]
@FromService sysname ,
@ToService sysname ,
@MessageBody XML
AS
BEGIN
SET NOCOUNT ON;
IF ( @MessageBody IS NOT NULL
AND @FromService IS NOT NULL
AND @ToService IS NOT NULL
)
BEGIN
DECLARE @conversation_handle UNIQUEIDENTIFIER;
BEGIN TRANSACTION;
BEGIN DIALOG CONVERSATION @conversation_handle
FROM SERVICE @FromService
TO SERVICE @ToService
WITH ENCRYPTION = OFF;
SEND ON CONVERSATION @conversation_handle (@MessageBody);
COMMIT TRANSACTION;
END;
END;
GO
我在日志中遇到以下错误:
用户' COMPANY \ AnotherUser的Service Broker登录尝试。'失败 错误:'连接握手失败。登录 ' COMPANY \ AnotherUser'没有CONNECT权限 端点。州84。'。 [客户:192.168.21.61]
所以问题是:为什么它不使用路线中指定的用户?
答案 0 :(得分:2)
路线上的授权条款(或其他任何内容)指定谁拥有路线,而不是人们将连接的路由。幸运的是,可以轻松解决您的问题:将端点上的连接权限授予用户需要的任何权限。
答案 1 :(得分:1)
Ben已经告诉过你为什么使用AUTHORIZATION子句与Service Broker连接无关。
要设置两个实例以便能够交换Service Broker消息,您需要设置Service Broker Transport Security。您可以选择基于证书的身份验证(请参阅How does Certificate based authentication work)或基于Windows的身份验证。传输层安全性与当前用户完全没有无。当前用户正在运行Service Broker谓词并不重要,它只允许所涉及的两个实例相互连接。我强烈建议使用基于证书的身份验证,但如果您必须*使用Windows,则必须向对等服务帐户授予CONNECT权限。
Service Broker中存在第二层安全性,即对话安全性(请参阅Conversations Authentication)。这允许两个Service Broker服务相互进行身份验证并交换消息。这再次与当前连接的用户无关。如果指定则需要创建remote service binding个对象。总是以证书为基础。
最后,当在传输层和会话层都设置了所有Service Broker安全性时,您还必须指定哪些SQL用户有权使用此基础结构,并且这是通过授予的RECEIVE权限来控制的。承载服务的队列。