【问题标题】:How to Update/Distribute SQ Server DB Projects?如何更新/分发 SQL Server 数据库项目?
【发布时间】:2015-01-21 13:44:42
【问题描述】:

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

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

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

【问题讨论】:

    标签: sql-server database visual-studio projects


    【解决方案1】:

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

    这种方法有两个好处:

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

    【讨论】:

    • 我想确保我理解。我有包含所有静态数据的基本 sql 数据库,并且具有正确的架构作为 SQL 项目。我有一个客户在他们的服务器上有一个数据库,需要更新的模式和静态数据。我使用 SQLPackage 的流程是什么?我构建了我的 SQL 项目,并获得了一个 dacpac 文件。然后,在客户端机器上,我会使用我假设的某种参数运行 SqlPackage,一些指向 dacpac,另一些指向数据库/服务器?如果你能澄清/纠正这个整体过程,你会比现在更能救命
    • 正确。这是一个解释使用 SqlPackage.exe 进行部署的博客:blogs.msmvps.com/deborahk/deploying-a-dacpac-with-sqlpackage。对于静态数据,建议编写一个部署后脚本,将该数据合并到表中(例如,使其具有幂等性,因此多次部署不会弄乱数据)。 Jamie Thomson 在这篇博文中有这样的例子:sqlblog.com/blogs/jamie_thomson/archive/2012/01/01/…
    • 这里还有 SqlPackage.exe 文档页面 - 很有帮助,因为它解释了发布/脚本 msdn.microsoft.com/en-us/library/hh550080(v=vs.103).aspx987654323@ 所需的各种参数
    • 其实blogs.msdn.com/b/ssdt/archive/2012/02/02/… 可能是项目中包含数据的最佳参考,清楚地展示了如何编写合并。希望这会有所帮助
    • 非常感谢!这一切看起来都很棒,我希望能够很快对其进行测试!
    【解决方案2】:

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

    【讨论】:

    • 我们将如何使用模式之类的东西与我们最多只能拥有 RDP 访问权限的数据库进行比较?目前,我提到的应用程序是由客户通过我们的网站或 FTP 下载的,然后他们运行它,它会运行各种 SQL 脚本。可能并非所有客户都运行过以前的更新,因此很遗憾,我们不能仅将其基于我们当前的办公室数据库。
    • 使用版本控制 TFS、Git、CVS、SVN。任何人。然后通过 RDP 将其带到他们的服务器并进行比较。
    【解决方案3】:

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

    作为替代方案,请查看 Entity Framework Migrations https://msdn.microsoft.com/en-gb/data/jj591621.aspx,它们可以让您控制更新架构和插入记录,还可以让您在需要时回滚/降级。

    【讨论】:

      【解决方案4】:

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

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

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

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

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

      【讨论】:

        猜你喜欢
        • 2021-12-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-04
        • 1970-01-01
        • 1970-01-01
        • 2017-11-15
        相关资源
        最近更新 更多