【问题标题】:Instead of column rename the project does column drop and column add项目没有列重命名,而是列删除和列添加
【发布时间】:2015-05-14 16:01:20
【问题描述】:

我正在使用 SSDT 来保持 2 个数据库同步。

为此,我在 Server1 中有一个数据库,在 Server2 中有一个数据库,在我的项目中有一个 Schema。

我总是在 Server1 数据库中进行更改,并将这些更改应用到 Server2 数据库中。为此,我使用以下工作流程:

  • 将 Server1 数据库与 Schema 进行比较,并使用 Server1 的更改更新 Schema
  • 将 Schema 与 Server2 数据库进行比较,并将 Schema 中的更改更新到数据库中

这通常可以正常工作,但我在上次重命名表中的列时发现了一个问题。

通常,如果我重命名表中的列,则会将更改检测为列重命名,因此,当我将 Server1 与 Schema 进行比较时,可以正确检测到列重命名,并且我可以安全地完成工作流程。

但是,我上次在 Server1 中重命名表中的列时,将其与架构进行比较时,它没有将更改检测为列重命名,而是将更改检测为删除列(使用旧名称)并创建列(使用新名称)。显然,如果我在 Server2 数据库中应用这些更改,我将丢失重命名列中的所有数据。

SSDT 中有这种行为的原因吗?我可以指示 SSDT 了解这是列重命名吗?

我知道如何手工完成,但我希望在 SSDT 中避免这个问题,或者如果以后再次出现,我能够解决它。

【问题讨论】:

  • 如果您将项目与数据库进行比较,是否有任何其他属性显示为不同?有时会出现您看不到的细微差别,但足以触发删除/重新创建。此外,检查“refactorlog”文件以查看其中是否有用于重命名列的条目。如果没有,则可能需要创建它。最简单的方法是重命名,然后重新命名 - 删除额外的重命名,你应该会很好。

标签: sql-server-2012 sql-server-data-tools


【解决方案1】:

我认为有一些误解。您已经在真实数据库上完成了列重命名,现在您想要进行模式比较以将列重命名从数据库传播到 SSDT 项目。 它不会以这种方式工作,因为 SSDT 无法检测到该列实际上已被重命名。

正确的方案是先重命名 SSDT 中的列(右键单击列 -> 重构 -> 重命名。将创建一个重构日志文件 - 你不能删除它。)。然后在您的项目和目标数据库之间进行模式比较。更改将作为列重命名传播到服务器。

【讨论】:

  • 可以重命名列可以使用发布脚本传播到下一个服务器
  • 是的,可以。只需使用发布脚本或从 dacpac 部署到另一台服务器。
  • 谢谢疤痕。我有一个表 Employee(ID、FirstName、MiddleInitial、LastName、Age、DOJ)。我已将其包含在 EDMX 中,并在 Dev、UAT 和 Prod 环境中发布。现在,我们将字段 MiddleInitial 更改为 MiddleName。我们重命名了 EDMX 中的列。但是,当我们发布数据库时,MiddleInital 值不会复制到 MiddleName。不知道为什么它不这样做,请提供任何更正或解决方案?
  • 我会尝试生成发布 SQL 脚本,看看里面发生了什么。
  • 是的,我试过了,它创建了一个临时表,其中包含一个带有新列名(ID、FirstName、MiddleName、LastName、Age、DOJ)的名称,然后它选择 ID、FirstName、LastName ,年龄,员工表中的 DOJ 列值,并插入到新的临时表中。最后,它删除了雇员表并将临时表重命名为雇员表。任何帮助
【解决方案2】:

您是否使用了重构-->重命名菜单选项?这就是如何包含它,如果你这样做了但它不起作用,那么我会在连接上提交一个错误。

要手动将其重新命名,然后使用重构菜单或检查 refactorlog.xml,手动添加条目非常容易。

让我们知道发生了什么/你决定做什么!

【讨论】:

  • 看来一定很明显,所以我怕我完全迷路了。我在 VS2012&13 中使用 SSDT。我在比较窗口。右键单击只有“包含/排除”选项。比较窗口顶部有一个按钮栏,有比较、停止、更新等按钮。而且我在 VS 主菜单上找不到任何与 SSTD 相关的选项。如果我右键单击表定义脚本文件,我只会看到重构 -> [扩展通配符,完全限定名称]。我有点盲目或有点隐藏;)请在答案本身中包含解释。非常感谢您的快速回答
  • 我赞成这个答案,因为它是正确的,但是,正如我的评论显示的那样,有一些信息可以使它完全可以理解,所以我选择了另一个作为解决方案。还是谢谢你。
  • 你在哪里找到重构重命名
  • @JotaBe 你能告诉我你最后是怎么做到的吗
  • 如果您在打开 .sql 文件后右键单击“T-SQL”窗口中的列,您应该会看到 4 个重构选项,其中之一是“重命名...”。跨度>
【解决方案3】:

我知道这是一个老问题,但只是为了澄清那些仍然发现这个问题并且无法弄清楚如何进行重构步骤的人。

在 Visual Studio 的设计视图中,单击要更改的列名称,然后单击顶部 Visual Studio 菜单中的“SQL”选项。然后点击“重构”>“重命名”: Image with the menu option highlighted

接下来,您可以在解决方案资源管理器窗口中右键单击项目本身并选择“架构比较...”选项。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-23
    • 2017-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-19
    • 1970-01-01
    相关资源
    最近更新 更多