如何使用相同的数据库处理来自多个应用程序的存储过程代码更改?

时间:2012-09-25 17:50:32

标签: c# sql-server database production-environment

我们环境中的数据库由2个不同的环境/应用程序共享。 在2个应用程序中,第一个单词表示A,经常更新,而第二个应用程序B不经常更新。

所以这里的情况是,当应用程序A使用新代码(主要是存储过程)进行更新时,它有时会影响和破坏第二个应用程序B,这个应用程序正由另一个团队更新,而且不会经常更新。 我知道这不应该是处理它的正确方法,而不是一起更新两个环境可能是灾难性的。 发生这种情况是因为应用程序A& B由不同的团队处理。

你会如何优雅地处理这种情况?

从申请B我可以采取的预防措施是 - 在代码中检索数据 - 检索数据时的最佳方法是检查空白/空列,以便在应用程序A添加新列时,应用程序B可以忽略它们。 在SQL中检索数据 - 在该过程中,可以使用可选参数进行处理。

但是当C#代码调用一个过程时,我们应该传递param值,如果添加了新参数,那么它就会中断。 有没有办法确保如果缺少调用参数,那么应该忽略它(从C#或SQL Server)?

我的研究表明 -

  1. 我可以先从sproc中检索参数列表,然后使用该列表调用该过程循环并检查该参数是否存在。 因此,即使应用程序A添加了新的参数,它也可以由应用程序B自动处理。 这可以使用C#中的DeriveParameters或SQL查询来获取参数列表。

  2. 更改所有SPROC以CSV格式获取参数。然后将它们分成SPROC并相应地使用它。 对于数百个现有的垃圾来说,这听起来很蹩脚。

  3. 同样,正如我所说 - 这看起来不是一个好的解决方案,如果你有类似的情况,你会有多么不同的处理方式? 是否有一个框架,我不知道哪个框架可以解决这个问题呢?

    环境 - ASP.NET / C#4.0,SQL Server 2008 R2

    编辑 - 让我重新措辞,并在此提供更多细节。

    1. 应用程序/团队A更改了代码,但只有C#代码才会推出到生产环境,而不是数据库更改。 这就是差异所在。数据库代码只会在下一个版本中发布。

    2. 应用程序/团队B拥有最新代码,但数据库更改尚未生产,仍然使用旧数据库。

3 个答案:

答案 0 :(得分:4)

我不相信有一个优雅的解决方案,但是,因为你不能重写整个应用程序所以...使用你的escenario,我会复制所有应用程序的SP并将它们放在单独的模式中。

在数据库中创建不同的用户,让每个应用程序通过自己的用户连接到数据库。应用程序A的DB用户(其角色)不应具有执行属于其他模式的SP的权限,对于应用程序B的DB用户也应具有相同的权限。

当然,您需要重写一些应用程序代码来更改连接字符串。

答案 1 :(得分:2)

是否有原因无法为新参数指定默认值? e.g。

CREATE PROCEDURE xxx

   @OldParam   int
  ,@NewParam   int  = 0

AS

   <etc>

应用程序“A”传递两个参数。

应用程序“B”是在proc只有一个参数时编写的,只用一个重要参数调用它。对于新版本,第二个参数将不会被传递,因此它将获取默认值0 ...并且过程被适当地编码。 (NULL或特殊默认值可用于“标记”旧系统的调用。)


[补充]

可能的长期解决方案是在数据库中添加某种版本系统,每次更新数据库时都会更新。

  • 当应用程序启动时,它将获得当前版本
  • 如果有不同版本的参数不同的通话,请在通话时检查并格式化,例如

    如果版本&lt; 3然后用1参数调用proc

    另外用2个参数调用proc

随着时间的推移跟踪和维护这将是繁琐和混乱的,但如果您无法同时更新所有系统(A,B和数据库),您的选项将受到限制。

答案 2 :(得分:2)

也许每个应用程序都有自己的存储过程集,儿子不会互相打扰。