跟踪对数据库所做的更改

Track changes made to a database

背景:

我有一个 MS SQL 服务器数据库,我想跟踪对它的更改。例如,如果需要添加或删除列或需要删除 table。类似于常规代码的版本控制。

问题:

环顾四周,我发现有一些工具可以使用:

我更想知道这些工具是否会跟踪对我的数据库所做的更改?更具体地说,我有一个 TFS 服务器,它是我的 MVC 代码的源代码控制,我可以将其中任何一个与 TFS 一起使用吗?它会让我们从旧版本恢复吗?它会允许多个开发人员同时处理数据库吗?

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

原因有很多,我举几个:

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

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

我发现以下内容有效:

  1. 使用强制版本控制系统 check-out/check-in 对数据库对象的操作。这会 确保版本控制存储库与之前的代码匹配 在读取签入对象的元数据时签入 操作而不是作为一个单独的步骤手动完成。这也让 多个开发人员在同一个数据库上并行工作,同时 防止它们意外覆盖彼此的代码。
  2. 使用影响分析,将基线作为 比较以确定冲突并确定是否发生变化(何时 比较源代码控制之间的对象结构 存储库和数据库)是一个真正的变化,起源于 源自不同路径的发展或变化,以及 那么应该跳过它,例如不同的分支或紧急情况 修复。

我写的一篇文章已发表here,欢迎阅读

如果您正在寻找一种可以自动跟踪 SQL 服务器对 TFS 的更改的产品,我邀请您看看我们的产品 Sql Historian。它不同于大多数其他 SQL 版本控制系统(包括您列出的那些),因为它不需要开发人员执行签入仪式来将版本控制与已经提交给数据库的内容同步。

但是,Sql Historian 和您提到的其他两个系统的共同特征是:使用 TFS,能够查看旧版本的数据库对象,并允许多个用户同时访问数据库时间。

对于此类工作,ApexSQL Source Control 可以满足您的所有需求。使用此 SSMS add-in,您可以直接在数据库和所有 changes will be tracked in real time 上工作。

是的,多个开发人员可以同时在同一个数据库上工作。当一个开发人员在一个或多个对象上工作时,其他开发人员可以看到这些对象是哪些,并且在第一个未完成更改之前,其他开发人员不能更改该对象,他们将不被允许。 如果无论如何,对象更改错误,可以随时恢复以前的版本或任何更早的版本。

此 add-in 具有所有必要的选项和功能,允许开发人员在工作时不会浪费时间检查对对象所做的更改,因为 add-in 为他们做了这些。而且您始终可以看到更改的对象、时间和内容。