需求分析
- 現有系統使用 **Access (Jet/ACE) 資料庫** 作為後端。
- 需開發 **JSP Web 應用** 讀取資料,效能與並發考量決定遷移至 **SQL Server**。
- **核心需求**:Access 資料 **即時/近即時** 同步至 SQL Server,Web 端查詢 SQL Server。
可行架構方案對比
| 方案 | 架構說明 | 即時性 | 複雜度 | 成本 | 建議場景 |
| 1. 連結資料表 (Linked Tables) | Access 前端保留,後端連結 SQL Server 資料表 (ODBC);Access 直接讀寫 SQL Server | 即時 | 低 | 低 | Access 應用邏輯簡單、無複雜 VBA、可接受 ODBC 延遲 |
| 2. SQL Server 複寫 (合併/交易式) | Access 作為發行者/訂閱者 (需 ODBC/OLE DB),定期/持續同步 | 近即時 (秒~分) | 中 | 中 | 需離線/多站點同步、衝突解決 |
| 3. SSIS / DTS 定時 ETL | 排程作業 (每分鐘/每小時) 抽取 Access → 轉換 → 載入 SQL Server | 批次 (分鐘~小時) | 中 | 低 | 可接受延遲、資料量中等、需清洗轉換 |
| 4. 觸發器 + Linked Server | Access 無觸發器;改為 **SQL Server 側輪詢** 或 **Access 應用層雙寫** | 即時 (雙寫) / 近即時 (輪詢) | 高 | 中 | 既有 Access 應用不可大幅修改、需精確同步 |
| 5. 完整遷移 (冷/熱切換) | 一次性移轉結構與資料,應用程式改連 SQL Server (Upsizing Wizard/SSMA) | 即時 (切換後) | 高 (測試驗證) | 高 (一次性) | 長期策略、Access 限制 (2GB/並發/安全) 成為瓶頸 |
推薦漸進式實施路徑
- 評估與原型:使用 **SQL Server Migration Assistant for Access (SSMA)** 評估相容性、轉換結構、試跑資料移轉。
- 雙寫過渡期:修改 Access 應用 (VBA/表單) 於關鍵寫入操作同步呼叫 SQL Server (ADO 連結資料表或 Passthrough Query),讀取漸進切換至 SQL Server 連結表。
- 驗證與切換:平行運行 1-2 週,比對資料一致性、效能指標、使用者回饋。
- 全面切換:Access 前端改為純連結 SQL Server,或重寫為 Web/.NET 應用;淘汰本地 .mdb/.accdb。
關鍵技術細節
SSMA 遷移工具
Access 連結 SQL Server 表 (ODBC)
- Access → 外部資料 → ODBC 資料庫 → 連結資料表。
- 建立 System DSN (SQL Server Native Client),驗證選 SQL Server 驗證 (專用帳號)。
- 連結後表名加前綴
dbo_,VBA 代碼需調整參考。
JSP 連線 SQL Server (JDBC)
// context.xml (Tomcat JNDI)
// JSP 使用
DataSource ds = (DataSource) new InitialContext().lookup("java:comp/env/jdbc/MyDB");
Connection conn = ds.getConnection();
常見坑點與對策
| 問題 | 對策 |
| AutoNumber → Identity 種子不一致 | SSMA 遷移時選擇「保留 Identity 值」或遷移後重設 DBCC CHECKIDENT |
| 日期時間精度差異 | Access DateTime (無毫秒) → SQL datetime2(0) 或 smalldatetime |
| Yes/No → bit 映射 | Access -1/0 → SQL 1/0,應用層邏輯需調整 |
| Memo/Long Text → nvarchar(max) | SSMA 自動處理;注意舊版 text/ntext 已淘汰 |
| 並發鎖定差異 | Access 頁面鎖定 → SQL 列級鎖定/行版本,死鎖模式不同,需壓測驗證 |
總結建議
**長期最佳方案是完整遷移至 SQL Server**,利用 SSMA 降低風險,分階段驗證切換。若短期必須共存,採用「Access 連結 SQL Server 表 + JSP 直連 SQL Server」混合模式,資料實際存放於 SQL Server,Access 僅作為前端介面,避免雙向同步的複雜性與一致性風險。