現有生產資料庫 DOE 運行正常,需從異源備份檔 A1.BAK (非 DOE 備份) 導入特定資料表與資料,**保留 DOE 原有資料不變**。適用於 SQL Server 2000/2005/2008/2012+ (介面略異,邏輯一致)。
A1_Temp。A1_Temp → 「所有工作」 → 「還原資料庫」。A1.BAK。C:\A1_Temp.mdfC:\A1_Temp.ldfA1_Temp 現在包含來源備份的完整結構與資料。DOE → 「所有工作」 → 「匯入資料」啟動 DTS/SSIS 精靈。A1_Temp。DOE (當前資料庫)。| 場景 | 處理方式 |
|---|---|
| 目標表已存在同名資料,需合併 (Upsert) | 精靈選「寫入查詢」而非複製表,使用 MERGE (2008+) 或 INSERT...WHERE NOT EXISTS / UPDATE...FROM 邏輯。 |
| 大量資料 (百萬列+) | 使用 BULK INSERT / bcp / SSIS 「快速載入」模式 (Table Lock, Check Constraints Off, Batch Size 10000)。 |
| 結構不完全相容 (欄位差異) | 來源查詢中明確列出欄位並轉換型別,或建立預存檢視表 (View) 作為來源。 |
| 需保留來源備份檔以供審計 | 還原後勿刪除 A1_Temp,改為設為 READ_ONLY 或移至歸檔伺服器。 |
| 跨版本還原 (如 2000 → 2008) | 直接還原備份檔即可自動升級,但 2000 備份無法在 2012+ 直接還原,需中轉 2008R2。 |
-- 1. 建立暫存資料庫並還原
USE master;
GO
CREATE DATABASE A1_Temp
ON (NAME = 'A1_Temp_Data', FILENAME = 'C:\Data\A1_Temp.mdf')
LOG ON (NAME = 'A1_Temp_Log', FILENAME = 'C:\Data\A1_Temp.ldf');
GO
RESTORE DATABASE A1_Temp
FROM DISK = 'C:\Backups\A1.BAK'
WITH REPLACE,
MOVE 'A1_Data' TO 'C:\Data\A1_Temp.mdf',
MOVE 'A1_Log' TO 'C:\Data\A1_Temp.ldf',
STATS = 10;
GO
-- 2. 導入特定資料表 (範例:Customers, Orders)
-- 假設結構相同,開啟 IDENTITY_INSERT
SET IDENTITY_INSERT DOE.dbo.Customers ON;
INSERT INTO DOE.dbo.Customers (CustomerID, CompanyName, ContactName, ...)
SELECT CustomerID, CompanyName, ContactName, ...
FROM A1_Temp.dbo.Customers
WHERE NOT EXISTS (SELECT 1 FROM DOE.dbo.Customers c WHERE c.CustomerID = A1_Temp.dbo.Customers.CustomerID);
SET IDENTITY_INSERT DOE.dbo.Customers OFF;
GO
-- 3. 清理 (視保留策略決定)
-- DROP DATABASE A1_Temp;
DOE 原有資料列數未減少。DBCC CHECKDB(DOE) 無一致性錯誤。「還原至暫存庫 → DTS/SSIS 遷入目標庫」是跨庫資料合併的標準化、低風險模式。關鍵在於 WITH REPLACE + 檔案重定位 避免衝突,以及 DTS/SSIS 靈活的欄位對應與轉換能力。生產環境操作前,務必於測試環境完整演練並驗證資料完整性。