0

在 Visual Studio 中,假设您有一个 SQL 2008 数据库项目,并且您向表中添加了一个不可为空的列。当您现在去部署数据库时,如果该表中有数据,它应该会失败。(对吗?)您将如何编写自定义逻辑,以便在更新期间可以将此列设置为“x”或使用更高级的查询或游标来更新整个表并填充新列?这是您只想发生一次的事情 - 同时将列添加到数据库中。对此有任何支持吗?

4

5 回答 5

1

我将添加一个可为空的列,运行 UPDATE 命令来填充它,然后将该列更改为 NOT NULL。虽然我确实使用 Visual Studio 2010,但我不使用它进行部署。相反,我使用 SQL Compare 进行部署——它会生成一个易于调整的 SQL 脚本。

于 2010-11-03T02:08:26.370 回答
1

这是我的做法。

在模式查看器中打开表创建脚本并添加新列,如下所示:

[first_name]        varchar( 32 )   NOT NULL default ' ',
[last_name]         varchar( 32 )   NOT NULL default ' ',

因为他们有一个*默认值*他们可以成功部署。

然后在我的安装后脚本中,我检查表中的“”值并运行更新以填充它们(如果是)。或者,代码可以修复它。

于 2012-06-06T18:47:15.073 回答
0
update mytable
set newcolumn = 'x'
where newcolumn is null;
于 2010-11-03T01:23:13.847 回答
0

我对这类主题做了很多研究,遗憾的是它似乎是VSDB项目缺乏的一个领域。VSDB 项目的Visual Studio ALM Rangers 指南是一个很好的起点;他们有一个动手实验室,详细说明了他们推荐的最佳实践,以完全按照您的要求进行操作(它涉及使用部署前和部署后脚本将数据复制到临时表和从临时表中复制数据)。此外,Barclay Hill 的博客有一篇与您的问题相关的文章(他是 Data Tools 的高级项目经理),与指南相同。

如果您必须能够更新目标数据库的多个不同版本,那么在我看来,这种推荐的方法维护成本非常高,但是如果您只有一个数据库(或模式的一个版本)要更新,那就太好了可行。

于 2010-11-03T02:27:42.150 回答
0

这就是我最终做的事情。

  1. 将版本信息添加到数据库中(例如在 SystemSettings 表中)。
  2. 为下一个版本创建一个脚本(例如 1.1.0.0.sql)。
  3. 在 Scripts\Post-Deployment\Script.PostDeployment.sql 文件中,添加以下内容:

声明@versionMajor INT;
声明@versionMinor INT;
声明@versionBuild INT;
声明@versionRevision INT;

SELECT TOP 1
    @versionMajor = VersionMajor, @versionMinor
    = VersionMinor, @versionBuild
    = VersionBuild,
    @versionRevision = VersionRevision
FROM SystemSettings;

IF (@versionMajor <= 1 AND @versionMinor < 1)
BEGIN
:r "..\Upgrade\1.1.0.0.sql"
END

如果数据库版本较低,这将运行 1.1.0.0 脚本。1.1.0.0 脚本更新数据库版本号作为其最后一步。未来的更新只需要您添加另一个 IF 块。

于 2010-11-03T16:06:17.860 回答