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

自动生成数据库更改脚本

  •  13
  • thijs  · 技术社区  · 16 年前

    我正在寻找一种为我们的数据库自动生成变更脚本的方法。

    目前我们使用的是Visual Studio 2008数据库版本,它具有模式比较选项,但我看不到自动化这些操作的方法。

    我想做的是在我的日常构建期间创建一个旧的和一个新的数据库,并让模式比较为这两者之间的差异生成一个变更脚本。(在模式和过程上的差异,可以删除并重新创建查找表,而不会出现问题)

    有人知道解决方案吗,还是我要写几英里的脚本来解决这个问题?

    使用微软工具以外的任何付费产品都不是这里的选择…

    根据反馈更新:

    • 我有各种大小的数据库,但是所有的更改都将以一种可控的方式发生,同时还要知道已经存在的数据。
    • 只有“简单”的更改才应该自动处理,我正在考虑添加列和表(非常常见)。永远不能删除列(因此,如果发生这种情况,工具/脚本可能会提出抗议)
    8 回复  |  直到 12 年前
        1
  •  7
  •   shoover    16 年前

    与@anton gogoolev所做的类似,我们使用的工具允许您在XML文件中编写迁移。我们使用的工具叫做 Liquibase 它支持许多不同的DBMS风格。我们不仅在开发人员模式中内部使用它,在客户运行的升级安装过程中也在外部使用它。

        2
  •  5
  •   Chaz Gardyner    12 年前

    希望我还能帮上忙:

    您应该能够使用任何支持命令行界面的好的数据库比较工具来实现这一点。在这种情况下,您必须创建一个简单的BAT脚本并将其添加到任务调度程序中。

    我知道 ApexSQL Diff 支持这个功能,我非常肯定 SQL Compare 在Pro版本中,From Red Gate具有相同的选项。

        3
  •  3
  •   Community Mohan Dere    9 年前

    AS thijs 提到, Database Edition Power Tools 包含可从代码中使用以生成更改脚本的sqlschemacomparetask:

    SqlSchemaCompareTask task = new SqlSchemaCompareTask()
    {
        SourceConnectionString = "Data Source=source-db; ...",
        SourceDatabaseName = "source-database-name",
        TargetConnectionString = "Data Source=target-db; ...",
        TargetDatabaseName = "target-database-name",
        OutputFileName = "changes.sql",
        OutputPath = @"C:\path\to\output"
    };
    
    task.Execute();
    

    或者,您可以使用构建脚本通过 msbuild.exe :

    <Import
        Project="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v8.0\TeamData\
                 Microsoft.VisualStudio.TeamSystem.Data.PowerTools.Tasks.targets"/>
    <Target Name ="SchemaCompare">
        <SqlSchemaCompareTask
            SourceConnectionString="$(SourceConnectionString)"
            SourceDatabaseName="$(TargetDatabase)"
            TargetConnectionString="$(TargetConnectionString)"
            TargetDatabaseName="$(TargetDatabase)"
            OutputPath = "$(IntermediateOutputPath)"
            OutputFileName = "$(TargetDatabase)SchemaCompare.sql"
            IgnoreChecks ="true"/>
    </Target>
    
        4
  •  2
  •   thijs    16 年前

    在Microsoft®Visual Studio Team System 2008数据库版Power Tools中似乎有一个sqlschemaCompareTask。 http://www.microsoft.com/downloads/details.aspx?FamilyID=73ba5038-8e37-4c8e-812b-db14ede2c354&displaylang=en

    这是基于数据库版本的第一个版本,而不是基于GDR2更新版本。

        5
  •  1
  •   Anton Gogolev    16 年前

    你可以试着改变一下你的方法。

    我正在开发一个叫做 Wizardby 它允许您在一个特殊的DSL中写入数据库迁移。因此,您不需要依赖脆弱的模式比较算法(例如,它们都不能正确地处理列/表的重命名),而是在 mdl 文件,随后由向导编译为平台特定的SQL。它也可以集成到您的构建过程中。

        6
  •  1
  •   SQL Cowboy    16 年前

    SQL比较的功能也可以作为库来使用,并且也可以作为文档来记录。我在控制台应用程序中使用了这些DLL,没有问题。

        7
  •  1
  •   Tomas Tintera    16 年前

    你能更具体一点吗?例如,数据库有多大?它有多少数据? 升级应该有多快?

    我确信这个问题没有一个完全通用和自动的解决方案。

    • 如果重命名列并只进行模式比较?该列将被删除并创建为空。

    • 如果您将列全名分为name、midlename和surname。模式比较应该如何处理它?

    当然,这个样品可以继续进行下去。

        8
  •  1
  •   penderi    16 年前

    我用了10年 DbGhost 在我去过的大多数咨询机构中实现SQL变更管理;对于缺少与为应用程序代码提供的SQL变更管理相比的SQL变更管理,这是一个永无止境的惊喜。

    Innovartis' 在实现数据库支持的持续集成方法以及发布过程和升级路径方面,支持是首屈一指的。最近,我将它应用到了我正在研究的单轨/nhibernate项目中,该项目从指定数据库的POCO域模型生成升级脚本。这些都是使用我们的CruiseControl构建在每次签入的基础上创建和应用的。

    更具体地说,你可以指出 二进制幻像 到数据库的发布版本(v1.0),然后编写源数据和静态数据的脚本。然后可以将其输入到源代码管理中。这些是可选步骤,但是明智的起点。

    二进制幻像 还可以比较(和/或创建)从源数据库或当前数据库(如v1.1)生成的数据库,并提供比较报告、升级脚本或升级目标数据库。

    我们使用它来生成所有升级脚本(前滚和后滚),以便在每个增量之间升级。

    在10年内,每当我发现产品有问题时,有帮助的支持人员总是礼貌地指出我的过程中的一个错误或过程中需要使用的许多扩展点中的一个来克服我的问题。它当然可以处理列、索引、数据的删除,绝对可以处理所有事情。这些设置只允许您自动实现简单的更改,并且在警告时失败,或者删除XML设置文件中可维护的对象(列/表)(我们在开发构建中有更具同情心的设置,对实时构建更严格)。

    我不会考虑没有它的SQL Server开发,它彻底改变了我的SQL开发。

    如果您需要关于推荐流程或更多规定性步骤的更多详细信息,请通知我。