2014-11-06 91 views
0

我正在使用MSSQL 2014,並且遇到了數據庫管理員關於安全性的一個請求。 我們的解決方案包含多個數據庫(在同一臺服務器上),其中包含兩個或多個數據庫的表之間連接的存儲過程。我們有一個用戶在所有數據庫上擁有相同的權限。 非常簡單的例子:一個數據庫包含文章,而另一個包含價格,查詢需要獲得與他們的價格文章。查詢在這兩個數據庫中的表之間有INNER JOIN-s。MSSQL - 爲數據庫創建別名

在我們客戶的測試環境中部署解決方案後,我與客戶的數據庫管理員進行了交談,並要求我修改數據庫和用戶以符合他們的一些標準。這些標準包括不同環境下的不同數據庫名稱以及每個數據庫一個獨立的用戶。

如果我在當前的解決方案中更改了數據庫名稱和用戶,則由於數據庫名稱無效或憑證無效,存儲過程將返回錯誤。我問管理員他們是如何在他們的環境中解決這個問題的,他的答案是他們創建數據庫鏈接。在搜索解決方案後,我發現Oracle具有CREATE DATABASE LINK選項,但MSSQL中沒有任何類似(除了可能的鏈接服務器功能,但這不能解決我的問題)。

我在找的東西類似於MSSQL 2014中Oracle的CREATE DATABASE LINK,這種解決方案可以在不需要更改查詢的情況下執行存儲過程,而是創建需要的數據庫的「別名」被重新命名。

有沒有人有一個想法,我可以做到這一點?

+0

谷歌SQL同義詞 – 2014-11-06 13:06:25

+0

它是客戶,但數據庫名稱如何是一個安全問題? – Paparazzi 2014-11-06 13:08:12

+0

您是否在尋找[this](http://msdn.microsoft.com/zh-cn/library/ff772782.aspx)? – ForguesR 2014-11-06 13:08:45

回答

0

我只是搜索MSDN

CREATE SYNONYM (Transact-SQL)

我知道鏈接只答案是令人難以接受的,但是這就是答案和MSDN是不會消失

+0

我分析了一下CREATE SYNONYM命令,正如我所看到的,它只能用於創建數據庫對象的同義詞,而不是整個數據庫本身。這需要在這種情況下創建大量的同義詞...... – 2014-11-06 14:39:30

+0

好吧,我會留下這個,讓人們知道它不起作用。當你有一個被接受的答案時,我會刪除它。在將來,我建議你不要在應用程序中硬編碼數據庫名稱。只有一個變量可以指定數據庫名稱。 – Paparazzi 2014-11-06 14:46:48

0

不知道這可能是一個答案,但它是太長,以適應評論...

有沒有在您的問題的技術細節,所以我做了一個巨大瘋狂的猜測,但也許這個問題可以避免使用許多schema而不是許多數據庫。
這樣你的所有對象都屬於同一個數據庫,並且不需要進行跨數據庫調用。
顯然這種解決方案可能不適合你的情況,是不適用的,因爲[你的理由一大串這裏],並且也需要改變,其影響無法估計閱讀SO後... ^^

爲注意事項顧客並不總是對的;如果他們有一個依賴特定oracle功能的策略,他們不能指望在不同的rdbms上強制實施這個策略,而這個策略不具備該功能。
實際上他們可能會這樣做,但是你的工作是「教育」他們(或者至少嘗試!)。

無論如何,如果政策是強制性的,那麼他們會很樂意爲遵守規定所付出的額外努力付出代價,不是嗎?

+0

我考慮過使用模式,但正如你所提到的,有一長串的理由爲什麼它不適用:)我猜我必須說服他們在我們的例子中作出例外,因爲在我看來,沒有這個簡單的解決方案。 – 2014-11-06 14:42:57

0

從明顯的開始,我認爲你應該向客戶解釋,雖然有多個物理數據庫,但事實上,這個數據庫是完全分開的,並被同一產品使用。說清楚這不應該被認爲是他們的標準違反。

如果你不能說服他們,那麼你必須處理兩個問題:不同的用戶/登錄和不同的數據庫名稱。

不同的用戶/登錄:您可以通過linked server解決此問題。鏈接服務器不僅適用於不同的服務器或不同的實例,您可以創建一個「本地」鏈接服務器,使用不同的登錄名。

EXEC sp_addlinkedserver 
@server='yourAlias', 
@srvproduct='SQL_SERVER', 
@provider='yourServer\yourInstance', 
@dataSrc = 'yourDatabaseXYZ' 
GO 

您可以輕鬆地修改由您剛剛創建的鏈接服務器使用的憑據:

  1. 在SQL Server Management Studio中,打開對象資源管理器,展開服務器對象和飛行點擊新鏈接你剛創建的服務器;
  2. 在安全頁面上指定要使用的登錄名。

不同的數據庫名:我能想出的唯一辦法是爲數據庫中的每個對象創建一個SYNONYM。這是其他人似乎以前做過的事情,雖然它不是很有趣,但看起來非常可行。您可以看看here以獲得完整的解決方案。

當然,您可以在鏈接的服務器資源上使用SYNONYM。喜歡的東西:

CREATE SYNONYM yourTable FOR [yourAlias].yourDatabaseXYZ.schemaABC.yourTable 

,然後你將能夠做到:

-- Transparent usage of a table from another database with different credentials 
SELECT * FROM yourTable; 

順便說一句,還有一個特點,要求微軟Allow CREATE SYNONYM for database。也許你想給予好評它

最後一點:

爲了避免這樣的問題,像布拉姆還mentionned,你應該考慮在你的應用程序沒有硬編碼的數據庫名稱。

+0

謝謝,鏈接的服務器可能會有所幫助,如果我按照您的描述來實現它們,但是爲數據庫中的每個對象創建同義詞是我想避免的。我會盡力說服他們改變MS SQL數據庫項目的標準,如@Paolo所建議的那樣。如果他們拒絕,我想我必須處理同義詞和鏈接的服務器。 – 2014-11-07 13:32:34

+0

祝你最好的運氣說服他們。如果您必須爲所有對象創建同義詞,我提供的完整解決方案鏈接可能會幫助您很多。 – ForguesR 2014-11-07 13:42:47