DACPAC pre-pre script avilale?



我在发布DACPAC时遇到问题。(SQL 2012( 我在生产中有具有空值而不是空值列的表。 我需要使此列不可为空并删除另一列。 由于这可能未在应用程序中使用。

我尝试使用预部署脚本使用值更新空列,更改列并删除列,但出现错误- "检测到行。架构更新正在终止,因为可能会发生数据丢失。

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

如果有人有任何想法,请告诉我?

让我们先了解 DACPAC 是如何部署的, 这些是任务的顺序

1.使用 *.dacpack 文件中的架构构建一个空数据库,将其称为"vNextDB"

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

3.运行预部署脚本

4.运行部署.sql从步骤 (2( 开始

5.运行部署后脚本

查看上面的顺序,您可能已经找到了问题所在。 如果没有,请查看 deploy.sql 脚本生成时,它是在执行预剥离脚本之前完成的,因此显然它确实会看到 NULL 值并生成从部署中回退的脚本。

如果你制作 sqlproject.exe将部署写入磁盘并在文本编辑器中打开它,你可以看到它"如何"退缩.sql(我不能说它是如何回退的,因为每个版本的 sqlpackage.exe 都以不同的方式进行

。这里有几个选项

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

B( 退后一步,全面考虑如何处理数据库架构的版本控制,你应该有一个版本控制策略,你应该考虑向后兼容性等等。(即您可以引入具有默认值的非 NULL 的新列,数据库客户端可以开始使用该列,而无法更新的旧客户端仍将受支持,因为您不会立即删除旧列(

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

最新更新