开发完成后重命名表的最佳方法


8

在SQL Server 2008 r2中重命名数据库表和列的最简单,最可靠的方法是什么?我们已经完成开发,由于某些原因,我们需要重命名一些表和一些列。

使用同义词是这样做的好方法吗?我们应该为哪些陷阱做好准备?它也有助于优雅地重命名列吗?

我们有很多与这些表相关的脚本,.net开发人员在应用程序中也引用了它们。


是否打算重命名这些数据库对象并提供外观,以便无需修改现有应用程序即可使用新的对象名称?
billinkc 2012年

Answers:


10

我认为该方法取决于应用程序是实时的还是仍在测试中。

对于表,最安全的方法是使用新名称创建同义词。这样,您可以一次更改一个应用程序(甚至一次更改一个引用),而不必一次更改所有应用程序。您不必删除同义词并重命名表,直到您确信所有更改均已就位。

CREATE SYNONYM dbo.NewName FOR dbo.OldName;
-- change app to point to dbo.NewName;

-- once all of your changes have been tested:
BEGIN TRANSACTION;
  DROP SYNONYM dbo.NewName;
  EXEC sp_rename N'dbo.OldName', N'NewName', N'OBJECT';
COMMIT TRANSACTION;

对于列,这有点棘手。您可以创建指向视图的同义词,但并非所有视图都必须可更新,具体取决于基表。作为一个简单的例子:

CREATE VIEW dbo.vNewName 
AS 
  SELECT Column1, NewColumnName = OldColumnName
    FROM dbo.OldName;

CREATE SYNONYM dbo.NewName FOR dbo.vNewName;

然后像上面一样,当您更改了对列的所有引用和新表名后,只需:

BEGIN TRANSACTION;
  DROP SYNONYM dbo.NewName;
  DROP VIEW dbo.vNewName;
  EXEC sp_rename N'dbo.OldName', N'NewName', N'OBJECT';
  EXEC sp_rename N'dbo.NewName.OldColumnName', N'NewColumnName', N'COLUMN';
COMMIT TRANSACTION;

如果该应用程序尚未上线并且仍在测试中,则只需重新命名各列并通过应用程序代码/过程等在全局搜索和替换(或使用SSDT,RedGate等进行智能重构)后修复中断的内容。

如果应用程序是在线的,则需要小心一些。


+1验证更改并修复我从我自己的团队得到的
废除方法

感谢您的良好回答,但是您能否向我建议您的意思是:“通过这种方式,您可以一次更改一个应用程序(甚至一次更改一个引用),而不必更改所有应用程序他们立刻。” 您是说我们应该同时创建一个同义词,例如第一个表t1,代码是否更改,然后表t2,等等?
2012年

我们现在处于开发阶段,但是该组件的系统几乎已完成,这些表将被重命名。系统现已部署到UAT。
2012年

1
@Nazila不,我的意思是您可以为table1创建一个同义词(以及为table2,table3等创建一个同义词)。然后,您可以更改一个应用程序,一个类,一个模块或一个存储过程,以通过同义词使用新名称。其余代码可以继续使用旧名称。在更新所有代码之前,您不会删除同义词并重命名。
亚伦·伯特兰

0

在更改表和列的名称时,您会遇到很多陷阱。调用它们的任何其他SQL或应用程序代码都必须重命名以匹配,否则将不起作用。Redgate提供了一些相当不错的工具,可以对依赖的SQL veiws / functions / sproc进行所有更改。我能提供给您的最大建议是,首先在DEV环境中进行这些更改,然后进行TEST TEST TEST,以确保您已在所有地方修复了代码。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.