2011-03-17 11 views
1

這是我遇到的問題。我正在嘗試創建一個將部署到DEV,QA和PROD環境的存儲過程。由於對部署過程的嚴格要求,我必須確保我的過程在所有三種環境中相同,並且必須工作(當然!)。問題是這個proc在不同的數據庫中引用了一個表。在DEV和QA中,這是可以的,因爲數據庫位於同一臺服務器上,但是在PROD中,所討論的數據庫位於單獨的服務器上。以下是從我的PROC的代碼片段,試圖應對不同的環境問題:根據存儲過程當前運行的環境,我如何有條件地使用鏈接的服務器?

IF @@SERVERNAME<>'Production' 
BEGIN 
    select distinct m.acct_id 
    from l_map m (nolock) 
    join #llist ll on ll.acct_id = m.acct_id 
    where ll.acct_id not in (select l_number from [OTHERDATABASE].[dbo].[OTHERTABLE] where lmi_status_code not in (select item from #ruleItems)) 
END 
ELSE 
BEGIN 
    select distinct m.acct_id 
    from l_map m (nolock) 
    join #llist ll on ll.acct_id = m.acct_id 
    where ll.acct_id not in (select l_number from [OTHERSERVER].[OTHERDATABASE].[dbo].[OTHERTABLE] where lmi_status_code not in (select item from #ruleItems)) 
END 

我PROC是從不同的PROC中調用。當我直接測試上述邏輯時,我得到了我期望的結果。但是,當我嘗試在DEV或QA的上下文中測試它時(從頂級過程),我收到一條錯誤消息,指出無法找到[OTHERSERVER]。我不能(也不需要)在DEV和QA中創建鏈接服務器,但我需要能夠在PROD環境中使用鏈接服務器。有誰知道如何做到這一點?

回答

0

使用同義詞,see here

另請參閱這兩個SO例子:onetwo

每個服務器上的同義詞定義可能不同,但代碼(存儲過程)不會更改。

+0

這可能是我的情況的最佳解決方案。雖然我寧願不必說服管理層和部署部門說除了將不同的代碼部署到不同的環境之外別無他法,但我認爲他們會看到好處。謝謝@Damir和@Ben。 – 2011-03-17 18:06:02

0

我的建議是在鏈接服務器的表上創建一個視圖。在測試服務器上,您可以使用測試數據在本地表上創建視圖。

通過這種方式,關於鏈接服務器的信息被隔離到視圖中。然後,您可以編寫存儲的引用該視圖的proc或其他查詢,而不是直接引用鏈接的服務器。

請注意,這不會使您能夠測試您需要的安全性和權限,只有該查詢適用於該模式。

0

我有同樣的情況。 使用別名,我不能使用OpenQuery,我需要在目標服務器上執行帶有參數的函數,其中不可能使用簡單的SELECT INTO或EXECUTE。

使用EXEC將返回(使用我的配置)的錯誤消息7411:

服務器 'linked_server_name' 未配置爲RPC。

這是我使用字符串查詢方法的一個例子。請注意,在測試中,我不使用鏈接服務器,但如果您需要,可以使用一個:

-- Prepare Source Query Fragment 
IF @@SERVERNAME = 'production_server' 
    SET @SelectQuery = ' OPENQUERY ([' 
     + @SourceServer + '],''EXEC [production_source_db].[schema_name].[' 
     + @FuncrionName+'] ''''' 
     + @param_1 + ''''', ''''' 
     + @param_2 + ''''''')'; 
ELSE 
    SET @SelectQuery = ' EXEC [testing_schema].[' 
     + @FuncrionName+'] ''' 
     + @param_1 + ''', ''' 
     + @param_2 + ''')'; 

-- Prepare Destination Query Fragment 
IF @@SERVERNAME = 'production_server' 
    SET @Destination = '[production_destination_server].[production_destination_db].[schema_name]'; 
ELSE 
    SET @Destination = '[testing_schema]'; 

-- Execute the data transfer 
EXEC (' 
INSERT INTO ' + @Destination + '.[Destination_Table] (
     [Col1] 
    , [Col2]) 
SELECT 
     [Col1] 
    , [Col2] 
FROM ' + @SelectQuery) 
相關問題