【问题标题】:Automating database schema comparison using Microsoft technologies (SSDT)使用 Microsoft 技术 (SSDT) 自动化数据库模式比较
【发布时间】:2017-10-04 14:27:34
【问题描述】:

SQL Server Data Tools (SSDT) 包含一个架构比较实用程序,可用于比较两个数据库定义。比较的源和目标可以是连接的数据库、SQL Server 数据库项目、快照或 .dacpac 文件的任意组合。比较结果显示为一组必须对目标执行的操作,以使其与源相同。比较完成后,您可以直接更新目标(如果目标是项目或数据库)或生成更新 sql 脚本。

有没有办法使用当前(2017 年)Microsoft 技术自动生成更新脚本?

注意:可以通过 .net 库或 CLI 支持自动化。

【问题讨论】:

  • 使用 msbuild 将 SSDT 项目发布到脚本。您可以在 msbuild 参数中指定目标数据库,虽然我自己没有这样做,所以我无法编写它,我只知道这是一个选项。
  • Schema Compare 不会这样做(这就是 Redgate 仍在营业的原因)。你可以得到一个diff script from a DACPAC, though。
  • 似乎有一个选项可以使用 sqlpackage 在一行中执行此操作,如下所示:C:\Program Files (x86)\Microsoft SQL Server\140\DAC\bin>sqlpackage /Action:Script /SourceFile:source_file.dacpac /TargetFile:target_file.dacpac" /TargetDatabaseName:MyDatabase /OutputPath:delta_script.sql

标签: c# sql-server visual-studio-2017 sql-server-data-tools


【解决方案1】:

有几种方法可以做到这一点,但最简单的方法是按照@Crowcoder 的建议使用 MSBuild。 这些是我在 powershell 脚本中使用的代码行。

从数据库中提取 dacpac(您可能不需要,但如果这样做,则需要 sqlpackage。可能的位置是 C:\Program Files (x86)\Microsoft SQL Server\140\ DAC\bin\SqlPackage.exe)

$cmd = "`"$sqlPackagePath`" /Action:Extract /tf:`"$dacpacPath`" /SourceConnectionString:`"$connString;Initial Catalog=$dbName;`""

生成发布脚本(可能的位置是 C:\Program Files (x86)\MSBuild\14.0\Bin\MSBuild.exe)

$cmd = "`"$msBuildPath`" `"$sqlProjPath`" /p:Configuration=Release /t:Build /p:SqlPublishProfilePath=`"$publishConfigPath`""

【讨论】:

  • SqlPackage 似乎可以选择直接生成 SQLCMD 脚本。这显然必须清理以删除所有 sqlcmd 变量,但它会是这样的:C:\Program Files (x86)\Microsoft SQL Server\140\DAC\bin>sqlpackage /Action:Script /SourceFile:source_file .dacpac /TargetFile:target_file.dacpac" /TargetDatabaseName:MyDatabase /OutputPath:delta_script.sql
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-07
  • 1970-01-01
  • 1970-01-01
  • 2023-03-17
  • 2016-02-05
相关资源
最近更新 更多