将列添加到 SQL Server 2008 R2 上的大型生产表的最佳方法是什么?根据微软的在线书籍:
ALTER TABLE 中指定的更改会立即实施。如果更改需要修改表中的行,则 ALTER TABLE 更新行。ALTER TABLE 获取表上的模式修改锁,以确保在更改期间没有其他连接引用甚至表的元数据,除了在最后需要非常短的 SCH-M 锁的在线索引操作。
(http://msdn.microsoft.com/en-us/library/ms190273.aspx)
在包含数百万行的大表上,这可能需要一段时间。停电是唯一的选择吗?处理这种情况的最佳方法是什么?
由于业务逻辑,我们需要在表中添加一个新列,以确保始终填充该列。因此,应将其添加到表中NOT NULL。与之前解释如何手动执行此操作的问题不同,这需要由 SSDT 发布管理。
由于一些认识,我一直在用头撞墙一段时间来完成这个听起来简单的任务:
我听别人说的方法是直接更新表定义(这样schema刷新是一致的),写一个预部署脚本,将表的全部内容移动到一个包含新列填充逻辑的临时表,然后移动后部署脚本中的行。尽管如此,这似乎很危险,并且当它检测到一个 NOT NULL 列被添加到一个包含现有数据的表中时仍然会激怒发布预览(因为验证在预部署脚本之前运行)。
我应该如何添加一个新的、不可为空的列,而不会冒孤立数据的风险,或者在每次发布时使用固有风险的冗长迁移脚本来回移动数据?
谢谢。