Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.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
Sql server 如何在源代码管理中跟踪数据库更改?_Sql Server_Svn_Version Control_Sourcegear Vault - Fatal编程技术网

Sql server 如何在源代码管理中跟踪数据库更改?

Sql server 如何在源代码管理中跟踪数据库更改?,sql-server,svn,version-control,sourcegear-vault,Sql Server,Svn,Version Control,Sourcegear Vault,我们在大多数项目中使用SQL Server 2000/2005和Vault或SVN。我还没有找到一个合适的解决方案来捕获两个源代码管理系统中的数据库模式/proc更改 我们当前的解决方案非常麻烦,而且很难实施(将您更改的对象写出来并提交到数据库) 关于如何通过一些定制开发来解决这个问题,我们有很多想法,但我宁愿安装一个现有的工具(付费工具也可以) 那么:如何跟踪数据库代码的更改?你有什么推荐的工具吗 编辑: 谢谢你的建议。由于时间限制,我不想在这里玩我自己的。大多数建议都有一个缺陷,即它们要求

我们在大多数项目中使用SQL Server 2000/2005和Vault或SVN。我还没有找到一个合适的解决方案来捕获两个源代码管理系统中的数据库模式/proc更改

我们当前的解决方案非常麻烦,而且很难实施(将您更改的对象写出来并提交到数据库)

关于如何通过一些定制开发来解决这个问题,我们有很多想法,但我宁愿安装一个现有的工具(付费工具也可以)

那么:如何跟踪数据库代码的更改?你有什么推荐的工具吗


编辑:

谢谢你的建议。由于时间限制,我不想在这里玩我自己的。大多数建议都有一个缺陷,即它们要求开发人员遵循一些程序

相反,理想的解决方案是监视SQL数据库的更改,并将检测到的任何更改提交给SCM。例如,如果SQL Server有一个附加组件,可以记录做出更改的用户的任何DML更改,然后将该对象的脚本提交给SCM,我会非常激动

我们在内部讨论了两个系统: 1.在SQL 2005中,使用对象权限限制您在执行“签出”之前更改对象。然后,签入过程将其脚本化到SCM中。 2.运行计划作业以检测任何更改并将其(匿名)提交给SCM


如果我可以跳过用户操作部分,让系统自动处理这一切,那就太好了。

一个穷人的解决方案是添加一个预提交钩子脚本,将最新的db模式转储到一个文件中,并将该文件与代码一起提交到您的SVN存储库。然后,您可以将db模式文件与任何修订版区分开来。

我只需提交SQL alter语句,将其添加到完整的SQL CreateDB语句中。

使用Visual studio数据库版编写数据库脚本。工作起来很有魅力,你可以使用任何源代码控制系统,当然最好是有VS插件。此工具还具有许多其他有用的功能。在这篇很棒的博客文章中查看它们


或者在SQL2000中查看官方文档的MSDN,将每个对象生成到它自己的文件中,然后将它们全部检查到源代码管理中。让您的源代码管理处理更改历史记录


在SQL 2005中,您需要编写一些代码来将所有对象生成到单独的文件中。

我不得不说,我认为visual studio数据库项目也是解决源代码管理难题的合理方案。如果设置正确,可以从IDE针对数据库运行脚本。如果您的脚本是旧的,请获取最新的,然后在DB上运行它。如果需要,还需要一个脚本来重新创建所有对象,则必须手动将新对象添加到此脚本,但只能添加一次


我喜欢每个表、进程和函数都在自己的文件中

我们的DBA定期根据SVN中的内容检查prod,并删除任何不受源代码控制的对象。只需一次开发人员就永远不会忘记再次将某些东西放入源代码控制


我们也不允许任何人在没有脚本的情况下将对象移动到prod,因为我们的开发人员没有prod权限,这很容易实施。

从头开始滚动自己的对象不是很可行,但是,如果您使用一个sql比较工具来为您生成更改文件,那么将所需内容减半,然后将这些文件签入源代码管理并不需要很长时间。我为自己推出了类似的东西,在短短几个小时内将开发系统的更改更新到实时系统。

在我们的环境中,我们从不手动更改数据库:所有更改都是在发布时通过脚本完成的,脚本保存在版本控制系统中。此过程的一个重要部分是确保所有脚本都可以在不丢失数据的情况下针对同一个DB(脚本是幂等的?)再次运行。例如,如果添加列,请确保在该列已存在时不执行任何操作


您关于“建议存在缺陷,需要开发人员遵循某些程序”的评论确实是一个故事。这不是一个缺陷,而是一个特征。版本控制有助于开发人员执行以下过程,并减少这些过程的痛苦。如果你不想遵循程序,你就不需要版本控制。

在我精心安排的一个项目中,数据库中的所有重要数据都可以从外部自动重新创建。在启动时,如果缺少数据库,应用程序将创建数据库,并使用应用程序源代码中的模式(因此使用应用程序进行版本控制)从外部数据源填充数据库。数据库存储名称(虽然大多数数据库管理器允许多个数据库,但它是sqlite文件名)包含一个架构版本,并且每当提交架构更改时,我们都会增加架构版本。这意味着,当我们使用不同的模式将应用程序重新启动到新版本时,将自动创建并填充新的数据库存储。如果我们必须将部署恢复到旧模式,那么旧版本的新运行将使用旧数据库存储,因此我们可以在出现问题时进行快速降级

从本质上讲,数据库就像一个传统的应用程序堆,具有持久性、事务安全性、静态类型(因为我们使用Python,所以很方便)和唯一性约束等优点。然而,我们根本不担心删除数据库并重新开始,人们知道,如果他们在数据库中尝试一些手动攻击,那么它将在下一次部署时恢复,就像对进程状态的攻击将在下一次重新启动时恢复一样

我们不需要任何迁移脚本,因为我们只需切换数据库文件名并重新启动应用程序,它就会自我重建。它有助于应用程序实例的共享