Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在运行DB'时管理对象的依赖关系;s版本控制的脚本_C#_Sql_Sql Server_Database_Database Versioning - Fatal编程技术网

C# 在运行DB'时管理对象的依赖关系;s版本控制的脚本

C# 在运行DB'时管理对象的依赖关系;s版本控制的脚本,c#,sql,sql-server,database,database-versioning,C#,Sql,Sql Server,Database,Database Versioning,我们正在对数据库进行版本控制。我们有大约2400个对象,其中大多数是存储过程 因此,我们对除表之外的所有对象创建脚本时,如果不存在drop if,则执行drop 我们在一个单独的文件夹中维护表脚本,其中存储增量脚本。仅对增量脚本进行编号。与过程、视图和函数相关的其他脚本将直接运行 因此,当开发人员在svn中提交更改时,我们希望在登台版本上运行它们。问题是对象的依赖性 如果开发人员在一次提交中提交多个脚本,这些脚本可能相互依赖,或者如果我们希望合并多个修订,然后运行组合的脚本,那么我们无法确定运行

我们正在对数据库进行版本控制。我们有大约2400个对象,其中大多数是存储过程

因此,我们对除表之外的所有对象创建脚本时,如果不存在drop if,则执行drop

我们在一个单独的文件夹中维护表脚本,其中存储增量脚本。仅对增量脚本进行编号。与过程、视图和函数相关的其他脚本将直接运行

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

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

有人能提出一些好的方法来管理依赖关系,并帮助我们确保脚本第一次运行吗

我们不能在这么多的生产服务器中使用redgate工具,因此我希望使用sql compare或sql sourcecontrol之外的其他替代方法

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

我们已经为运行其他对象的顺序提供了一些变通方法,如

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

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

3) 我们可以一次又一次地运行脚本,而无需使用最多为对象数量的事务。这将导致在假设最坏情况的情况下,在最后正确运行所有脚本


如果您有其他想法或可以改进其中的一些想法,请发表意见。

您看过SQL Server管理对象吗

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


不过,您是否希望相信SQL Server维护的依赖关系链是准确的,这完全是另一回事。。。如果没有,那么您最好放弃自动化,让您的开发人员负责提交一个适当的升级脚本,然后按照提交给SVN的顺序重播该脚本。

您看过这个吗


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

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

只有在脚本进入数据库后,才能生成依赖关系树。我想事先知道在db上运行的依赖关系是什么,这样脚本就不会抛出错误。您的开发人员肯定会在开发/本地服务器上测试他们的更改吗?我以前使用过基于SMO的工具来拍摄整个数据库的快照,因此我确信您可以编写一个脚本,将更改的对象(包括依赖链)写入源代码管理。如果我们无法始终访问DB,那么我们可以创建一个已存在的所有对象的排序列表,并使用它来排序文件。