Attach MDF in MS SQL Server Express

將資料庫的MDF檔案來當作移動式的資料庫,並且使用連線字串附加(attach)MDF檔至SQL Server

前言

多台電腦協作需要同一個資料庫資料時,又不想使用同一台資料庫伺服器來支撐,就可以考慮將資料庫的MDF檔案來當作移動式的資料庫, 可以輕便的移動到任何電腦,並且可以使用版本控制來管理或備份資料庫狀態。

SQL Express提供可以直接附加(attach)資料庫的MDF檔案,請注意在哪個版本的SQL Express產生的MDF檔案,其他電腦要使用的話就要安裝同一個版本的SQL Express,不然會無法使用。

建立MDF檔案

在SQL Server Management建立好資料庫後,找到該資料庫儲存的MDF/LDF位置(資料庫屬性>檔案中可以看到儲存路徑),針對資料庫右鍵>工作>卸離,即可帶走該地的MDF與LDF,放在自己期望的資料夾下。

若不打算保留舊有的交易紀錄,LDF不帶走也沒關係,attach進SQL Express過後他也會自動產生新的LDF在MDF的所在位置。

連線字串

Data Source={資料庫伺服器};AttachDbFilename={MDF檔案位置};Initial Catalog={資料庫名稱};Integrated Security=True;User Instance=True`
  • 資料庫伺服器 : attach在哪個資料庫伺服器上
  • MDF檔案位置 : 可以使用絕對路徑或相對路徑
    • 絕對路徑 : C:\MDF\TestDatabase.mdf
    • 相對路徑 : 使用|DataDirectory|關鍵字, 如|DataDirectory|TestDatabase.mdf
      • 若是ASP.Net專案(也就是使用Web.config),該相對目錄在App_Data資料夾下
      • 其餘專案類型的相對目錄則是指向專案的Bin資料夾下
  • 資料庫名稱 : attach後的資料庫名稱
  • 連線字串必須要加上User Instance=True,來啟動使用者執行個體,才能支援AttachDbFile(微軟詳細解釋)

MDF目錄變更

例如: 若原本在attach C:\MDF\TestDatabase.mdf使用後,要改成attach D:\MDF\TestDatabase.mdf。

由於SQL Server Express在attach一次後就會保留資料庫的資料(資料顯示存活時間為60分鐘,但筆者實測時間有超過60分鐘,筆者就沒有詳細查詢實際存活時間),故在目錄變更之前,必須優先刪除(drop)或是卸離(detach)舊有資料庫。

以筆者的狀況而言,使用連線字串attach資料庫後,SQL Server Management無法看到該attach的資料庫,所以無法使用SQL Server Management將該資料庫刪除。使用原有的連線字串連上資料庫後執行

Use Master;
DROP DATABASE [TestDatabase];

先執行Use Master的原因是將現在操縱的資料庫變更為系統資料庫,來提高可執行的指令的權限,且避免自己處在要刪除的資料庫中。

但注意使用drop的話會把MDF檔/LDF檔一起刪除,在執行之前要備份起來,或者執行detach指令

EXEC sp_detach_db 'TestDatabase', 'true';

執行完畢後就可以修改連線字串至新的目錄位置。