Visual Studio 数据库项目:包括对所有对象的“如果存在”检查
Posted
技术标签:
【中文标题】Visual Studio 数据库项目:包括对所有对象的“如果存在”检查【英文标题】:Visual Studio Database Project: Include 'If Exists' checks for all the objects 【发布时间】:2015-03-04 23:18:04 【问题描述】:我们使用 TFS 持续集成来处理代码的暂存和部署。在我们当前的环境中,我们(开发人员)不允许在生产环境中手动更新数据库。必须暂存脚本,然后将其交给 DBA 运行。
默认情况下,数据库项目构建并输出一个数据库创建脚本,该脚本将创建所有表和存储过程。但是,它不包括检查对象是否已经存在。
例如,当它尝试创建Customer
表时,我想让脚本检查该表是否已经存在,如果它确实改变了该表。
这可能吗?
【问题讨论】:
【参考方案1】:VS 可以为更改创建一个脚本。我认为这种方法会比使用存在检查更好,因为它能够处理列更改,并且总体而言它可以使脚本更短且更有针对性。
-
右键单击项目并选择发布。
单击“编辑”并输入暂存数据库的连接详细信息。
返回“发布”对话框,单击“高级”并确保未选中“始终重新创建数据库”。
返回“发布”对话框,单击“生成脚本”。
这种方法的作用是将数据库项目中的对象与您的暂存数据库进行比较,并针对不同之处生成一个 SQL 脚本。您甚至可以将发布设置保存到文件中,以便更轻松地生成未来的脚本。
【讨论】:
有趣的是,该设置已为我关闭,打开它可以解决此问题。【参考方案2】:Keith 说得对,您需要编写更改脚本,而不仅仅是使用 create 语句。
您基本上要么需要生产数据库的副本来运行比较,要么为 DBA 提供一种运行比较和部署的方法。
我更喜欢使用 TFS 的方式是在 Visual Studio 中使用 SSDT,然后我有一个自定义构建步骤作为构建 dacpac 的 .sqlproj 文件的一部分,使用 sqlpackage.exe 将 dacpac 与生产镜像(或 dev、uat 等) - 然后输出一个脚本,该脚本将该版本的数据库转换为与 dacpac 相同的代码版本。
您可以稍微调整一下以自动部署到 dev、uat 等,然后在生产环境中创建脚本,但具体操作由您决定!
如果您无法获得生产的镜像或生产模式的副本等,您可以将 dacpac 提供给 dbas,并使用批处理文件或 powershell 脚本驱动 sqlpackage.exe 来创建脚本或继续部署吧。
具体的效果取决于你所处的环境!
埃德
【讨论】:
以上是关于Visual Studio 数据库项目:包括对所有对象的“如果存在”检查的主要内容,如果未能解决你的问题,请参考以下文章
Visual Studio Installer 设置属性简介
Visual Studio中怎样的配置只对单个项目(工程)有效?怎样的配置对所有项目(工程)都有效?
Visual Studio 发布未将所有 DLL 复制到发布文件夹