【发布时间】:2016-06-20 13:14:27
【问题描述】:
您能否从 VS 2015 中的 Sql Server Db 项目创建一个通用的部署脚本,不需要针对特定目标数据库进行架构比较/发布?
一些背景:
我们正在使用Sql Server Database projects 来管理我们的数据库架构。我们主要使用这些项目来生成 dacpacs,这些 dacpacs 会被推送到我们的开发环境中。它们还用于我们产品的全新安装。最近我们为我们的产品开发了一个附加组件,并为它创建了一个新的数据库项目,引用我们的核心项目。对于客户需要附加组件的新产品安装,将部署我们的新项目。
我们遇到的问题是我们需要能够生成“通用”升级脚本。我们现有的大多数安装都不是通过这些项目生成的,并且都包含许多特定于该客户安装的“自定义”存储过程/等。我正在寻找一种生成脚本的方法,该脚本将执行“如果不存在/创建 + 更改”而不需要指定目标数据库。
我们的插件项目仅包含存储过程和几个表,对于选择此插件的任何客户来说,所有这些都是新的。我需要避免丢弃不在项目中的项目,同时能够部署我们所有的新“东西”。我找到了Include Composite Objects 的选项,我可以取消选中该选项,以便部署特定于我们的插件,但发布仍然需要我指定目标数据库,以便可以执行模式比较并且我得到的脚本是特定于该特定数据库。我几乎尝试了所有选项,但找不到解决方案。
底线:有没有办法让我生成一个通用脚本,只要在现有安装上请求附加组件,我就可以将它提供给我的部署团队,而无需进行架构比较还是直接从项目中为每个数据库发布?
现在我在我们的(非 db)项目中维护一组单独的 .sql 文件,遵循if not exists/create+alter 范式,与 db 项目中的项目匹配。这些在我们的插件构建过程中被连接起来,这样我们就可以给我们的部署团队一个脚本来运行。事实证明这很麻烦,如果可能的话,我们希望能够为此使用数据库项目。
【问题讨论】:
-
你能把你的“附加”对象放在一个单独的项目中,并引用你的主项目吗?维护一个“干净的”数据库并针对该干净的数据库生成“附加”脚本。它应该只生成 Create 语句。如果您需要 Alters,最好让部署团队运行 SQLPackage 来生成脚本。您可以创建一个批处理文件来很容易地做到这一点。只需给他们更新的 dacpacs,过程是相同的 - 生成脚本,必要时查看,运行。
-
它已经在一个单独的项目中,并带有您建议的参考。这种方法可以工作,但如果我们需要更新其中一个存储过程(例如错误修复),这种方法将不起作用,这就是我正在寻找改变的原因。我对 SqlPackage 不熟悉,我得看看它。
-
基本上,您将 dacpacs 交给安装人员。他们运行 SQLPackage(可能通过批处理文件或 PowerShell)将其指向要更新的服务器/数据库。然后它将生成脚本或直接更新。听起来他们已经可以访问服务器,所以应该能够做到这一点。 SQLPackage 也应该包含在服务器上,或者只要安装程序可以看到目标数据库,它就可以在本地运行。这可能会有所帮助:schottsql.wordpress.com/2012/11/08/ssdt-publishing-your-project
-
所以他们会得到“完整”的 dacpac,但是使用发布配置文件,它只做我想要的(没有复合,删除/忽略设置)和目标数据库会部署我需要的部分吗?至少我是这么读你的文章的。如果是这种情况,请发布此答案。我想出了一个 hacky 解决方法,它涉及一个二级构建配置,其中包括一个自定义预部署脚本(仅在该配置中),该脚本删除我所有的程序等并备份和恢复(通过另一个自定义后部署),但它涉及我维护所有该脚本中的水滴。不是最好的,但有效
-
完成。请注意那些在对您的数据库所做的更改中获得“创造性”的客户。大多数客户都还不错,但有些客户可能会做出一大堆影响应用程序本身的更改。对于那些客户,您可能需要强制执行“未找到删除对象”。大多数时候,我会避免这样做,因为客户有时会在您的架构之外创建帮助程序/表。 :)
标签: sql-server visual-studio-2015 database-project