13

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

目前我们使用Visual Studio 2008的数据库版本,它具有架构比较选项,但我不明白的方式来自动的行动。

我希望做的是创造一老一新的数据库,在我的日常构建和具有架构比较产生这两个之间的差异变化脚本。 (在架构和程序不同,查找表可以被删除并重新创建没有问题)

有谁知道一个解决方案,还是我去写剧本的英里拿到这是怎么回事?

使用任何付费产品除了微软的工具是不是在这里一个选项...

更新基于反馈:

  • 我有各种大小不同的数据库,但所有的改变将在发生同时知道已经存在的数据。
  • 只有“简单”的变化应该采取自动关心,我想增加列和表(非常常见)。列可能永远不会被删除(所以如果发生这种情况,工具/脚本可能会提出抗议)

回答

7

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

+0

好的电话,我会看看这个 – thijs 2010-02-17 12:44:11

1

您可以尝试反转您的方法。

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

+0

我们已经使用Enterprise Architect对我们的数据库建模,从那里我们生成了sql创建脚本。我会再看看EA可以在这里做什么... – thijs 2010-02-12 16:19:03

1

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

+0

你可以更具体地说明你使用了哪些程序集/类,甚至可以提供一些示例吗? – thijs 2010-02-16 09:22:34

1

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

我确定没有针对此问题的完全通用的自动解决方案。

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

  • 如果分割列全名,以名,MidleName,姓。模式比较应如何处理?

确定这个样本可以继续和继续。

+0

我可以放心地说,重命名不会发生。分裂数据也是一样。对架构的任何更改对于数据都是“安全的”。如果我们改变需要重建数据的东西,我会很乐意为此手动编写脚本。我希望自动化能够照顾“简单”的东西(添加表格,列,更新和添加索引) – thijs 2010-02-16 10:22:29

3

如前所述thijsDatabase 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> 
+0

这个功能在VS2010中发挥了什么作用? – CodeGrue 2011-07-06 13:28:21

1

10年来,我一直使用DbGhost来实施我在过去的大多数咨询公司的sql变更管理;这是一个永无止境的惊喜,因为缺乏SQL变更管理来提供应用程序代码。

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

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

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

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

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

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

如果您需要更多关于推荐过程或更具说明性步骤的详细信息,请让我知道。

5

希望我仍然可以帮助:

您应该能够支持命令行接口的任何好的数据库比较工具来做到这一点。在这种情况下,您将不得不创建一个简单的bat脚本并将其添加到任务计划程序中。

我知道ApexSQL Diff支持此功能,我很确定SQL Compare from红门在pro版本中有相同的选项。

相关问题