在运行DB的版本化脚本时管理对象的依赖关系

时间:2013-02-07 13:18:11

标签: c# sql sql-server database database-versioning

我们将数据库置于版本控制之下。我们有大约2400个对象,其中大多数是存储过程。

所以我们已经删除了如果不存在为除了表之外的所有对象创建脚本。

我们将表脚本维护在一个单独的文件夹中,其中存储了delta脚本。只有delta脚本编号。与程序,视图和功能相关的其他脚本将直接运行。

因此,当开发人员在svn中提交更改时,我们希望在暂存版本上运行它们。问题是对象的依赖性。

如果开发人员在一次提交中提交了多个脚本,这些脚本可能相互依赖,或者如果我们要合并多个修订版然后再组合运行脚本,那么我们就无法确定运行脚本的正确顺序。

任何人都可以建议一些管理依赖项的好方法,并帮助我们确保脚本第一次运行。

我们不能在我们这么多的生产服务器中使用redgate工具,所以除了使用sql compare或sql sourcecontrol之外,我还会感谢其他一些选择。

我们总是首先运行表delta脚本,因为它们不依赖于其他对象(开发人员也会在脚本中管理它),然后是其他对象

我们已经提出了一些关于运行其他对象(如

)的顺序的解决方法

1)我们可以将对象的依赖项存储在具有相同名称但扩展名不同的另一个文件中,这样如果依赖项发生更改,那么开发人员应该使用脚本提交它。然后我们可以根据这个树来运行脚本。

2)我们可以先创建一个树,然后在svn中提交它,如果依赖项发生了变化,那么我们可以在暂存机器上测试脚本后将它添加到树中,并发生错误。(这需要svn提交后)第一次失败并要求第一次自动化过程失败)

3)我们可以反复运行脚本而不使用事务最多次数和对象数。这将导致在最坏情况下最终正确运行所有脚本。

如果您有其他想法或可以改进其中一些想法,那么请提供帮助。

3 个答案:

答案 0 :(得分:0)

您是否查看过SQL Server管理对象?

它支持通过DependencyWalker类来识别关系,因此可能正是您所追求的。

您是否想要相信SQL Server维护的依赖关系链是准确的完全是另一回事......如果没有,那么您最好的选择可能是放弃自动化并让开发人员负责提交适当的升级脚本,然后您将按照提交给SVN的顺序重播。

答案 1 :(得分:0)

你看过这个吗?

http://www.red-gate.com/products/sql.../sql-source-control/

这是一套相当不错的工具,可以用最少的努力来捕捉你的差异。

答案 2 :(得分:0)

如果您无法使用任何其他类型的自动化,则可以使用tsort。 tsort实用程序是一个实现拓扑排序的Unix程序。 (它可能适用于大多数操作系统。)它根据显示部分排序的输入输出字符串的完整总排序。