而不是列重命名,项目会删除列,列添加

时间:2015-05-14 16:01:21

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

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

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

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

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

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

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

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

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

我知道如何手动完成,但我宁愿在SSDT中避免这个问题,或者能够解决它,如果它将来再次出现。

2 个答案:

答案 0 :(得分:12)

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

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

答案 1 :(得分:4)

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

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

让我们知道您决定做了什么!