代码之家  ›  专栏  ›  技术社区  ›  amarsuperstar

SQL Server同义词与动态表名的并发安全

  •  0
  • amarsuperstar  · 技术社区  · 15 年前

    我正在处理一些商业模式,它们有一组类似的表,这些表只在语言名称上有所不同,例如:

    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'
    

    我的问题是,当涉及到并发访问时,SQL Server如何处理同义词?我担心的是,一个程序可能会启动,然后第二个程序出现,并将同义词指向导致重大问题的一半。我可以把所有东西都包在 BEGIN TRAN 和 COMMIT TRAN 从理论上讲,这应该可以消除两个进程更改同义词的风险,但是关于这个问题的文档很少,我无法得到一个明确的答案。

    只是要注意,虽然这个系统是并发的,但它的通信量并不高,因此使用同义词/事务的性能影响在这里并不是真正的问题。

    谢谢你的建议。

    1 回复  |  直到 15 年前
        1
  •  1
  •   pipTheGeek    15 年前

    你的恐惧是正确的。同义词不打算以这种方式使用。包装它是一个事务(不确定需要什么隔离级别)可能会解决这个问题,但只能使系统成为单个用户。

    如果我处理这个问题的话,我可能会使用动态SQL,因为我很熟悉它。然而,经过考虑,我想知道模式是否可以解决您的问题。
    如果为每种语言创建了模式,然后在每个模式中都有一个名为products的表。然后,您的存储过程可以引用一个不合格的表名,SQL应该解析对当前用户的默认架构中的表的引用。然后,您需要更改应用程序验证的帐户以确定它使用的架构,或者使用存储过程中的EXECUTE来确定默认架构。
    我没有测试这个模式的想法,我可能没有考虑所有的事情,我对你的应用程序了解不够,不知道它在你的情况下是否实际可行。如果你决定试一试,请告诉我们。