我有一个激活的过程用于查询链接服务器的服务代理队列。我已经使用找到的方法在程序上签了字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。
当我将数据库标记为可信时,它当然可用(但这正是我试图避免的)。
再次关闭TRUSTWORTHY OFF,注释掉'SELECT * FROM openquery'并重新运行。最有可能的问题是模拟不能被转移到本地数据库之外。然而,将TRUSTWORTHY设置为ON可以实现这一点。 – 2014-11-25 16:08:44
@srutzky我有其他的特工也查询链接服务器,但他们正在工作。我需要能够查询链接的服务器... – Mansfield 2014-11-25 17:58:03
但其他特效具有'EXECUTE AS OWNER'吗?这个过程已经在模仿。我不建议不要使用LinkedServer。我只是试图找出错误的来源,并怀疑它是由于模仿而导致的LinkedServer。评论和再次运行将缩小它,因为如果没有错误,那么我就在正确的轨道上。从那里我们可以找到解决的办法。 – 2014-11-25 18:02:19