2010-11-12 86 views
0

我與一些商業模式,具有AA一套類似的表,不同之處僅在語言名稱,如工作:SQL Server的同義詞和併發安全性動態表名

Products_en 
Products_fr 
Products_de 

我也有幾個存儲過程這我使用訪問這些執行一些管理功能,我已經選擇使用同義詞,因爲有大量的代碼,並把每件事寫動態SQL僅僅是痛苦的:

declare @lang varchar(50) = 'en' 

if object_id('dbo.ProductsTable', 'sn') is not null drop synonym dbo.ProductsTable 
exec('create synonym dbo.ProductsTable for dbo.Products_' + @lang) 

/* Call the synonym table */ 
select top 10 * from dbo.ProductsTable 
update ProductsTable set a = 'b' 

我的問題是如何做當談到con時,SQL Server會處理同義詞目前的訪問?我擔心程序可能會開始,然後第二次出現,並通過引發重大問題將同義詞表中的表格更改爲中途。我可以將所有內容都包裹在BEGIN TRANCOMMIT TRAN之間,理論上這應該消除兩個進程更改同義詞的風險,但文檔在這個問題上很少,我無法得到明確的答案。

要注意的是,雖然這個系統是併發的,但它不是高流量,所以使用同義詞/事務的性能命中率在這裏並不是真正的問題。

感謝您的任何建議。

+0

你是什麼意思的「商業模式」?這是否意味着您不能修改數據庫模式本身(即只添加到它)? – 2010-11-12 14:30:31

+0

他們是商業產品(微軟商業服務器)的一部分,所以是我可以添加到他們,但我不能改變API將依賴的約定或其他東西 – amarsuperstar 2010-11-15 15:24:46

回答

1

你的恐懼是正確的。同義詞不打算以這種方式使用。包裝它是一個事務(不知道需要什麼隔離級別)可以解決這個問題,但只能通過使系統單一用戶。

如果我正在處理這個問題,那麼我可能會使用動態SQL,因爲我熟悉它。但是,考慮一下,我想知道模式是否可以解決您的問題。
如果您爲每種語言創建了架構,然後在每個架構中都有一個名爲products的表。然後,存儲的proc可以引用不合格的表名,SQL應解析對當前用戶的默認模式中的表的引用。然後,您需要更改應用程序進行身份驗證的帳戶,以確定它使用哪個模式,或者在存儲過程中使用EXECUTE AS來決定哪個模式是默認模式。
我還沒有測試過這個模式的想法,我可能沒有想過所有的事情,而且我也不知道你的應用程序是否足夠了解你的應用程序是否可行。讓我們知道你是否決定嘗試。

+0

感謝您的答案。我通常也使用動態SQL,但是有很多的SQL,我想確保它可維護,而不是隻是nvarchar字符串,並且考慮到它不是性能關鍵,我會查看事務路由。你對模式的建議是一個非常有趣的建議,但是我需要相當多的時間來研究這個問題 - 但這肯定是下一次出現這個問題時我會嘗試的! – amarsuperstar 2010-11-12 13:53:10