是否有用于数据库结构更改的版本控制系统?

我经常遇到以下问题。

我对需要在数据库中添加新表或列的项目进行了一些更改。我进行数据库修改,并继续我的工作。通常,我记得写下更改,以便可以在实时系统上复制它们。然而,我并不总是记得我改变了什么,我也不总是记得把它写下来。

所以,我推到活动系统,得到一个很大的,明显的错误,没有 NewColumnX,呃。

不管这可能不是这种情况下的最佳实践,是否有针对数据库的版本控制系统?我不在乎具体的数据库技术。我只是想知道有没有这样的人。如果它碰巧与 MSSQLServer 一起工作,那就太好了。

36478 次浏览

大多数数据库引擎应该支持将数据库转储到文件中。反正我知道 MySQL 有。这将只是一个文本文件,因此您可以将其提交到 Subversion 或其他您使用的文件。也很容易对文件进行差异化处理。

对于 Oracle,我使用 蛤蟆,它可以将模式转储到多个离散文件(例如,每个表一个文件)。我有一些脚本可以在 Perforce 中管理这个集合,但是我认为在任何修订控制系统中都应该很容易做到。

在 RubyonRails 中,有一个 迁徙的概念——一个更改数据库的快速脚本。

生成一个迁移文件,其中包含增加数据库版本(如添加列)的规则和降低版本级别(如删除列)的规则。每次迁移都有编号,并且有一个表记录当前的数据库版本。

对于 迁徙,您可以运行一个名为“ db: shift”的命令,该命令查看您的版本并应用所需的脚本。您可以以类似的方式向下迁移。

迁移脚本本身保存在一个版本控制系统中——无论何时更改数据库,都需要签入一个新的脚本,任何开发人员都可以应用该脚本将本地数据库迁移到最新版本。

有一个叫做 Ruckusing 的 PHP5“数据库迁移框架”。我还没有使用它,但是 例子展示了这个想法,如果您使用该语言在需要时创建数据库,那么您只需要跟踪源文件。

我在编写代码的同时编写 db 发布脚本,并将发布脚本保存在 SS 中的特定项目部分。如果我对需要更改数据库的代码进行了更改,那么我将同时更新发布脚本。 在发布之前,我在一个干净的 dev db 上运行发布脚本(从生产环境复制结构) ,并对它进行最后的测试。

在版本控制器中创建初始的表语句,然后添加 alter table 语句,但是不要编辑文件,只需要更多地按顺序命名的 alter 文件,或者甚至作为一个“更改集”,这样您就可以找到特定部署的所有更改。

我所看到的最困难的部分是跟踪依赖关系,例如,对于特定的部署表 B,可能需要在表 A 之前更新。

由于没有用于表更改的 VCS,我一直将它们记录在 wiki 中。至少这样我就能知道是什么时候以及为什么它被改变了。它远非完美,因为不是每个人都在这样做,我们有多个产品版本在使用,但总比没有好。

查看 Oracle 包 DBMS _ METADATA。

下列方法尤其有用:

  • DBMS_METADATA.GET_DDL
  • DBMS_METADATA.SET_TRANSFORM_PARAM
  • DBMS_METADATA.GET_GRANTED_DDL

一旦你熟悉了它们的工作原理(不言自明) ,你就可以编写一个简单的脚本,将这些方法的结果转储到文本文件中,并将其置于源代码控制之下。祝你好运!

不确定 MSSQL 是否有这么简单的东西。

如果您正在使用 SQLServer,那么很难打败 DataDude (也就是 VisualStudio 的数据库版本)。一旦掌握了诀窍,在源代码控制的数据库版本和生产中的版本之间进行模式比较就轻而易举了。通过单击,您可以生成 diff DDL。

MSDN 上有一个非常有用的 视频指南。

我知道 DBMS _ METADATA 和 Toad,但是如果有人能够为 Oracle 提供一个数据伙伴,那么生活将会非常美好。

我断断续续地这样做了很多年——管理(或试图管理)模式版本。最好的方法取决于您所拥有的工具。如果你能得到探索软件工具“模式管理器”,你将在良好的形状。Oracle 有自己的劣质工具,也称为“模式管理器”(令人困惑吗?)我不建议你这么做。

如果没有一个自动化的工具(参见其他关于 Data 伙计的评论) ,那么您将直接使用脚本和 DDL 文件。选择一种方法,记录它,并严格遵循它。我喜欢在任何给定的时刻都能够重新创建数据库,所以我更喜欢整个数据库(如果我是 DBA)或开发人员模式(如果我处于产品开发模式)的完整 DDL 导出。

PLSQLDeveloper,一个来自 All Arround Automations 的工具,有一个用于存储库的插件,可以在 VisualSourceSafe 中正常工作(但不是很好)。

来自网络:

版本控制插件提供了 PL/SQL Developer IDE > > 和任何支持 Microsoft SCC 接口规范的版本控制系统之间的紧密集成。> > 这包括最流行的版本控制系统,如 Visual SourceSafe,> Merant PVCS 和 MKS 源代码完整性。

Http://www.allroundautomations.com/plsvcs.html

ER Studio 允许您将数据库模式反转到该工具中,然后可以将其与实时数据库进行比较。

示例: 将您的开发模式反转到 ERStudio 中——将其与生产进行比较,它将列出所有的差异。它可以编写更改脚本,或者自动推送更改。

一旦您在 ER Studio 中有了一个模式,您可以保存创建脚本,或者将其保存为专有的二进制文件并将其保存在版本控制中。如果您想回到该方案的过去版本,只需检查它并将其推送到您的 db 平台。

