Sql server 数据库更改脚本的自动生成

Sql server 数据库更改脚本的自动生成,sql-server,visual-studio-2008,sql-server-2005,tsql,tfsbuild,Sql Server,Visual Studio 2008,Sql Server 2005,Tsql,Tfsbuild,我正在寻找一种为我们的数据库自动生成更改脚本的方法 目前我们使用VisualStudio2008数据库版,它有模式比较选项,但我看不到自动化这些操作的方法 我想做的是在我的日常构建过程中创建一个旧的和一个新的数据库,并让schema compare为这两个数据库之间的差异生成一个更改脚本。(模式和过程不同,可以删除并重新创建查找表,而不会出现问题) 是否有人知道解决方案,或者我是否打算编写数英里的脚本来实现这一点 使用除Microsoft工具之外的任何付费产品在这里都不是一个选项 根据反馈更新:

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

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

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

是否有人知道解决方案,或者我是否打算编写数英里的脚本来实现这一点

使用除Microsoft工具之外的任何付费产品在这里都不是一个选项

根据反馈更新:

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

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


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

SQL Compare的功能也可以作为库提供,并作为库记录。我在一个控制台应用程序中使用了这些DLL,没有问题。

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

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

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

  • 如果将列FullName分为Name、MidleName和姓氏。模式比较应该如何处理它


确保此示例可以继续进行。

在Microsoft®Visual Studio Team System 2008数据库版Power Tools中似乎有一个SqlSchemaCompareTask。

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

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


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

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

在实施数据库支持的持续集成方法以及发布过程和升级路径方面,支持是首屈一指的。最近,我将其应用于Monorail/nHibernate项目,该项目从指定数据库的POCO域模型生成升级脚本。这些都是在每次签入时使用CruiseControl构建创建和应用的

更具体地说,对于您的情况,您可以指向数据库的发布版本(v1.0),并编写源数据和静态数据的脚本。然后可以将其输入源代码管理。这些都是可选步骤,但却是明智的起点

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

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

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

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

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

希望我仍能提供帮助:

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


我知道它支持这个功能,而且我很确定红门在pro版本中也有相同的选项

我们已经使用EnterpriseArchitect对数据库进行建模,并从中生成sql创建脚本。我将再看一看EA在这里能做些什么……您能更具体地说明您使用了哪些程序集/类吗,甚至可以提供一些示例吗?我可以肯定地说,重命名不会发生。分割数据也是一样。对模式的任何更改对于数据来说都是“安全的”。如果我们更改了需要重建数据的内容,我很乐意为此手动编写脚本。我希望自动化处理“简单”