共用方式為


在重新命名作業期間保護資料

更新: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),自動移動資料。

請參閱

工作

HOW TO:在部署到現有資料庫時控制資料遺失

其他資源

重新命名資料庫物件

重新命名重構的概觀

將重構變更部署至資料庫

建置和部署資料庫結構描述