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相關聯的用戶,它是上下文簽名激活過程運行的正確用戶。

相關問題