首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DACPAC前置脚本avilale?

DACPAC前置脚本avilale?
EN

Stack Overflow用户
提问于 2020-06-03 06:28:30
回答 1查看 186关注 0票数 0

我在发布DACPAC时遇到了一个问题。(SQL 2012)我在生产中有一个表,其中包含null、not null values列。我需要使此列不可为空,并删除另一个列。因为它可能不会在应用程序中使用。

我尝试使用预部署脚本使用值更新null列、alter column和delete column,但得到错误-“检测到行。模式更新正在终止,因为可能会发生数据丢失。”

由于这是一个敏感的产品,我不想取消选中发布选项“如果可能发生数据丢失,则阻止增量部署”。

如果有人有什么想法,请告诉我。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-03 08:04:35

让我们首先了解DACPAC是如何部署的,以下是任务的顺序

1.使用*.dacpack文件中的模式构建一个空DB,将其命名为"vNextDB“

2.将生产DB与vNextDB进行比较,并生成一个将部署更改的脚本,我们称其为deploy.sql (实际上您可以将其写入一个文件并手动检查,在“SqlPackage.exe”上查找文档)

3.运行部署前脚本

4.从第(2)步运行deploy.sql

5.运行部署后脚本

查看上面的序列,您可能已经发现了问题所在。如果没有,请查看生成deploy.sql脚本的时间,它是在执行预耗尽脚本之前完成的,因此很明显,它确实看到了空值,并生成了退出部署的脚本。

如果你让sqlproject.exe将deploy.sql写到磁盘并在文本编辑器中打开它,你可以看到它是如何后退的(我不能说它是如何后退的,因为每个版本的sqlpackage.exe都是不同的。他们一直在改进它)。

这里有几个选项

A)将您的部署一分为二,第一个部署不会有模式更改,它只是在部署后/部署前步骤中运行"UPDATE MyTable SET theColumn = '‘WHERE theColumn IS NULL“,第二个部署将有实际的更改

B)退一步,全面考虑如何处理数据库模式的版本控制,你应该有一个版本控制策略,你应该考虑向后兼容性等问题。(也就是说,您可以引入具有默认值的非NULL的新列,并且DB客户端可以开始使用该列,而无法更新的旧客户端仍将被支持,因为您没有立即删除旧列)

即使你选择选项A来解决当前的问题,从长远来看,你也应该建立一个版本控制的起点。每个自我尊重的数据存储都有一个版本控制策略:-),你应该给你的数据库一个版本控制策略。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62162380

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档