2011-07-02 59 views
6

我想了解如何使用別名在同一實例中引用另一個數據庫,而不必使用硬編碼名稱。SQL Server跨數據庫別名

的情況是如下:

我有一個存儲數據,審計數據庫這使所做的所有更改數據分貝。出於各種原因,我想將審計數據保存在一個單獨的數據庫中,尤其是因爲它可能會變得非常大並且用於報告目的。

在數據db中,我不想通過硬編碼名稱引用此名稱,而是使用別名,以便在不同的環境中,我不必更改名稱和各種sp以引用新名稱。

例如:

mydevdata 
mydevaudit 

如果mydevdata存在SP如它調用mydevaudit,我不想當我去測試,其中分貝的可稱爲改變SP mytestdatamytestaudit 。再次,由於種種原因,該數據庫的名稱可以改變,更給實例做用空格等

所以,如果我在mydevdata程序:

proc A 
begin 

insert into mydevaudit.table.abc(somecol) 
select 1 

end 

,當我去考,我不想改變程序引用另一個名稱,(承擔便於討論所發生)

相反,我希望做類似:

proc A 
begin 

insert into AUDITEBALIAS.table.abc(somecol) 
select 1 

end 

我我有興趣瞭解我可以如何做這樣的事情,以及專業和缺點。

此外,dymnamic SQL不是一個選項。

在此先感謝您的幫助。

+0

請你能否詳細說明爲什麼「dymnamic SQL不是一個選項」 – Seph

回答

11

您可以使用synonyms

CREATE SYNONYM WholeTableAliasWithDBetc FOR TheDB.dbo.TheTable 

這意味着在本地數據庫中的所有對象的引用是局部的DB,除了從你隱藏其他數據庫的同義詞。

您還可以使用中的存儲過程審計數據庫。還有就是EXEC是很少使用的第三表單,您可以parametrise的存儲過程的名稱

DECLARE @module_name_var varchar(100) 
SET @module_name_var = 'mydevaudit.dbo.AuditProc' 
-- SET @module_name_var = 'whatever.dbo.AuditProc' 
EXEC @module_name_var @p1, @p2, ... 

很明顯,你可以改變module_name_var使用任何DB你喜歡

0

我剛剛張貼這How to create Sql Synonym or "Alias" for Database Name?哪些是相同情況的解決方法:

有一種方法可以使用鏈接的服務器來模擬此操作。這假定您有兩臺SQL服務器,其中一臺用於開發/測試,另一臺用於實時數據庫。

  1. 打開SQL Server Management Studio中你的開發/測試服務器
  2. 右擊服務器對象>鏈接服務器
  3. 選擇新的鏈接服務器上...
  4. 選擇常規頁面
  5. 指定別名名在鏈接服務器領域 - 這通常會是您的現場服務器的名稱
  6. 選擇SQL Native Client作爲提供
  7. 輸入SQL_SERVER爲產品名稱
  8. 數據源中指定發展的名義服務器
  9. 添加安全和服務器選件品嚐
  10. 單擊確定

以上是針對SQL Server 2005的,但應該與2008相似

一旦你這樣做,你可以寫這樣的SQL:

SELECT * FROM liveservername.databasename.dbo.tablename 

現在,當你的腳本與鏈接服務器開發服務器上運行回到自身,他們將正常工作從開發服務器提取數據和當在實時服務器上運行完全相同的腳本時,它們將正常工作。

相關問題