VS2010 数据库项目部署,如果可能发生数据丢失会失败吗?
Posted
技术标签:
【中文标题】VS2010 数据库项目部署,如果可能发生数据丢失会失败吗?【英文标题】:VS2010 Database Project Deployment, to fail if data loss may occur or not? 【发布时间】:2011-04-15 15:51:03 【问题描述】:我有一个用于 Web 应用程序的数据库项目,目前我已将其配置为在部署期间可能发生数据丢失时失败。我觉得这样更安全。但是我遇到了一个问题。实际上,我需要在一些我可以接受可能的数据丢失的事情上部署更改,即缩短列长度,实际上不会删除任何内容,但系统认为会这样做。
我有 2 个问题。
首先是这样:除了启用或禁用 catch all go 或 no go 之外,有没有办法对此过程进行更精细的控制,即指定可以删除或缩短的列?有什么方法可以更精细地控制这个过程?
第二个是,你们如何处理这些情况?最初我希望添加一个预部署脚本来删除列就足够了,但是它似乎也可以捕获这些文件中的删除等。
【问题讨论】:
不是部署引擎解析预部署脚本并“抓到”,问题是架构比较在预部署脚本之前运行,因此生成的部署脚本包含检查和 raiserror如果表包含行。打开生成的 SQL 脚本就可以看到。 【参考方案1】:-
很遗憾,没有任何方法可以更精细地控制它。
当我知道我将部署会导致数据丢失但正是我想要的东西时,我禁用它。然后我重新启用它。此外,我总是会检查部署到生产环境时出现的更改脚本。
【讨论】:
如何禁用它?【参考方案2】:只需将预部署脚本中的列更新为截断长度?
例如:将我的 col 截断为 20:
UPDATE mycol = LEFT(mycol, 20)
FROM mytable
WHERE mycol != LEFT(mycol, 20)
【讨论】:
这种方法可能存在的问题是架构比较在预部署脚本之前运行,因此如果表包含行,您的发布脚本可能仍包含检查和 raiserror。【参考方案3】:微软的指导是在部署前将数据移出到临时表中,让部署引擎运行检查表是否包含行(这将通过,因为它现在是空的)并升级架构,并在部署后脚本中将数据移回。
有关更多信息,请参阅巴克莱山关于该主题的帖子:
Managing data motion during your deployments (Part 1) Managing data motion during your deployments (Part 2)【讨论】:
以上是关于VS2010 数据库项目部署,如果可能发生数据丢失会失败吗?的主要内容,如果未能解决你的问题,请参考以下文章
VS2010 数据库项目部署——“SqlDeployTask”任务意外失败,NullReferenceException