Man*_*eld 5 sql-server stored-procedures linked-server service-broker sql-server-2014
我有一个用于查询链接服务器的服务代理队列的激活过程。我已使用此处找到的方法签署了该程序。但是,我不断在 sql server 日志中看到以下消息:
在队列 'DBName.dbo.TestReceiveQueue' 上运行的激活过程 '[dbo].[TestProc]' 输出以下内容: '访问远程服务器被拒绝,因为当前安全上下文不受信任。
奇怪的是我在同一个数据库中有几个不同的激活程序,由同一个证书签名,也做链接服务器查询,并且工作正常。出于某种原因,这个程序拒绝。
这是一些(主要)重现问题的代码。我已经创建了证书和关联的登录名。
CREATE PROCEDURE TestProc
WITH EXECUTE AS OWNER
AS
BEGIN
SET NOCOUNT ON;
DECLARE @convHandle UNIQUEIDENTIFIER;
DECLARE @msgTypeName SYSNAME;
DECLARE @status TINYINT;
DECLARE @srvName NVARCHAR(512);
DECLARE @srvConName NVARCHAR(256);
DECLARE @msgTypeValidation AS NCHAR(2);
DECLARE @msgBody NVARCHAR(256);
DECLARE @cmd AS NVARCHAR(50);
RECEIVE TOP(1)
@convHandle = conversation_handle,
@msgTypeName = message_type_name,
@status = status,
@srvName = service_name,
@srvConName = service_contract_name,
@msgTypeValidation = validation,
@msgBody = CAST(message_body AS NVARCHAR(256))
FROM TestReceiveQueue;
--SELECT @convHandle, @msgBody
IF (@@ROWCOUNT != 0)
BEGIN
SELECT * FROM openquery(LINKEDSERVERNAME, 'SELECT * FROM LINKEDSERVERDB.SCHEMA.TABLE')
END CONVERSATION @convHandle
END
END
GO
CREATE MESSAGE TYPE [TestMessageType] VALIDATION = NONE;
CREATE CONTRACT TestContract (TestMessageType SENT BY INITIATOR)
CREATE QUEUE [dbo].[TestReceiveQueue] With STATUS = ON, RETENTION = OFF, ACTIVATION (STATUS = ON, PROCEDURE_NAME = [dbo].[TestProc], MAX_QUEUE_READERS = 1, EXECUTE AS OWNER ), POISON_MESSAGE_HANDLING (STATUS = OFF) ON [PRIMARY]
CREATE QUEUE [dbo].[TestSendQueue] WITH STATUS = ON, RETENTION = OFF, POISON_MESSAGE_HANDLING (STATUS = OFF) ON [PRIMARY]
CREATE SERVICE [TestReceiveService] ON QUEUE [dbo].[TestReceiveQueue] (TestContract)
CREATE SERVICE [TestSendService] ON QUEUE [dbo].[TestSendQueue] (TestContract)
Drop Procedure TestProc
ADD SIGNATURE TO OBJECT::[TestProc]
BY CERTIFICATE [ServiceBrokerProcsCert]
WITH PASSWORD = 'PASSWORDHERE'
GO
Run Code Online (Sandbox Code Playgroud)
有什么办法可以进一步调试,找出为什么我收到这个错误?我在对话中尝试了 ssbdiagnose 并且没有任何配置错误。我还尝试记录CURRENT_USER作为 dbo 返回的激活 sproc的内部。
当我将数据库标记为值得信赖时,它当然可以工作(但这是我试图避免的)。
小智 1
如果数据库是可信关闭的,则过程将仅在签名用户的上下文中运行,而不是如您所期望的在其所有者的上下文中运行。
将链接服务器权限分配给与ServiceBrokerProcsCert关联的用户,这是运行上下文签名激活过程的正确用户。
| 归档时间: |
|
| 查看次数: |
950 次 |
| 最近记录: |