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 数据库项目部署,如果可能发生数据丢失会失败吗?的主要内容,如果未能解决你的问题,请参考以下文章

在 VS 2010 中调试后丢失文件?

数据库项目vs2010中缺少部署选项卡

VS2010数据库项目部署重建每张表

VS2010 数据库项目部署——“SqlDeployTask”任务意外失败,NullReferenceException

让 MSBuild 和 CruiseControl .NET 构建和部署 VS2010 数据库项目

VS2010创建工程的时候出现了 创建或打开C++浏览数据库文件D:\C\作业系统.sdf时发生错误