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

时间:2008-08-02 01:52:55

标签: sql database oracle version-control

我经常遇到以下问题。

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

所以,我推动了实时系统并得到一个明显的错误,即没有NewColumnX,呃。

不管这可能不是这种情况的最佳做法,是否有数据库的版本控制系统?我不关心具体的数据库技术。我只是想知道一个是否存在。如果它恰好适用于MS SQL Server,那么很棒。

22 个答案:

答案 0 :(得分:61)

在Ruby on Rails中,有一个migration的概念 - 一个更改数据库的快速脚本。

生成迁移文件,该文件具有增加db版本的规则(例如添加列)和规则以降级版本(例如删除列)。每个迁移都有编号,表会跟踪您当前的数据库版本。

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

迁移脚本本身保存在版本控制系统中 - 每当您更改数据库时,都会检入新脚本,并且任何开发人员都可以应用它来将本地数据库带到最新版本。

答案 1 :(得分:30)

我有点老了,因为我使用源文件来创建数据库。实际上有2个文件 - 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会指示数据库离基线的距离。

我可以将更新保存在他们自己的单独文件中,但我选择将它们全部混合在一起并使用剪切和粘贴来提取相关部分。更多的内务管理是有序的,即从$ Revision 1.1 $中移除':'来冻结它们。

答案 2 :(得分:12)

Redgate有一款名为SQL Source Control的产品。它集成了TFS,SVN,SourceGear Vault,Vault Pro,Mercurial,Perforce和Git。

答案 3 :(得分:12)

MyBatis(以前称iBatis)有一个schema migration工具,可以在命令行中使用。它是用java编写的,但可以用于任何项目。

  

为了实现良好的数据库变更管理实践,我们需要确定一些关键目标。   因此,MyBatis Schema Migration System(或简称MyBatis Migrations)寻求:

  • 使用任何数据库,新的或现有的
  • 利用源代码管理系统(例如Subversion)
  • 使并发开发人员或团队能够独立工作
  • 允许冲突非常明显且易于管理
  • 允许前向和后向迁移(分别进化,下放)
  • 使数据库的当前状态易于访问和理解
  • 在访问权限或官僚作风的情况下启用迁移
  • 使用任何方法
  • 鼓励良好,一致的做法

答案 4 :(得分:11)

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

他们有一个SQL服务器和一个; Oracle版本。

答案 5 :(得分:11)

我想知道没有人提到基于Java的开源工具liquibase,它几​​乎适用于支持jdbc的每个数据库。与rails相比,它使用xml而不是ruby来执行架构更改。虽然我不喜欢特定领域语言的xml,但是xml非常酷的优点是liquibase知道如何回滚某些操作,比如

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

所以你不需要处理你自己的

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

答案 6 :(得分:10)

大多数数据库引擎都应支持将数据库转储到文件中。无论如何,我知道MySQL确实如此。这只是一个文本文件,因此您可以将其提交给Subversion或您使用的任何内容。在文件上运行差异也很容易。

答案 7 :(得分:9)

如果您使用的是SQL Server,那么很难击败Data Dude(又名Visual Studio的数据库版)。一旦掌握了它,在源控制版本的数据库和生产中的版本之间进行模式比较是轻而易举的。点击即可生成差异DDL。

在MSDN上有一个非常有用的教学video

我知道DBMS_METADATA和Toad,但是如果有人能想出一个针对Oracle的Data Dude,那么生活真的会很甜蜜。

答案 8 :(得分:8)

看一下oracle包DBMS_METADATA。

特别是,以下方法特别有用:

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

一旦熟悉它们的工作原理(非常自我解释),您就可以编写一个简单的脚本,将这些方法的结果转储到可以置于源代码管理下的文本文件中。祝你好运!

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

答案 9 :(得分:8)

对于Oracle,我使用Toad,它可以将模式转储到许多离散文件(例如,每个表一个文件)。我有一些脚本可以在Perforce中管理这个集合,但我认为它几乎可以在任何修订控制系统中使用。

