在重命名操作期间保护数据

更新:2007 年 11 月

如果重命名数据库对象然后生成数据库项目,则会生成一个反映此更改的部署脚本。在重命名列或表时,该脚本会删除具有原始名称的原始列或表,并添加一个采用新名称的新列或表。如果将此更改作为一个更新部署到现有的数据库,则原始列或表中的数据将会丢失。

可以通过在项目属性中设置相应的选项来控制是否删除原始列或表。项目属性的“生成”选项卡中包含一个名为“为目标数据库中存在而数据库项目中不存在的对象生成 DROP 语句”的复选框。如果选中此复选框,旧对象的 drop 语句将包括在项目生成期间所生成的部署脚本中。如果清除此复选框,则旧对象的 drop 语句将不包括在项目生成期间所生成的部署脚本中。

使用 sp_rename

可以手动编辑生成脚本,以便将列和表的 drop/add 语句转换为 sp_rename。

例如,可以为表指定以下语句:

sp_rename '<OLD TABLE NAME>', '<NEW TABLE NAME>', 'OBJECT'

例如,可以为列指定以下语句:

sp_rename '<TABLE NAME>.<OLD COLUMN NAME>', '<NEW COLUMN NAME>', 'COLUMN'

有关更多信息,请参见如何:部署数据库重构更改

在旧对象与新对象之间移动数据

为防止 drop 语句可能导致的数据丢失,可以选择不部署 drop 语句。这样,目标数据库中将同时包含旧对象和新对象的副本。可以将旧对象中的数据移到新对象中,然后删除旧对象。此任务可通过使用下列方法之一来完成:

  • 使用 select 语句或其他 T-SQL 语句手动移动数据。

    例如,可以为表指定以下语句:

    -- Deploy table add only.
    
    -- Move the data between the old and new tables.
    INSERT Region_New SELECT * FROM Region_Old
    
    -- Drop the old table manually.
    DROP TABLE Region_Old
    

    例如,可以为列指定以下语句:

    -- Deploy column add only.
    
    -- Move the data between the old and new columns.
    UPDATE Region SET ColumnNew = ColumnOld
    
    -- Drop the old column manually.
    ALTER TABLE Region DROP COLUMN ColumnOld
    
  • 使用bcp 实用工具Data Transformation Services (SQL 2000) 或 SQL Server Integration Services (SQL 2005) 来自动移动数据。

通过使用临时存储来移动数据

为防止 drop 语句可能导致的数据丢失,可以将数据移到临时存储中。在部署所做的更改之前,将数据从旧表移到临时位置。例如,可以将数据移到另一个数据库上的表中或者移到数据文件中。然后,部署 drop 和 add 语句。最后,将数据从临时位置移到新表中。此任务可通过使用下列方法之一来完成:

  • 使用 select into 或其他 T-SQL 语句手动移动数据。

    例如,可以为表指定以下语句:

    -- Move the data to temporary storage.
    SELECT * INTO TemporaryStorage.dbo.Region_Storage FROM Region_Old
    
    -- Deploy table drop/add.
    
    -- Move the data to the new table.
    INSERT Region_New SELECT * FROM TemporaryStorage.dbo.Region_Storage
    

    例如,可以为列指定以下语句:

    -- Move the data to temporary storage.
    SELECT * INTO TemporaryStorage.dbo.Region_Storage FROM Region
    
    -- Deploy column drop/add.
    
    -- Move the data to the new column.
    UPDATE Region SET ColumnNew = rs.ColumnOld FROM Region r JOIN TemporaryStorage.dbo.Region_Storage rs ON r.RegionID = rs.RegionID
    
  • 使用bcp 实用工具Data Transformation Services (SQL 2000) 或 SQL Server Integration Services (SQL 2005) 来自动移动数据。

请参见

任务

如何:在部署到现有数据库期间控制数据丢失

其他资源

重命名数据库对象

重命名重构的概述

将重构更改部署到数据库

生成和部署数据库架构