不是改列名,而是删除列和新增列的项目

15

我正在使用SSDT来同步两个数据库。

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

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

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

通常情况下,这样做效果很好,但我发现最近一次在表中重命名列时出现了问题。

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

然而,在我最后一次在Server1中对表中的列进行重命名时,与Schema进行比较时,它没有将变化检测为列重命名,而是将该变化检测为删除原名称的列和创建新名称的列。显然,如果我将这些更改应用于Server2数据库,我将失去重命名列中的所有数据。

SSDT中是否存在这种行为的原因?我能否指示SSDT了解这是列重命名?

我知道如何手动操作,但我更希望在SSDT中避免这个问题,或者如果将来再次出现此问题,则能够解决它。


如果您将项目与数据库进行比较,是否会出现其他属性不同的情况?有时候会有微小的差异,您可能没有注意到,但足以触发删除/重新创建操作。此外,请检查“refactorlog”文件,看看是否有重命名列的条目。如果没有,可能需要创建一个。最简单的方法是将其重命名为其他名称,然后再改回来 - 删除额外的重命名操作,就可以解决问题了。 - Peter Schott
3个回答

19

我认为有一些误解。你在真实数据库上进行了列重命名,现在想要执行架构比较以将列重命名从数据库传播到SSDT项目中。 这样是行不通的,因为SSDT无法检测到该列实际上已被重命名。

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


可以的。只需使用发布脚本或从dacpac在另一台服务器上部署即可。 - scar80
我会尝试生成并发布SQL脚本,了解其中发生了什么。 - scar80
是的,我尝试过这个方法,它会创建一个临时表,表名为某个名称,列名为(ID、FirstName、MiddleName、LastName、Age、DOJ),然后从员工表中选择ID、FirstName、LastName、Age、DOJ列的值并插入到新的临时表中。最后,它会删除员工表并将临时表重命名为员工表。需要帮助吗? - ps_prakash02
抱歉,我不知道那里出了什么问题。您可以尝试创建一个带有代码附件的新问题。 - scar80
谢谢,我会尝试做到的。 - ps_prakash02
显示剩余2条评论

6
你使用了重构->重命名菜单选项吗?如果是这样,这个选项就会被包含在内。如果你使用了这个选项但它没有起作用,那么我建议你在Connect上报告一个bug。
如果要手动添加,可以先手动将其名称改回来,然后使用重构菜单,或者检查重构日志文件(refactorlog.xml),手动添加一个条目非常容易。
请告诉我们发生了什么/你决定怎么做!

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

3

我知道这是一个老问题,但为了澄清对于那些仍然找不到如何执行重构步骤的人。

在Visual Studio的设计视图中,单击要更改的列名称,然后单击顶部Visual Studio菜单中的"SQL"选项。然后点击"重构" > "重命名": 菜单选项高亮的图片

接下来,您可以右键单击解决方案浏览器窗口中的项目本身,并选择"模式比较..."选项。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接