在重新命名作業期間保護資料
更新: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'
如需詳細資訊,請參閱 HOW TO:將重構變更部署至資料庫。
在舊物件和新物件之間移動資料
若要避免 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 公用程式、資料轉換服務 (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 公用程式、資料轉換服務 (SQL 2000) 或 SQL Server Integration Services (SQL 2005),自動移動資料。