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

我经常遇到以下问题。

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

所以,我推动了现场系统,并得到了一个很明显的错误,那就是没有 NewColumnX ,呃。

不管这种情况可能不是最佳实践,是否有数据库版本控制系统?我不关心具体的数据库技术。我只想知道是否存在。如果碰巧与MS SQL Server一起工作,那么很好。

0
额外 编辑
意见: 2
根据我们的主题指南,“有些问题仍然存在问题,即使它们符合一个问题上面列出的类别: ...要求我们推荐或找到书籍,工具,软件库,教程或其他非现场资源的问题不在话题中......“
额外 作者 Robert Columbia,

19 答案

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

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

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

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

0
额外
这是Ruby项目的选择。 java中最接近的这种设计是mybatis模式迁移。对于.NET,相当于 code.google.com/p/migratordotnet 。他们都是IMO这项工作的优秀工具。
额外 作者 Dan Tanner,

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

0
额外

对于Oracle,我使用 Toad ,它可以将模式转储到大量离散文件中(例如,每个文件一个文件表)。我有一些在Perforce中管理这个集合的脚本,但我认为它应该很容易在任何版本控制系统中实现。

0
额外

大多数数据库引擎应该支持将数据库转储到文件中。无论如何,我知道MySQL的确如此。这只是一个文本文件,所以你可以将它提交给Subversion,或者你使用的任何东西。在文件上运行diff也很容易。

0
额外
是的,但差异SQL文件不会给你必要的脚本来升级你的dev / prod数据库从一个修订到另一个
额外 作者 Asaf Mesika,

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

0
额外

看看oracle包DBMS_METADATA。

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

  • <�代码> DBMS_METADATA.GET_DDL </代码>
  • <�代码> DBMS_METADATA.SET_TRANSFORM_PARAM </代码>
  • <�代码> DBMS_METADATA.GET_GRANTED_DDL </代码>

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

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

0
额外

我强烈建议 SQL delta 。我只是用它来生成diff脚本,当我编写我的功能,并检查这些脚本到我的源代码管理工具(Mercurial :))

They have both an SQL server & Oracle version.

0
额外

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

From the web:

The Version Control Plug-In provides a tight integration between the PL/SQL Developer IDE >>and any Version Control System that supports the Microsoft SCC Interface Specification. >>This includes most popular Version Control Systems such as Microsoft Visual SourceSafe, >>Merant PVCS and MKS Source Integrity.

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

0
额外

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

 
   

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

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

0
额外
对于Java,我强烈建议您近日查看一下 flywaydb.org - 另请参阅本网站上的功能比较
额外 作者 Karussell,
我们使用liquibase,但是我们对不同的信息使用3种不同的方法:1.结构(表,视图,...):历史变更日志2.代码(程序,pl / sql,函数):只有一个变更集runalways = true runonchange = true 3.存储在表中的代码表,其他元“常量”:与代码相同的方法,只有一个变更集,从中删除,插入所有信息
额外 作者 Palesz,

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

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

0
额外

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

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

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 指示db离基线有多远。

I could keep the updates in their own separate files, but I chose to mash them all together and use cut&paste to extract relevant sections. A bit more housekeeping is in order, i.e., remove ':' from $Revision 1.1 $ to freeze them.

0
额外

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

有人提到Rails Migrations。我认为它们工作得很好,即使在Rails应用程序之外。我将它们用于使用SQL Server的ASP应用程序,我们正在迁移到Rails。您将迁移脚本自己检入VCS。 以下是 Pragmatic Dave Thomas的帖子

0
额外

ER Studio allows you to reverse your database schema into the tool and you can then compare it to live databases.

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

在ER Studio中创建模式后,您可以保存创建脚本或将其保存为专有二进制文件并将其保存在版本控制中。如果你想回到过去的版本,只需检查它并将其推送到你的数据库平台。

0
额外

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

0
额外

在没有用于表格更改的VCS时,我已将它们记录在wiki中。至少可以看到什么时候以及为什么改变了。这并不完美,因为不是每个人都这样做,我们有多个产品版本在使用,但总比没有好。

0
额外

如果您使用的是SQL Server,那么很难打败Data Dude(也就是Visual Studio的Database Edition)。一旦掌握了它,就可以轻松地在数据库的源控制版本和生产版本之间进行模式比较。只需点击一下,你就可以生成你的差异DDL。

在MSDN上有一个教学视频,这非常有帮助。

我知道DBMS_METADATA和Toad,但如果有人能够为Oracle提供一个Data Dude,那么生活将会非常甜蜜。

0
额外

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

公平地说,它是1.0版本的产品,并且不是没有几个问题。

0
额外

MyBatis (formerly iBatis) has a schema migration, tool for use on the command line. It is written in java though can be used with any project.

为了实现一个好的数据库变更管理实践,我们需要确定几个关键目标。   因此,MyBatis架构迁移系统(或简称为MyBatis迁移)寻求:
  • 使用任何新的或现有的数据库
  • 利用源代码管理系统(例如Subversion)
  • 使并发开发人员或团队能够独立工作
  • 允许冲突非常明显且易于管理
  • 允许向前和向后迁移(分别进化,分别)
  • 使数据库的当前状态易于访问和理解
  • 尽管有访问权限或官僚作风,仍然启用迁移
  • 使用任何方法
  • 鼓励良好的一致实践
0
额外