SSMS 18中能否向带系统版本化历史表的MSSQL表新增NOT NULL列
SSMS 18中给系统版本化主表及关联历史表新增NOT NULL列的操作说明
直接通过单条语句或可视化设计器默认操作无法完成,按标准流程执行T-SQL脚本可以实现需求。
- 当表启用
SYSTEM_VERSIONING系统版本控制时,历史表a_h由SQL Server托管,不支持直接单独修改历史表结构;直接对主表a_s新增varchar(5) NOT NULL类型的X1列时,会因为历史表不存在同结构列触发版本化校验错误,系统也不会自动同步该非空列到历史表。
操作步骤
操作全程建议在业务低峰期执行,避免关闭版本化期间的数据一致性问题:
- 临时关闭主表的系统版本控制
ALTER TABLE a_s SET (SYSTEM_VERSIONING = OFF);
- 分别给主表、历史表新增目标列,由于是NOT NULL约束,必须指定默认值填充存量数据,否则会违反非空约束报错
-- 主表新增X1列 ALTER TABLE a_s ADD X1 varchar(5) NOT NULL CONSTRAINT DF_a_s_X1 DEFAULT (''); -- 历史表新增同结构X1列 ALTER TABLE a_h ADD X1 varchar(5) NOT NULL CONSTRAINT DF_a_h_X1 DEFAULT ('');
如果不需要保留默认约束,列添加完成、存量数据填充完毕后,可以手动删除两个表上的默认约束,后续版本化机制会自动同步主表写入的X1字段值到历史表,不会出现空值问题。
- 重新开启系统版本控制,关联原有历史表并开启一致性校验
ALTER TABLE a_s SET ( SYSTEM_VERSIONING = ON ( HISTORY_TABLE = dbo.a_h, DATA_CONSISTENCY_CHECK = ON ) );
注意事项
- 不建议通过SSMS 18的可视化表设计器直接修改表结构,设计器自动生成的变更脚本不会自动处理历史表的非空列同步逻辑,大概率触发结构不匹配报错。
- 重新开启版本化时开启
DATA_CONSISTENCY_CHECK会自动校验主表和历史表的结构、数据匹配性,避免后续版本化运行异常。
内容的提问来源于stack exchange,提问作者Meenakshi Basu
相关产品推荐
相关产品推荐

