Sky*_*Sky 8 sql-server-2008-r2
在 SQL Server 2008 r2 中重命名数据库表和列的最简单和最可靠的方法是什么?我们已经完成了开发,由于某些原因,我们需要重命名一些表和一些列。
使用同义词是这样做的好方法吗?我们应该为哪些陷阱做好准备?它是否也有助于优雅地重命名列?
我们有很多与这些表相关的脚本,它们也被 .net 开发人员在应用程序中引用。
Aar*_*and 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;
Run Code Online (Sandbox Code Playgroud)
对于列,它有点棘手。您可以创建指向视图的同义词,但并非所有视图都必须可更新,具体取决于基表。作为一个简单的例子:
CREATE VIEW dbo.vNewName
AS
SELECT Column1, NewColumnName = OldColumnName
FROM dbo.OldName;
CREATE SYNONYM dbo.NewName FOR dbo.vNewName;
Run Code Online (Sandbox Code Playgroud)
然后像上面一样,当您更改了对列的所有引用和新表名时,只需:
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;
Run Code Online (Sandbox Code Playgroud)
如果应用程序未上线并且仍在进行测试,只需重命名列并修复全局搜索和替换(或使用 SSDT、RedGate 等进行智能重构)后通过应用程序代码/程序等中断的内容。
如果应用程序是实时的,您将需要多加小心。