我有一個激活的過程用於查詢鏈接服務器的服務代理隊列。我已經使用找到的方法在程序上籤了字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