自动生成数据库变更脚本

14

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

目前我们使用的是Visual Studio 2008数据库版,其中有Schema Compare选项,但我没有看到自动化这些操作的方法。

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

是否有人知道解决方案,或者我需要写很多脚本才能实现这个目标?

除了Microsoft工具以外,不能使用任何付费产品...

根据反馈更新:

  • 我有各种规模的数据库,但所有变更都将以受控方式进行,同时考虑已经存在的数据。
  • 只有“简单”的更改应该由工具自动处理,例如添加列和表(非常普遍)。列可能永远不会被删除(因此,如果发生这种情况,工具/脚本可能会抗议)。
8个回答

7

和 @Anton Gogolev 所做的类似,我们正在使用一种工具,允许您在 XML 文件中编写迁移。我们使用的工具叫做 Liquibase,它支持许多不同的 DBMS 版本。我们不仅在开发人员模式下内部使用它,而且在客户运行升级安装期间也会外部使用。


好的,我会研究一下这个。 - thijs

5

希望我还能帮到你:

你应该能够使用任何支持命令行接口的好的数据库比较工具来完成这个任务。在这种情况下,您需要创建一个简单的批处理脚本并将其添加到任务计划程序中。

我知道ApexSQL Diff支持此功能,我很确定Red Gate的SQL Compare专业版也有相同的选项。


3
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>

在VS2010中,这个功能去哪了? - CodeGrue

2
微软® Visual Studio Team System 2008 数据库版 Power Tools 中似乎有一个 SqlSchemaCompareTask 工具。 下载地址 此工具基于第一版数据库版,而非 GDR2 最新版本。

1

你可以尝试稍微改变一下你的方法。

我正在开发一个名为Wizardby的工具,它允许你使用特殊的DSL编写数据库迁移。因此,你不再依赖于脆弱的模式比较算法(例如,它们中没有一个能够正确处理列/表重命名),而是将所有对数据库模式的修改都写入一个mdl文件中,然后由Wizardby编译成特定于平台的SQL语句。它还可以集成到你的构建过程中。


我们已经使用Enterprise Architect来建模我们的数据库,从那里我们生成SQL创建脚本。我会再看看EA在这方面能做些什么... - thijs

1
SQL比较功能也可以作为库使用,并有相应的文档。我在控制台应用程序中使用了这些dll,没有遇到问题。

你能更具体地说明你使用了哪些程序集/类,甚至提供一些示例吗? - thijs

1

你能具体一些吗?例如数据库有多大?它有多少数据?升级速度应该有多快?

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

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

  • 如果你将FullName列分成Name、MidleName和SurName,模式比较应该如何处理?

当然,这些示例可以继续下去。


我可以肯定地说,重命名不会发生。拆分数据也是一样的情况。对于模式的任何更改都将对数据“安全”。如果我们更改需要重建数据的内容,我很乐意手动编写脚本。我希望自动化处理“简单”的事情(添加表、列、更新和添加索引)。 - thijs

1

我已经使用DbGhost十年了,用它来实现SQL变更管理在我的大部分咨询公司中;令人惊讶的是缺乏与应用程序代码提供竞争的SQL变更管理。

Innovartis' 的支持在提供实施连续集成方法、发布流程和升级路径方面无与伦比。最近,我将其应用于我正在开发的Monorail/nHibernate项目中,该项目从我们的POCO领域模型生成升级脚本以指定我们的数据库。这些脚本会在每次确认时使用我们的CruiseControl构建系统创建并应用。

更具体地针对您的情况,您可以将DbGhost指向您的数据库发布版本(v1.0),并编写源代码和静态数据的脚本。然后可以将这些步骤输入到源代码控制中。这些是可选步骤,但是一个明智的起点。

DbGhost 还可以比较(和/或创建)源自数据库或当前数据库(例如 v1.1),并提供比较报告、升级脚本或升级目标数据库。

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

在过去的10年中,每当我发现产品存在问题时,乐于助人的支持团队总是礼貌地指出我的流程中的错误或者我需要使用的许多扩展点之一来解决我的问题。它绝对可以处理列、索引、数据的删除等所有操作。设置允许您自动实现仅简单的更改,并且可以在警告或删除对象(列/表)时失败,所有这些都可以在 xml 设置文件中进行维护(我们在开发构建中具有更加同情的设置,在生产构建中则更加严格)。

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

如果您需要有关推荐流程或更详细的步骤,请告诉我。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接