两本书的推荐: Ambler 和 Sadalage 的“重构数据库”和 Ambler 的“敏捷数据库技术”。

有人提到了 Rails 迁移。我认为它们工作得很好,甚至在 Rails 应用程序之外也是如此。我使用它们在一个 ASP 应用程序与 SQLServer,我们正在转移到 Rails 的过程中。您将迁移脚本本身检查到 VCS 中。 这里是 务实的戴夫 · 托马斯的一篇文章

我推荐两种方法。首先,从 Sybase 投资 PowerDesigner。企业版。它允许您设计物理数据模型等等。但是它附带了一个存储库,允许您检入您的模型。每个新签入都可以是一个新版本,它可以将任何版本与任何其他版本进行比较,甚至与当时数据库中的内容进行比较。然后它会列出每个差异的列表,并询问哪些应该迁移... 然后它构建脚本来完成这项工作。它不便宜,但它是一个两倍的价格,它的投资回报率是大约6个月。

另一个想法是打开 DDL 审计(在 Oracle 中可以工作)。这将创建一个包含每次更改的表。如果您从上次将数据库更改移动到现在的时间戳查询更改,那么您将得到一个已完成的所有操作的有序列表。其中一些子句可以消除零和变化,比如 create table foo; 然后删除 table foo; 还可以轻松构建 mod 脚本。为什么要在维基中保留更改,这样工作量就加倍了。让数据库帮你追踪他们。

我们已经很成功地使用了 微软团队系统数据库版。它或多或少地与 TFS 版本控制和 Visual Studio 无缝集成,并允许我们轻松地管理存储过程、视图等。冲突解决可能是一个痛苦的过程,但版本历史记录完成后就完成了。此后,向 QA 和生产的迁移非常简单。

不过,公平地说,这是一个1.0版本的产品,并不是没有一些问题。

我有点守旧,因为我使用源文件来创建数据库。实际上有两个文件-project-database. sql 和 project-updates.sql-第一个用于模式和持久数据,第二个用于修改。当然,两者都在源代码控制之下。

当数据库发生变化时,我首先更新 project-database. sql 中的主模式,然后将相关信息复制到 project-updates.sql 中,例如 ALTER TABLE 语句。 然后我可以将更新应用到开发数据库,测试,迭代,直到做得很好。 然后,签入文件,再次测试,并应用于生产。

另外,我通常在 db-Config 中有一个表,比如:

SQL

CREATE TABLE Config
(
cfg_tag VARCHAR(50),
cfg_value VARCHAR(100)
);


INSERT INTO Config(cfg_tag, cfg_value) VALUES
( 'db_version', '$Revision: $'),
( 'db_revision', '$Revision: $');

然后,我将以下内容添加到更新部分:

UPDATE Config SET cfg_value='$Revision: $' WHERE cfg_tag='db_revision';

只有在重新创建数据库时,db_version才会发生变化,而 db_revision给出了数据库离基线有多远的指示。

我可以将更新保存在他们自己的独立文件中,但是我选择将它们混合在一起,并使用剪切和粘贴来提取相关部分。还需要做一些内部管理工作,例如,从 $Revision1.1 $中删除“ :”以冻结它们。

我强烈推荐 SQL delta。我只是用它来生成差异脚本,当我完成编码我的功能和检查这些脚本到我的源代码控制工具(Mercurial:)

它们同时拥有 SQL 服务器和 Oracle 版本。

Schema Compare for Oracle 是一个专门设计用于将更改从 Oracle 数据库迁移到另一个数据库的工具。请访问下面的网址下载链接,在那里您将能够使用该软件的全功能试用。

Http://www.red-gate.com/products/schema_compare_for_oracle/index.htm

我想知道为什么没有人提到基于 Java 的开源工具 液体碱,它应该可以为几乎所有支持 jdbc 的数据库工作。与 Rails 相比,它使用 xml 而不是 ruby 来执行模式更改。虽然我不喜欢特定于领域的语言使用 xml,但是 xml 的一个很酷的优点是,liquibase 知道如何回滚某些操作,比如

<createTable tableName="USER">
<column name="firstname" type="varchar(255)"/>
</createTable>

所以你不需要自己处理这件事

还支持纯 sql 语句或数据导入。

MyBatis (以前的 iBatis)有一个 模式迁移工具,可以在命令行上使用。它是用 Java 编写的,但可以用于任何项目。

为了实现良好的数据库更改管理实践,我们需要确定几个关键目标。 因此,MyBatis 模式迁移系统(简称“ MyBatis 偏移”)寻求:

  • 使用任何数据库,新的或现有的
  • 利用源代码控制系统(例如 Subversion)
  • 允许并发开发人员或团队独立工作
  • 允许非常明显和容易管理的冲突
  • 允许向前和向后迁移(分别进化和移交)
  • 使数据库的当前状态易于访问和理解
  • 尽管有访问特权或官僚主义,仍然允许迁移
  • 使用任何方法
  • 鼓励良好的、一致的实践

Redgate 有一个名为 SQL 源代码管理的产品,它集成了 TFS、 SVN、 SourceGear Vault、 Vault Pro、 Mercurial、 Perforce 和 Git。

可以在 VisualStudio 中使用 Microsoft SQL Server 数据工具为数据库对象生成脚本,作为 SQLServer 项目的一部分。然后,您可以使用构建到 VisualStudio 中的源代码管理集成将这些脚本添加到源代码管理中。此外,SQLServer 项目允许您使用编译器验证数据库对象,并生成部署脚本以更新现有数据库或创建新数据库。