【发布时间】:2013-08-12 09:29:10
【问题描述】:
在 SQL Server 数据工具中,您有部署选项“如果可能发生数据丢失,则阻止增量部署”,我敢打赌这是保持检查的最佳做法。
假设我们有一个表 foo 和一个现在是多余的列 bar - 没有依赖项、外键等,我们已经在数据层和存储过程中删除了对该列的引用,因为它根本没有使用.换句话说,我们对删除此列不会产生不利影响感到满意。
美中不足:
- 该列中有数据
- 数据库发布到 数百个分布式客户端,并且可能需要几个月的时间 更改为波及所有客户
当该列被填充时,发布将失败,除非我们更改“如果可能发生数据丢失,阻止增量部署”选项。这个选项是在数据库级别,而不是表级别,因此由于客户端的分布式特性,我们必须在所有数据库更新之前关闭“数据丢失”选项几个月,然后重新打开一旦所有客户端都更新了(我们的数据库具有由我们的构建设置的版本号)。
您可能认为我们可以使用预部署脚本解决此问题,例如
if exists (select * from information_schema.columns where table_name = 'foo' and column_name = 'bar') BEGIN
alter table foo drop constraint DF_foo_bar
alter table foo drop column bar
END
但这又会失败,除非我们关闭“可能发生数据丢失”选项。
我只是对其他人在这种情况下做了什么感兴趣,因为我希望获得目前看来不可能的粒度。
【问题讨论】:
-
我刚刚将该选项设置为 False 并意识到它已经完成并且知道后果。我不知道你是如何推动发布的。如果您正在逐步推动(应用程序包 1,然后应用程序包 2,等等),您可以将其关闭以便一个版本删除列,然后重新打开它。如果只是“根据需要”,我会考虑将其关闭并仔细观察数据库的变化。
-
谢谢@PeterSchott。我们的构建创建了在客户端下载和应用的 dacpacs,但由于修复程序和客户端的性质(例如,某些客户端可能在冬天不使用他们的机器,并在他们打开时下载最新版本)的 windows 切换特定版本的启动和启动有点困难。如果共识是不设置数据丢失设置,那么这就是我必须考虑的事情。我一直认为它应该打开。
-
我普遍认为打开它会很有用,但尤其是在您的情况下,您可能希望关闭它。如果您了解一般风险,这没什么大不了的。如果您担心其他更改,您可以随时选择“生成脚本”选项来查看更改。您还可以使用选项来查看更改报告命令行或部分脚本选项,以查看可能受到的影响。
标签: sql-server database-project sql-server-data-tools