在不破坏现有应用程序的情况下重命名SQL Server中的表或列

时间:2019-04-04 11:26:44

标签: sql-server entity-framework

我在MS SQL Server中有一个现有数据库,并且想重命名一些表和列,因为当前使用的名称与它所代表的名称不正确。

我有多个使用实体框架(代码优先)访问数据库的Web和桌面应用程序。一次更新的更新太多,无法负担所有应用程序的启动费用。

我当时认为SQL Server允许表和列使用“永久”别名是很好的选择,但我认为该功能不存在。

还是我想知道EF中是否有一种方法可以为同一个属性使用两个名称?

3 个答案:

答案 0 :(得分:1)

对于表,您可以重命名它们,然后创建一个旧名称指向新名称的同义词。

对于列,更改其名称将破坏您的应用程序。您也可以使用旧名称创建计算列,尽管它们只是显示新命名列的值(但这似乎有点愚蠢)。

但是,请注意,一个计算列不能引用另一个计算列,因此您必须完全复制该列。如果不更新两个列的定义,可能会导致问题。

答案 1 :(得分:0)

包含简单select语句的视图的行为就像表一样。您确实需要在整个数据库和应用程序中正确解决此问题。但是,如果您想沿视图路线行驶,建议您这样做:

假设您有一个名为MyTable的表,您将其重命名为TheTable,并且有一个名为MyColumn的列要重命名为TheColumn

  1. 创建一个架构,例如new
  2. 使用此ALTER SCHEMA new TRANSFER MyTable
  3. 将原始表移动到其中
  4. 重命名表和列。

现在您有了一个名为new.TheTable的表,该表具有一个名为TheColumn的列。一切都坏了

最后,创建一个看起来像旧表的视图

 CREATE VIEW dbo.MyTable 
 AS 
 SELECT Column1, Column2, Column3, TheColumn As MyColumn 
 FROM new.TheTable;

现在一切都会恢复正常。

  • 所有固定的“新”表都位于new模式中
  • 但是现在一切都变得更加复杂

这基本上是一个说明,您应该一次对整个应用程序进行适当的修复管理就可以正确地对其进行修复。绝对不要让触发器复杂化

答案 2 :(得分:0)

由于您首先将代码与多个Web和桌面应用程序一起使用,因此您很可能可以通过迁移从一个位置管理数据库更改,而忽略其他位置的更改。 您可以创建一个空的迁移并添加代码,以将表名和列名更改为所需的名称。然后,迁移应创建一个视图,该视图将使用原始表名和列名从该表中选择。当您应用此迁移时,所有应用程序中的所有内容仍应正常运行。由于您没有触摸模型类,因此没有模型更改。插入,更新和删除仍将通过视图进行。在此选项中,表上不需要潜在的错误触发器或同义词。 现在您已经更改了表,您可以专注于应用程序代码。如果有帮助,您可以在列名和表名上添加注释,然后开始重构代码。您需要确保不要进行会导致其他应用中断的模型更改。如果应用程序忽略模型更改,则可以在重构之前在所有应用程序的列和类上添加注释。您可以通过这种方式早些摆脱视图。