4

我有一个激活的过程用于查询链接服务器的服务代理队列。我已经使用找到的方法在程序上签了字here。然而,我连续在SQL Server日志中看到以下消息:签名激活过程中的不可信安全上下文

活化PROC上队列“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 

有什么办法,我可以继续调试,找出原因,我得到这个错误?我已经尝试了ssbdiagnose对话,并没有任何配置错误。我也尝试在激活的sproc里面登录CURRENT_USER,这个激活的sproc是dbo。

当我将数据库标记为可信时,它当然可用(但这正是我试图避免的)。

+0

再次关闭TRUSTWORTHY OFF,注释掉'SELECT * FROM openquery'并重新运行。最有可能的问题是模拟不能被转移到本地数据库之外。然而,将TRUSTWORTHY设置为ON可以实现这一点。 – 2014-11-25 16:08:44

+0

@srutzky我有其他的特工也查询链接服务器,但他们正在工作。我需要能够查询链接的服务器... – Mansfield 2014-11-25 17:58:03

+0

但其他特效具有'EXECUTE AS OWNER'吗?这个过程已经在模仿。我不建议不要使用LinkedServer。我只是试图找出错误的来源,并怀疑它是由于模仿而导致的LinkedServer。评论和再次运行将缩小它,因为如果没有错误,那么我就在正确的轨道上。从那里我们可以找到解决的办法。 – 2014-11-25 18:02:19

回答

0

如果数据库是TRUSTWORTHY OFF过程将只在用户签名的上下文中运行,而不是您所期望的OWNER。

将链接的服务器权限分配给与ServiceBrokerProcsCert相关联的用户,它是上下文签名激活过程运行的正确用户。

相关问题