11

我有Git 源代码控制提供程序设置并运行良好。

对于 Visual Studio 项目,就是这样。

问题是每个这样的项目都与SQL Server 数据库紧密相关。

我知道如何在自己的.git存储库中对数据库进行版本控制,但这既不方便也不真正健壮,因为理想情况下,我希望相同的 ADD、COMMIT、TAG 和 BRANCH 命令以同步的方式同时对两个目录树进行操作。

有没有办法以我描述的方式使用 Visual Studio 的 Git 源代码控制提供程序来 Git SQL Server 数据库?

4

3 回答 3

8

如果需要,您可以安装SQL Server Data Tools,但您不必:您可以使用数据库发布向导将表数据 直接从 Visual Studio编写到解决方案的文件夹中,然后像处理其他项目文件一样使用 Git在那个文件夹中。

于 2012-10-17T17:52:49.460 回答
6

您可以使用SQL Server Data Tools将数据库架构存储为 Visual Studio 项目,然后使用 Git 对该项目进行版本控制。

于 2012-10-17T15:51:42.317 回答
5

在数据库版本控制领域工作了 5 年(在DBmaestro担任产品管理总监)并担任了超过 20 年的 DBA,我可以告诉您一个简单的事实,即您不能像对待 Java 那样对待数据库对象, C# 或其他文件,并将更改保存在简单的 DDL 脚本中。

有很多原因,我将仅举几例:

  • 文件本地存储在开发人员的 PC 上,他/她所做的更改不会影响其他开发人员。同样,开发人员也不会受到同事所做更改的影响。在数据库中,(通常)情况并非如此,开发人员共享相同的数据库环境,因此提交给数据库的任何更改都会影响其他人。
  • 发布代码更改是使用签入/提交更改等完成的(取决于您使用的源代码控制工具)。此时,来自开发人员本地目录的代码被插入到源代码控制存储库中。想要获取最新代码的开发人员需要从源代码管理工具中请求它。在数据库中,更改已经存在并影响其他数据,即使它没有签入到存储库中。
  • 在文件签入期间,源代码控制工具会执行冲突检查,以查看在您修改本地副本期间,同一文件是否被其他开发人员修改和签入。再次在数据库中没有检查这个。如果您从本地 PC 更改程序,同时我使用本地 PC 的代码修改相同的程序,那么我们会覆盖彼此的更改。
  • 代码的构建过程是通过将代码的标签/最新版本放到一个空目录中,然后执行构建-编译来完成的。输出是我们复制和替换现有的二进制文件。我们不在乎以前的情况。在数据库中,我们无法重新创建数据库,因为我们需要维护数据!部署还执行在构建过程中生成的 SQL 脚本。
  • 执行 SQL 脚本(使用 DDL、DCL、DML(用于静态内容)命令)时,您假定环境的当前结构与创建脚本时的结构相匹配。如果没有,那么您的脚本可能会在您尝试添加已经存在的新列时失败。
  • 将 SQL 脚本视为代码并手动生成它们会导致语法错误、数据库依赖项错误、不可重用的脚本,从而使开发、维护和测试这些脚本的任务变得复杂。此外,这些脚本可能运行在与您想运行的环境不同的环境中。
  • 有时版本控制存储库中的脚本与被测试对象的结构不匹配,然后在生产中会发生错误!

还有很多,但我想你明白了。

我发现有效的方法如下:

  1. 使用强制版本控制系统对数据库对象强制执行签出/签入操作。这将确保版本控制存储库与签入的代码相匹配,因为它在签入操作中读取对象的元数据,而不是作为手动完成的单独步骤。这也允许多个开发人员在同一个数据库上并行工作,同时防止他们意外地覆盖彼此的代码。
  2. 使用影响分析,利用基线作为比较的一部分来识别冲突并识别差异(在比较源代码控制存储库和数据库之间的对象结构时)是源自开发的真正更改还是源自不同的路径,然后应该跳过它,例如不同的分支或紧急修复。
  3. 使用知道如何一次对多个模式执行影响分析的解决方案,使用 UI 或使用 API 以最终自动化构建和部署过程。

我写的一篇文章在这里发表欢迎阅读。

于 2015-04-01T07:17:51.873 回答