首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server Express 自動附加資料庫部署陷阱:跨磁碟機無法附加的解決之道

     編輯:關於SqlServer

SQL Server Express 支援 XCOPY 部署:只需將 .mdf/.ldf 複製到應用程式目錄,連接字串加入 AttachDbFileName=|DataDirectory|\MyDB.mdf 即可自動附加。但實測發現跨磁碟機(非 C:)部署會失敗,錯誤訊息:「資料庫已被壓縮,無法建立,需要解壓縮」。

現象重現

  • SQL Express 安裝在 C:\,應用程式部署在 D:\App。
  • 連接字串 AttachDbFileName=D:\App\MyDB.mdf → 拋出壓縮錯誤。
  • 同樣檔案放在 C:\App → 正常附加。
  • 將檔案設為唯讀 → 任何磁碟機皆可附加(但變唯讀資料庫)。

根因分析

  • SQL Express 自動附加時會嘗試在資料庫檔案所在目錄建立暫存/記錄檔,需該目錄寫入權限。
  • 非系統磁碟機(D: 等)預設權限可能不允許 SQL Express 服務帳號(通常為 NETWORK SERVICE 或 Local System)寫入。
  • 「壓縮」錯誤實為誤導性訊息,實際是存取權限不足導致無法建立必要檔案。

解決方案(依優序)

  1. 授予服務帳號資料夾寫入權限(最正規):
    右鍵資料夾 → 安全性 → 編輯 → 新增 NETWORK SERVICE(或服務帳號) → 勾選「修改/寫入」。
  2. 將資料庫檔案放在 SQL Express 安裝磁碟機(最簡單):
    應用程式與資料庫同在 C:,或修改 DataDirectory 指向 C: 下資料夾。
  3. 部署時預先手動附加:
    安裝腳本執行 CREATE DATABASE ... FOR ATTACH,連接字串改用一般 Initial Catalog,不使用自動附加。
  4. 唯讀部署:
    檔案設唯讀,連接字串加 Read Only=True,適用於純查詢場景。

連接字串對照

版本Driver連接字串關鍵差異
SQL 2000com.microsoft.jdbc.sqlserver.SQLServerDriverjdbc:microsoft:sqlserver://host:1433;DatabaseName=DB
SQL 2005+com.microsoft.sqlserver.jdbc.SQLServerDriverjdbc:sqlserver://host:1433;DatabaseName=DB

JDBC 3.0 getGeneratedKeys() 統一自增鍵取得

SQL 2005 JDBC 驅動支援 Statement.RETURN_GENERATED_KEYS,可統一 Oracle/MySQL/SQL Server 自增鍵取得邏輯:

PreparedStatement ps = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
ps.executeUpdate();
ResultSet rs = ps.getGeneratedKeys();
if (rs.next()) id = rs.getLong(1);

部署檢查清單

  • [ ] 目標資料夾授予 SQL Express 服務帳號寫入權限
  • [ ] sqljdbc.jar 放入 tomcat/common/lib 或專案 classpath
  • [ ] 連接字串使用 2005 格式 jdbc:sqlserver://
  • [ ] 測試自動附加、讀寫、卸載流程正常

掌握權限與磁碟機關係,SQL Express XCOPY 部署即可穩定落地,避免「壓縮」誤導浪費排查時間。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved