在重命名操作期间保护数据
更新: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) 来自动移动数据。