2

我有一个表,其中有行。我正在使用 SQL 数据库项目来管理数据库,并且我想通过向该表添加一个新的 NOT NULL 列来升级架构,该列带有对新表的 FK 约束(也包含在新版本的项目)。

这可能吗?我知道我可以使用该选项为新的 FK 列生成智能默认值,但这无济于事,因为我没有机会将任何行放入 FK 引用的新表中。

我有什么选择?因为预部署脚本在进行模式比较之后执行,所以我无法在此处创建新表,因为比较首先运行并确定它需要创建表 - 当它到达脚本中的这一点时,这会爆炸并发现表已经存在(预部署时创建的)

4

2 回答 2

3

我见过3种方法:

  1. 在运行 sqlpackage.exe(或您用来部署的任何内容)之前使用预比较脚本来执行您想要的操作,它工作得很好,通常很容易在比较之前添加一个额外的“运行此脚本”(https:/ /the.agilesql.club/Blog/Ed-Elliott/Pre-Compare-and-Pre-Deploy-Scripts-In-SSDT )。

  2. 在分阶段部署中执行此操作,因此在第一个版本中添加默认约束并更正现有数据,然后在以后的版本中使用非空约束强制执行它

  3. 您可以使用部署贡献者编写自己的更新。

我个人使用 1 和 2,选项 3 似乎有点矫枉过正(ps 我没有忘记你的表重写问题)

于 2015-09-28T14:37:49.277 回答
2

我们的解决方案:

在预部署脚本中创建新的临时表并在其中移动所需的数据。在部署后脚本中,我们从这个临时表中读取数据并更新其他表。因此,您不会干扰数据库部署并拥有恢复引用所需的所有数据。是的,我同意,这很丑。

于 2015-09-28T14:39:51.220 回答