DACPAC pre-pre 脚本 avilale?

DACPAC pre-pre script avilale?

我在发布 DACPAC 时遇到问题。 (SQL 2012) 我在生产中有 table 具有 null,not null 值列。 我需要使此列不可为空并删除另一列。 因为那可能不会在应用程序中使用。

我尝试使用预部署脚本用值更新空列、更改列和删除列,但出现错误- "Rows were detected. The schema update is terminating because data loss might occur."

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

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

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

1.Build 使用 *.dacpack 文件中的模式的空数据库,将其命名为 "vNextDB"

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

的文档

3.Run 预部署脚本

4.Run deploy.sql 来自步骤 (2)

5.Run Post-部署脚本

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

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

这里有几个选项

A) 将您的部署分成两部分,第一个部署将没有架构更改,它只是在 post/pre 部署步骤中运行 "UPDATE MyTable SET theColumn = '' WHERE theColumn IS NULL",第二个部署将有实际更改

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

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