【问题标题】:Visual Studio 2010 SQL Server 2008 Database Project - Custom UpdatesVisual Studio 2010 SQL Server 2008 数据库项目 - 自定义更新
【发布时间】:2010-11-02 20:47:54
【问题描述】:

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

【问题讨论】:

    标签: sql-server database visual-studio-2010 database-deployment


    【解决方案1】:

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

    【讨论】:

    • 谢谢。这就是我现在所做的,但我不禁认为必须有一种更自动化的方式来做到这一点。
    【解决方案2】:

    这是我的做法。

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

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

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

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

    【讨论】:

      【解决方案3】:
      update mytable
      set newcolumn = 'x'
      where newcolumn is null;
      

      【讨论】:

      • 是的 - 但请阅读我的问题。我正在谈论将这种类型的脚本集成到 SQL 数据库项目部署中。
      • @Josh M:为什么要投反对票?您没有指定使用哪个工具部署,除了您的“SQL 数据库项目部署”之外,还有多种部署方式
      • so 用 ant 脚本通过 sqlplus 运行这条语句。
      【解决方案4】:

      这就是我最终做的事情。

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

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

      选择前 1
      @versionMajor = 版本主要,
      @versionMinor = 版本次要,
      @versionBuild = 版本构建,
      @versionRevision = 版本修订
      来自系统设置;

      IF (@versionMajor 开始
      :r "..\升级\1.1.0.0.sql"
      结束

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

      【讨论】:

      • 警惕这种解决方案。假设您的 1.1.0.0.sql 查询 TableX。如果在更高版本中删除 TableX,则必须更新该脚本。随着版本数量的增加,在这种情况下需要维护的脚本也会越来越多。
      • 升级脚本是按顺序运行的,所以这应该不是问题,除非我误解了您的评论。
      【解决方案5】:

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

      如果您必须能够更新目标数据库的多个不同版本,但如果您只有一个数据库(或架构的一个版本)要更新,那么这种推荐的方法在我看来维护成本非常高,很实用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-02-08
        • 2017-12-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多