如何 Update/Distribute SQL Server 数据库项目?

How to Update/Distribute SQ Server DB Projects?

我的公司让我考虑从我们当前管理我们软件使用的数据库的方法转换。我们不仅需要管理办公室内的数据库,还需要管理全国的客户数据库。目前,我们有一个程序,其中包含 运行 各种 sql 脚本,用于添加、删除和更新数据库中的字段和表格,但这开始变得庞大而繁琐。

我的任务是研究 SQL 服务器数据库项目,就创建新数据库而言,它看起来很棒。但是,我找不到太多关于我们如何使用它(他们 运行 他们自己的 SQL 现场服务器)向我们的客户分发更新的信息,以便他们拥有最新的表和架构信息与我们程序中的更改和添加的功能相对应。有没有内置的方法来做到这一点?

每次我查找使用数据库项目更新现有数据库时,它都会说要使用模式比较。由于各种原因,这绝对不是个人测试数据库之外的一个选项。

尝试SQL 服务器数据工具 (SSDT) + TFS + 架构比较。它会自动创建模式更新脚本。 它在链接服务器和跨数据库方面存在一些问题,但到目前为止我尝试了一切都可以通过某些方式解决。 另一件事是Redgate Source control。非常简单和直观。不过要加钱。

通常,您会保留以前版本数据库的一个版本,并与该版本进行架构比较,然后将其另存为 .SQL 文件。客户端然后可以 运行 几个 .sql 文件的组合以将它们升级到最新版本(但他们不能通过这种方式降级)。

作为替代方案,请查看 Entity Framework 迁移 https://msdn.microsoft.com/en-gb/data/jj591621.aspx 它们可以让您控制更新架构和插入记录,但如果需要,还可以让您 rollback/downgrade。

我建议您使用 SqlPackage.exe 在客户端计算机上进行部署。一般过程是:将现有数据库导入 SQL 项目。获取此构建一个包含所有模式更改的 .dacpac,加上根据需要编写 pre/post 操作数据所需的部署脚本。然后不使用架构比较,而是使用发布进行数据库更新 - 在 VS 中,项目有一个 "Publish" 选项,而 SqlPackage.exe 是具有匹配功能的命令行工具。

这种方法有两个好处:

  1. 完全发布确保目标数据库实际更新以匹配项目架构。如果您针对一个 DB 生成脚本(使用 Schema Compare/Publish)然后尝试应用到另一个 DB,您必须希望它们事先具有完全相同的 schema。如果您实际上 运行 Publish/Generate 针对真实目标服务器的脚本,您将保证所应用的是您所期望的。
  2. SqlPackage 在您无法在客户端计算机上安装任何东西的情况下很有用。这是因为您可以将所有必需的 DLL 复制到 1 个文件夹(将 SqlPackage.exe 和同一文件夹中的其他文件加上 C:\Program Files 中的 Microsoft.SqlServer.TransactSql.ScriptDom.dll 和 Microsoft.SqlServer.Types.dll (x86 )\Microsoft SQL Server0\SDK\Assemblies) 并在任何地方使用它。您可以将其放在拇指驱动器上或将其复制为 .zip 文件

如果您选择使用 Redgate 工具,这里有一个方法。

  1. 运行 Snapper 在您的客户数据库中。这是一个免费工具,可以为您的客户数据库拍摄模式快照。这将创建一个仅包含模式信息的二进制文件。

  2. 将此架构文件复制到您的本地环境。使用 SQL 比较将您的开发数据库(假设这是您的升级源)与架构快照(目标)进行比较。这将生成一个为您的客户量身定制的 SQL 部署文件。

  3. 将 SQL 部署文件复制到您的客户环境并执行它。

如果您需要任何进一步的帮助,post 对此答案发表评论或 post 在 our forum 上提问。我们很乐意提供帮助。