遷移情境
SQL Server 2005 資料庫無法直接 `RESTORE` 或 `ATTACH` 到 SQL Server 2000。標準路徑:205 生成 2000 相容腳本 → 2000 執行建立結構 → 資料匯入/匯出傳輸資料。
Management Studio 生成腳本精確步驟
- 物件總管 (F8) 連線至執行個體。
- 右鍵目標資料庫 → 工作 → 產生指令碼。
- 選擇資料庫 → 勾選「為所選資料庫中的所有物件編寫指令碼」。
- 關鍵設定: 「指令碼選項」 → 「為伺服器版本編寫指令碼」 → 選 **SQL Server 2000**。
- 其他選項視需求勾選 (索引、觸發器、條件約束、權限等)。
- 輸出至 `.sql` 檔案。
SQL 2000 執行腳本建立結構
- 查詢分析器連線 SQL 2000 → 開啟 `.sql` → 執行 (F5)。
- 或 Management Studio 切換連線至 SQL 2000 執行。
資料匯入:匯入/匯出精靈
- Management Studio → 右鍵來源資料庫 → 工作 → 匯出資料。
- 資料來源:SQL 2005 來源資料庫。
- 目的地:SQL 2000 目標資料庫 (步驟 2 建立)。
- 選取所有資料表 → 執行。
實測發現的相容性問題與修正
問題 1:`WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]` 語法不支援
現象: 執行腳本報錯。
修正: 移除該子句 (SQL 2000 不支援此索引選項)。
問題 2:系統表參考差異
-- 2005 產生
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[web3_News]') AND type IN (N'U'))
-- 2000 原生
IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[web3_News]') AND OBJECTPROPERTY(id, N'IsUserTable') = 1)
修正: 將 `sys.objects` → `dbo.sysobjects`,`object_id` → `id` (移除 `object_` 前綴)。
問題 3:定序 (COLLATE) 子句
2005 腳本可能缺少明確 `COLLATE Chinese_PRC_CI_AS`,導致中文排序/比較行為不一致。建議在 2000 執行前手動補充或統一資料庫預設定序。
工具輔助修正策略
- 使用文字編輯器 (VS Code, Notepad++) 批次取代:`sys.objects` → `dbo.sysobjects`、`object_id` → `id`、`WITH (IGNORE_DUP_KEY = OFF) ON \[PRIMARY\]` → 空字串。
- 對於大量物件,考慮撰寫 PowerShell 腳本自動化修正。
- 驗證:在測試用 SQL 2000 執行修正後腳本,確認無錯誤再套用正式環境。
替代遷移工具
- SQL Server Migration Assistant (SSMA): 微軟官方遷移工具,支援結構轉換、資料移轉、相容性評估報告。
- 第三方工具 (Redgate SQL Compare / Data Compare): 視覺化差異比對、同步部署,適合持續整合管線。
總結
「產生指令碼 → 版本設為 SQL 2000」是官方支援路徑,但產出腳本仍存相容性缺陷 (系統表、索引選項、定序)。實務上需建立「腳本後處理」標準流程:批次取代系統表參考、移除不支援語法、補充定序。對於大型資料庫,強烈建議採用 SSMA 或 Redgate 工具自動化遷移與驗證。