我正在尝试将列的类型从 更改VARCHAR
为INT
。在部署过程中,数据库项目会因为“数据丢失”错误而停止部署:
RAISERROR(检测到 N'Rows。架构更新正在终止,因为可能会发生数据丢失。', 16, 127)
我知道数据是可转换的,如果我运行手动ALTER TABLE
脚本就可以了。但是,我无法将其与此方案正确集成以避免部署期间的错误。
- 你有什么办法解决我的问题?
- 是否有一种方法可以在数据库项目中覆盖此行为,对于这种特殊情况,请使用自定义脚本?
我正在尝试将列的类型从 更改VARCHAR
为INT
。在部署过程中,数据库项目会因为“数据丢失”错误而停止部署:
RAISERROR(检测到 N'Rows。架构更新正在终止,因为可能会发生数据丢失。', 16, 127)
我知道数据是可转换的,如果我运行手动ALTER TABLE
脚本就可以了。但是,我无法将其与此方案正确集成以避免部署期间的错误。
在这种情况下,一种方法是使用 PreDeployment 脚本并部署两次。
像往常一样更改表定义中的数据类型列
添加预部署脚本:
-- 这个脚本必须是幂等的,并在一段时间后删除 如果存在(选择 1 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'table_name' AND TABLE_SCHEMA = 'schema_name' AND COLUMN_NAME = '列名 AND DATA_TYPE != 'INT' ) 开始 ALTER TABLE schema_name.table_name ALTER COLUMN Column_name INT NULL/NOT NULL; 结尾
首次发布将在 PreDeploy 期间更改数据类型,并且部署将失败并出现潜在数据丢失错误。
第二次发布会省略 PreDeploy(if condition) 的部分,并且 schema compare 没有检测到任何变化,意味着它已经被改变了。
下一步应该是从 PreDeployment 脚本中删除手动部分。