简体   繁体   English

Microsoft Database Project - 如何更改列类型并避免数据丢失错误

[英]Microsoft Database Project - How to change column type and avoid data loss error

I am trying to change the type of a column from VARCHAR to INT .我正在尝试将列的类型从VARCHAR更改为INT During the deployment, the database project will stop the deployment due to the "data loss" error:在部署过程中,数据库项目会因为“数据丢失”错误而停止部署:

RAISERROR (N'Rows were detected. The schema update is terminating because data loss might occur.', 16, 127) RAISERROR(检测到 N 行。模式更新正在终止,因为可能会丢失数据。', 16, 127)

I know the data is convertible and if I run a manual ALTER TABLE script it will be fine.我知道数据是可转换的,如果我运行手动ALTER TABLE脚本就可以了。 However, I cannot integrate that properly with this scenario to avoid the error during the deployment.但是,我无法将其与此方案正确集成以避免部署期间出现错误。

  1. What is your solution to resolve my problem?你的解决方案是什么来解决我的问题?
  2. Is there a method to override this behaviour in a database project and for this particular case, use a custom script?是否有一种方法可以在数据库项目中覆盖此行为,并且对于这种特殊情况,使用自定义脚本?

One way in such scenario is using PreDeployment script and deploy twice.这种情况下的一种方法是使用 PreDeployment 脚本并部署两次。

  1. Change data type column in table definition as usual照常更改表定义中的数据类型列

  2. Add in Predeploy script:添加预部署脚本:

     -- this script has to be idempotent, and removed after some time IF EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'table_name' AND TABLE_SCHEMA = 'schema_name' AND COLUMN_NAME = 'column_name AND DATA_TYPE.= 'INT' ) BEGIN ALTER TABLE schema_name;table_name ALTER COLUMN Column_name INT NULL/NOT NULL; -- 这个脚本必须是幂等的,并在一段时间后删除 IF EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'table_name' AND TABLE_SCHEMA = 'schema_name' AND COLUMN_NAME = 'column_name AND DATA_TYPE.= 'INT' ) BEGIN ALTER TABLE schema_name;table_name ALTER COLUMN Column_name INT NULL/NOT NULL; END结尾

First publish will change the data type during PreDeploy, and deploy will fail with Potential Data loss error. First publish 将在 PreDeploy 期间更改数据类型,并且部署将失败并出现 Potential Data loss 错误。

Second publish will omit the part of PreDeploy(if condition), and schema compare does not detect any changes, meaning it has been changed.第二次发布会省略 PreDeploy(if condition) 的部分,schema compare 没有检测到任何变化,意味着它已经被改变了。

Next step should be removing the manual part from PreDeployment script.下一步应该是从 PreDeployment 脚本中删除手动部分。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 Microsoft SSDT(10.3.21208.0)/数据层项目(MSVS 2010)和项目与引用的数据库项目之间的“共享” /复制的证书 - Microsoft SSDT (10.3.21208.0)/Data-tier Project (MSVS 2010) and “Sharing”/Copied Certificates between the Project and Referenced Database Project 如何强制Microsoft数据库项目为主键约束生成ALTER语句而不是创建临时表? - How to force Microsoft Database Project generate ALTER statement for primary key constraint instead of creating temp table? 如何将我的Microsoft SQL Database_Diagram存储在SSDT项目中? - How can I store my Microsoft SQL Database_Diagram inside SSDT project? 使用Microsoft.Build.Evaluation发布数据库项目(.sqlproj) - Using Microsoft.Build.Evaluation to publish a database project (.sqlproj) 如何在 Visual Studio 数据库项目 (SSDT) 上设置更改跟踪 - How to set change tracking on a Visual Studio database project (SSDT) 比较数据库项目和数据库之间的数据 - Compare Data between database project and database 如何避免 CI 中的 .dacpac 项目检查? - How to avoid .dacpac project checks in CI? 使用SSDT的数据项目,如何引用另一个数据库而不将其填充到SS Obj Explorer中的同一项目文件夹中 - Data Project using SSDT, how to reference another database without it populating in same project folder in SS Obj Explorer 在数据库项目vs2012中更改数据库架构名称 - Change database Schema name in database project vs2012 如何为Database Project指定数据库并进行部署? - How to specify database for Database Project and deploy?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM