2016-11-24 29 views
2

我有兩個數據庫如下所述:有沒有辦法將數據庫名稱設置爲SQL服務器的全局名稱?

  • [QCR_DEV]
  • [QCR_DEV_LOG]

所有應用數據被存儲在[QCR_DEV]。在[QCR_DEV]的每個表上,存在觸發器,其將[QCR_DEV]表的插入和更新的細節插入到[QCR_DEV_LOG]數據庫中。

假設我有一個表[派對][QCR_DEV]數據庫。每當我插入,更新或刪除表中的某些記錄。將在表[party_log]中存在一個插入,其存在於[QCR_DEV_LOG]數據庫中。簡而言之,我將[QCR_DEV]表格上執行的日誌或操作保存到[QCR_DEV_LOG]數據庫中。

當我們通過應用程序連接到數據庫時,它使用連接字符串以某種方式連接到數據庫。

Select * From [QCR_DEV].[party]; 

我使用這樣的:在我的存儲過程,就像我沒有使用數據庫名

Select * From [party]; 

這是因爲,在功能,如果我需要更改數據庫的名稱,然後我將只需要更改連接字符串。

現在來談談,我需要從[QCR_DEV_LOG]數據庫獲取數據。我正在寫一個存儲過程中,我需要從像兩個數據庫獲取數據:該存儲過程是在[QCR_DEV]數據庫

Select * From [QCR_DEV_LOG][party_log] 
INNER JOIN [person] on [person].person_id = [QCR_DEV_LOG][party_log].person_id 
where party_id = 1 

。我需要從兩個數據庫中獲取數據。爲此,我需要在查詢中提及數據庫名稱。我不想要這個。有沒有辦法設置全局數據庫名稱,並在我的查詢中使用這個名稱,以便如果將來我需要更改數據庫名稱,我只能從全局設置的位置更改。有沒有辦法做到這一點?

+0

爲您的數據庫源代碼使用SSDT項目,並在兩個項目之間創建數據庫引用。 –

+2

您可以爲其他數據庫中的對象創建[同義詞](https://msdn.microsoft.com/library/ms187552)。但是,您不能爲數據庫創建同義詞。 –

+0

@MartinSmith我有一個非常大的數據庫。我現在不能這樣做。 – Umer

回答

6

我第二Jeroen Mostert評論和使用同義詞:

CREATE SYNONYM [party_log] FOR [QCR_DEV_LOG].[dbo].[party_log]; 

並且當目標數據庫被重命名時,該查詢將生成遷移腳本:

SELECT 'DROP SYNONYM [' + name + ']; CREATE SYNONYM [' + name + '] FOR ' + REPLACE(base_object_name, '[OldLogDbName].', '[NewLogDbName].') + ';' 
FROM sys.synonyms 
WHERE base_object_name LIKE '[OldLogDbName].%'; 
+1

我猜同義詞比視圖更好。 –

+0

謝謝你的答案。 – Umer

5

你可以在DEV數據庫做到這一點:

CREATE VIEW [dbo].[party_log] 
AS 
    SELECT * FROM [QCR_DEV_LOG].[dbo].[party_log] 

然後,你可以,如果[party_log]表中DEV數據庫中存在的寫SELECT查詢。

任何WHERE..JOIN..ON..子句應在組合查詢執行之前應用。

如果LOG數據庫被移動或重命名,那麼你只需要更新視圖(或幾個視圖,但可能從來沒有很多)。

如果你希望有規律的變化,或者如果你需要使用這種在多個服務器上,那麼你可以使用動態SQL:

IF OBJECT_ID('[dbo].[party_log]') IS NOT NULL DROP VIEW [dbo].[party_log] 
-- etc, repeat to DROP other views 

DECLARE @logdb VARCHAR(80) = 'QCR_DEV_LOG' 

EXEC ('CREATE VIEW [dbo].[party_log] AS SELECT * FROM [' + @logdb + '].[dbo][party_log]') 
-- etc, repeat to create other views 
+0

好的建議。等待更多的答案..... – Umer

+2

如果視圖的基礎對象會改變,你將不得不記得在其上運行'sp_refreshview'。這個視圖是隻讀的,而同義詞可以用於插入和更新。優化器可以減少同義詞的問題,而不是通過'SELECT *'定義的視圖 –

+0

@Peter感謝您的回答。視圖通常用於複雜的數據。我們認爲這是一個邏輯表。無論我必須爲視圖和同義詞做同樣的工作,但我認爲在我的情況下同義詞是更好的選擇。 – Umer

相關問題