2010-11-12 85 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