Database 基于Oracle的数据库源代码管理

Database 基于Oracle的数据库源代码管理,database,oracle,version-control,Database,Oracle,Version Control,我一直在寻找一种将数据库签入源代码管理的方法。我的第一个想法是一个用于计算数据库差异的程序,并要求所有开发人员将其更改作为新的差异脚本进行补充。现在,我发现如果我能将一个数据库转储到一个文件中,我会将它签入并将其用作其他类型的文件 主要条件是: 为Oracle 9R2工作 人类可读,因此我们可以使用diff来查看差异。(.dmp文件似乎不可读) 批处理中的所有表。我们有200多张桌子 它同时存储结构和数据 它支持CLOB和RAW类型 它存储过程、包及其主体、函数、表、视图、索引、约束、Secu

我一直在寻找一种将数据库签入源代码管理的方法。我的第一个想法是一个用于计算数据库差异的程序,并要求所有开发人员将其更改作为新的差异脚本进行补充。现在,我发现如果我能将一个数据库转储到一个文件中,我会将它签入并将其用作其他类型的文件

主要条件是:

  • 为Oracle 9R2工作
  • 人类可读,因此我们可以使用diff来查看差异。(.dmp文件似乎不可读)
  • 批处理中的所有表。我们有200多张桌子
  • 它同时存储结构和数据
  • 它支持CLOB和RAW类型
  • 它存储过程、包及其主体、函数、表、视图、索引、约束、Secuences和Synonim
  • 可以将其转换为可执行脚本,以将数据库重建为干净的机器
  • 不限于非常小的数据库(支持至少200.000行)
这并不容易。我已经下载了很多以某种方式失败的演示

编辑:我不介意替代方法,前提是它们允许我们在批处理模式下根据发布数据库结构和对象+数据检查工作系统

顺便说一下。我们的项目已经开发多年了。当你有一个新的开始时,有些方法很容易实现,但在这一点上似乎很难


编辑:为了更好地理解问题,假设某些用户有时可以在生产环境中更改配置数据。或者,开发人员可以在realease分支中创建新字段或更改视图,而无需事先通知。我需要注意这些变化,否则将这些变化合并到生产中会很复杂

Oracle SQL Developer具有“数据库导出”功能。它可以生成包含所有DDL和数据的单个文件

它可能没有检测差异那么容易,但是我们使用了一个简单的ant构建文件。在我们当前的CVS分支中,我们将把“基本”数据库代码分解到表和触发器等的ddl中。我们还将有delta文件夹,以同样的方式打开。从零开始,您可以运行“base”+“delta”并获取数据库的当前状态。当您投入生产时,只需运行“delta”构建就可以了。如果你有一个巨大的模式,并且你正在快速地改变它,那么这个模式就不能很好地工作。(注意:至少在数据库对象中,如表、索引等。对于包、过程、函数和触发器,它工作得很好。)下面是一个示例ant任务:

    <target name="buildTables" description="Build Tables with primary keys and sequences">
<sql driver="${conn.jdbc.driver}" password="${conn.user.password}"
    url="${conn.jdbc.url}" userid="${conn.user.name}"
    classpath="${app.base}/lib/${jdbc.jar.name}">
    <fileset dir="${db.dir}/ddl">
        <include name="*.sql"/>
    </fileset>
</sql>
</target>


< /代码> 我使用了一个集成了Team Foundation Server的VCL插件的PL/SQL开发人员,但它只支持数据库对象,而不是数据本身,这通常不受源代码控制的影响。
以下是链接:

我认为这是一个,

  • 你在试图解决一个问题
  • 你已经想出了一个解决办法
  • 您不知道如何实施解决方案
  • 因此,现在您正在寻求有关如何实施解决方案的帮助
获得帮助的更好方式,

  • 告诉我们问题出在哪里
  • 征求解决问题的意见
  • 选择最佳解决方案

我不知道你要解决的问题是什么。有时,从问题中可以明显看出,这一点肯定不是。但我可以告诉你,这个“解决方案”将变成它自己的维护噩梦。如果你认为开发数据库和使用它的应用程序很难。以人类可读的形式对整个数据库进行版本控制的想法简直是疯了。

你试过了吗?我并没有在生产数据库中使用它的任何经验,但我发现它的一些玩具实验很有希望。

很多人尝试做这种事情(不同的模式)。我的意见是

  • 源代码进入版本控制工具(Subversion、CSV、GIT、Perforce…)。将其视为Java或C代码,其实没有什么不同。您应该有一个安装过程来检查它并将其应用于数据库
  • DDL是源代码。它也会进入版本控制工具
  • 数据是灰色区域-查找表可能应该在版本控制工具中。应用程序生成的数据当然不应该
我现在的做法是创建类似于RubyonRails迁移的迁移脚本。将DDL放入脚本中并运行它们以在版本之间移动数据库。将发布的更改分组到单个文件或一组文件中。然后您就有了一个脚本,可以将应用程序从版本x移动到版本y

有一件事我再也没有做过(在我学得更好之前我一直这样做),那就是在我的开发环境中使用任何GUI工具来创建数据库对象。从第1天开始编写DDL脚本-无论如何,您都需要它们来提升代码以进行测试、生产等。我见过很多人使用GUI来创建所有对象,在发布时,试图生成脚本以正确创建/迁移模式,但往往未经测试且失败


每个人都会有自己的偏好如何做到这一点,但多年来我看到很多事情做得很糟糕,这形成了我的上述观点

不要试图区分数据。只要写一个触发器来存储在数据更改时想要得到的任何东西。

尽管它可能很昂贵,但像这样的工具可能是解决此类问题的理想工具

也就是说,我的首选解决方案是从所有DDL(包括存储过程定义)作为文本开始,在版本控制下进行管理,然后编写脚本,从源代码创建一个正常运行的数据库。如果有人想要修改模式,他们必须,必须,必须将这些更改提交到存储库,而不仅仅是修改da