自动生成数据库更改脚本

时间:2010-02-12 16:06:16

标签: sql-server visual-studio-2008 sql-server-2005 tsql team-build

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

目前我们使用Visual Studio 2008数据库版本,它具有Schema Compare选项,但我没有看到自动执行这些操作的方法。

我想要做的是在我的每日构建期间创建一个旧的和新的数据库,并且让架构比较生成一个更改脚本,用于这两者之间的差异。 (架构和过程的差异,查找表可以删除并重新创建而没有问题)

有没有人知道一个解决方案,或者我要写几英里的脚本来实现这个目标?

除了Microsoft工具之外,使用任何付费产品都不是这里的选择......

根据反馈进行更新:

  • 我有各种各样大小的数据库,但所有更改都会以受控方式发生,同时了解已存​​在的数据。
  • 只有“简单”的更改应该自动处理,我正在考虑添加列和表(非常常见)。可能永远不会删除列(因此,如果发生这种情况,工具/脚本可能会发出抗议)

8 个答案:

答案 0 :(得分:7)

与@Anton Gogolev正在做的类似,我们使用的工具允许您在XML文件中编写迁移。我们使用的工具称为Liquibase,它支持许多不同的DBMS风格。我们不仅在内部在开发人员模式中使用它,我们还在客户运行的升级安装期间在外部使用它。

答案 1 :(得分:5)

希望我仍能提供帮助:

您应该可以使用任何支持命令行界面的良好数据库比较工具来执行此操作。在这种情况下,您必须创建一个简单的bat脚本并将其添加到任务计划程序。

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

答案 2 :(得分:3)

如上所述,thijs包含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>

答案 3 :(得分:2)

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

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

答案 4 :(得分:1)

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

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

答案 5 :(得分:1)

SQL Compare的功能也可以作为库使用,并记录在案。我在控制台应用程序中使用了这些dll,没有任何问题。

答案 6 :(得分:1)

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

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

  • 如果重命名列并且仅进行架构比较?该列将被删除并创建为空。

  • 如果将列FullName分为Name,MidleName,SurName。架构比较应如何处理它?<​​/ p>

确保这些样品可以继续使用。

答案 7 :(得分:1)

10年来,我已经使用DbGhost在我所经历的大多数咨询公司实施sql变更管理;对于提供应用程序代码的竞争对手缺乏SQL变更管理,这是一个永无止境的惊喜。

Innovartis'支持在实施数据库支持的持续集成方法以及发布流程和升级路径方面提供帮助是首屈一指的。最近我将它应用到我正在研究的Monorail / nHibernate项目中,该项目从我们的POCO域模型生成升级脚本,该模型指定了我们的数据库。这些都是在每次办理登机手续时使用我们的CruiseControl构建和应用的。

更具体地说,您可以将DbGhost指向数据库的发行版本(v1.0)并编写源和静态数据的脚本。然后可以将其输入源控件。这些是可选步骤,但是明智的起点。

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

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

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

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

如果您需要有关推荐流程或更多规定步骤的更多详细信息,请与我们联系。