代码之家  ›  专栏  ›  技术社区  ›  borjab

使用Oracle的数据库源代码管理

  •  13
  • borjab  · 技术社区  · 15 年前

    我花了好几个小时寻找将数据库签入源代码管理的方法。我的第一个想法是一个计算数据库差异的程序,并要求所有开发人员将他们的更改作为新的差异脚本来添加。现在,我发现如果我能将一个数据库转储到一个文件中,我就可以签入它,并将其用作其他类型的文件。

    主要条件是:

    • 适用于Oracle 9R2
    • 人类可读,因此我们可以使用diff来查看不同之处。(.dmp文件似乎不可读)
    • 批处理中的所有表。我们有200多张桌子。
    • 它存储结构和数据
    • 它支持CLOB和RAW类型。
    • 它存储过程、包及其主体、函数、表、视图、索引、约束、安全和概要。
    • 它可以转换成一个可执行的脚本,将数据库重新构建成一个干净的机器。
    • 不限于非常小的数据库(支持至少20万行)

    这不容易。我下载了很多演示,但都失败了。

    编辑 :我不介意替代方案,只要它们允许我们在批处理模式下对照我们的发布数据库结构和对象+数据检查工作系统。

    顺便说一句。我们的项目已经开发多年了。当您重新开始时,一些问题很容易实现,但此时看起来很难实现。

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

    9 回复  |  直到 10 年前
        1
  •  14
  •   Stephen ODonnell    15 年前

    很多人试图做这种事情(diff模式)。我的意见是

    • 源代码进入版本控制工具(subversion、csv、git、performce…)。把它当作是Java或C代码,它真的没有什么不同。您应该有一个安装过程来检查它并将其应用到数据库。
    • DDL是源代码。它也会进入版本控制工具。
    • 数据是灰色区域-查找表可能应该在版本控制工具中。应用程序生成的数据当然不应该。

    现在我的工作方式是创建类似于RubyonRails迁移的迁移脚本。将您的DDL放入脚本中并运行它们在版本之间移动数据库。将版本的更改分组为单个文件或一组文件。然后有一个脚本将应用程序从版本X移动到版本Y。

    有一件事我再也不做了(而且我以前一直这样做直到我学到更好),那就是在我的开发环境中使用任何GUI工具来创建数据库对象。从第一天开始编写DDL脚本-无论如何,您都需要它们来提升代码的测试、生产等能力。我见过这么多人使用gui创建所有的对象,到了发布的时候,有一个拼字游戏试图生成脚本来正确地创建/迁移模式,而这通常是没有测试过的,而且失败了!

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

        2
  •  2
  •   No AI now No AI ever    15 年前

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

        3
  •  2
  •   Hector Minaya    15 年前

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

    链接如下: http://www.allroundautomations.com/bodyplsqldev.html

        4
  •  1
  •   Nick    15 年前

    它可能不像检测差异那么灵活,但是我们使用一个简单的Ant构建文件。在当前的cvs分支中,我们将把“base”数据库代码分解成表和触发器等的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>
    
        5
  •  1
  •   Stephanie Page    15 年前

    我认为这是一个,

    • 你想解决一个问题
    • 你想出了一个解决办法
    • 你不知道如何实现这个解决方案
    • 因此,现在您正在寻求有关如何实现解决方案的帮助

    寻求帮助的更好方法,

    • 告诉我们问题是什么
    • 询问解决问题的想法
    • 选择最佳解决方案

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

        6
  •  1
  •   René Nyffenegger    15 年前

    你试过了吗? Oracle's Workspace Manager 是吗?虽然我在生产数据库中没有使用过它的经验,但是我发现一些使用它的玩具实验是有前途的。

        7
  •  1
  •   J-16 SDiZ    15 年前

    不要尝试区分数据。只需编写一个触发器来存储更改数据时要获取的任何内容。

        8
  •  1
  •   Craig Trader    15 年前

    虽然可能很贵,但像 TOAD for Oracle 对于解决这类问题很理想。

    也就是说,我的首选解决方案是从所有DDL(包括存储过程定义)作为文本开始,在版本控制下进行管理,并编写将从源代码创建功能正常的数据库的脚本。如果有人想要修改这个模式,他们必须,必须,必须将这些更改提交到存储库,而不仅仅是直接修改数据库。没有例外!这样,如果您需要构建反映版本之间更新的脚本,则需要获取所有已提交的更改,然后添加您需要按摩任何现有数据以满足更改的任何DML(为现有行添加新列的默认值等),并将所有DDL(和预填充数据)作为文本,收集差异就像区分两个源树一样简单。

    在我的上一个工作中,我使用了nant脚本来恢复测试数据库,根据数据库的版本运行所需的所有升级脚本,然后将最终结果转储到ddl和dml。对于一个空数据库(从头创建一个),我也会这样做,然后比较结果。如果这两个程序明显不同(转储程序不完美),我可以立即告诉您需要对更新/创建DDL和DML进行哪些更改。虽然我确实使用了像toad这样的数据库比较工具,但当我需要生成用于分析数据的通用脚本时,它们不如手工编写的SQL有用。(机器生成的代码可能非常脆弱。)

        9
  •  1
  •   Aram Paronikyan    10 年前

    试试雷德盖特的 Source Control for Oracle . 我从来没有试过Oracle版本,但MSSQL版本真的很棒。