答案 10 :(得分:8)

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

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

答案 11 :(得分:7)

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

答案 12 :(得分:7)

ER Studio允许您将数据库架构转换为该工具,然后您可以将其与实时数据库进行比较。

示例:将您的开发架构转换为ER Studio - 将其与生产进行比较,它将列出所有差异。它可以编写更改脚本,或者只是自动推送它们。

在ER Studio中拥有架构后,您可以保存创建脚本或将其另存为专有二进制文件并将其保存在版本控制中。如果您想要回到该方案的过去版本,只需将其检出并将其推送到您的数据库平台。

答案 13 :(得分:7)

我已经做了很多年 - 管理(或尝试管理)架构版本。最好的方法取决于您拥有的工具。如果您可以获得Quest Software工具“Schema Manager”,那么您将处于良好状态。 Oracle有自己的,劣质的工具,也被称为“架构管理器”(令人困惑多少?)我不推荐。

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

答案 14 :(得分:7)

PLSQL Developer是All Arround Automations的一个工具,它有一个存储库插件,可以使用Visual Source Safe工作正常(但不是很好)。

  

来自网络:

     
    

版本控制插件提供PL / SQL Developer IDE&gt;与支持Microsoft SCC接口规范的任何版本控制系统之间的紧密集成。 &gt;&gt;这包括最流行的版本控制系统,如Microsoft Visual SourceSafe,&gt;&gt; Merant PVCS和MKS Source Integrity。

  

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

答案 15 :(得分:6)

有一个名为Ruckusing的PHP5“数据库迁移框架”。我没有使用它,但是examples显示了这个想法,如果您在需要时使用该语言来创建数据库,您只需要跟踪源文件。

答案 16 :(得分:4)

您可以在visual studio中使用Microsoft SQL Server Data Tools来生成数据库对象的脚本,作为SQL Server项目的一部分。然后,您可以使用Visual Studio中内置的源代码控制集成将脚本添加到源代码控制。此外,SQL Server Projects允许您使用编译器验证数据库对象,并生成部署脚本以更新现有数据库或创建新数据库。

答案 17 :(得分:3)

我们使用MS Team System Database Edition取得了相当不错的成功。它无缝地集成了TFS版本控制和Visual Studio,并允许我们轻松管理存储过程,视图等。冲突解决可能很痛苦,但版本历史记录一旦完成就会完成。此后,迁移到质量保证和生产非常简单。

可以说,它是1.0版本的产品,但并非没有一些问题。

答案 18 :(得分:3)

Schema Compare for Oracle是专门用于将更改从Oracle数据库迁移到另一个数据库的工具。请访问下面的URL以获取下载链接,您可以在该链接中使用该软件进行全功能试用。

http://www.red-gate.com/Products/schema_compare_for_oracle/index.htm

答案 19 :(得分:2)

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

另一个想法是启用DDL审核(适用于Oracle)。这将创建一个包含您所做的每个更改的表。如果您从上次将数据库更改为prod的时间戳中查询更改,那么您将拥有已完成所有内容的有序列表。一些where子句消除零和变化,如create table foo;然后是drop table foo;你可以轻松地建立一个mod脚本。为什么要在wiki中保留更改,这是工作的两倍。让数据库为您跟踪它们。

答案 20 :(得分:2)

如果没有用于表更改的VCS,我一直在维基中记录它们。至少那时我可以看到它被改变的时间和原因。它并不完美,因为不是每个人都这样做,我们有多个产品版本在使用,但总比没有好。

答案 21 :(得分:1)

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

有人提到了Rails迁移。我认为它们工作得很好,甚至在Rails应用程序之外。我在使用SQL Server的ASP应用程序中使用它们,我们正在迁移到Rails。您将迁移脚本本身检入VCS。 这是关于这个主题的a post by Pragmatic Dave Thomas