適用場景
- 資料庫伺服器重灌/遷移,僅備份 `.mdf` (資料檔) 與 `.ldf` (記錄檔)。
- 開發/測試環境快速複製生產資料庫 (停用服務複製檔案)。
- 誤刪資料庫後,從檔案層面備份恢復。
標準附加語法 (SQL Server 2005+)
USE master;
GO
CREATE DATABASE [YourDBName]
ON (FILENAME = N'D:\MSSQL\Data\YourDBName.mdf'), -- 主資料檔
(FILENAME = N'D:\MSSQL\Log\YourDBName_log.ldf') -- 記錄檔
FOR ATTACH;
GO
關鍵參數說明
FOR ATTACH:指示 SQL Server 從現有檔案建立資料庫元件,不建立新檔案。
FILENAME:必須指定 **完整實體路徑**,且 SQL Server 服務帳號需有讀寫權限。
- 若有 **多個資料檔 (ndf)** 或 **多個記錄檔**,全部在 `ON` 子句中列出。
- 若記錄檔遺失,可用 `FOR ATTACH_REBUILD_LOG` 重建記錄檔 (資料庫需正常關閉/無作用中交易)。
SSMS 圖形介面操作
- 物件總管右鍵 **資料庫** → **附加...**
- 點選 **新增** → 選擇 `.mdf` 檔案,下方自動列出關聯檔案。
- 確認邏輯名稱、路徑、檔案群組無誤後點選 **確定**。
常見錯誤與排查
| 錯誤訊息 | 原因 | 解決 |
| Access denied / 5120 | 服務帳號無檔案權限 | 授予服務帳號 (或 `NT SERVICE\MSSQLSERVER`) 資料夾完全控制權限 |
| 版本不相容 | 檔案來自較新版本 SQL Server | 無法降級附加;需相同或更高版本實例 |
| 資料庫已存在 | 同名資料庫已在實例中 | 先卸離/刪除現有資料庫,或指定不同名稱附加 |
| 記錄檔不符 | .ldf 非對應 .mdf 或資料庫非乾淨關閉 | 嘗試 `FOR ATTACH_REBUILD_LOG` 或從備份還原 |
進階:唯讀/獨立資料庫附加
-- 唯讀附加 (適合報表/歸檔)
CREATE DATABASE [ReportDB] ON (FILENAME = '...') FOR ATTACH;
ALTER DATABASE [ReportDB] SET READ_ONLY;
-- 包含檔案流/FILESTREAM
CREATE DATABASE [FSDb] ON (FILENAME = '...'), (FILENAME = '...') FOR ATTACH;
自動化腳本 (批次附加目錄下所有 .mdf)
DECLARE @path NVARCHAR(260) = N'D:\MSSQL\Data\';
DECLARE @cmd NVARCHAR(MAX), @file NVARCHAR(260);
DECLARE cur CURSOR FOR
SELECT name FROM sys.sysfiles WHERE filename LIKE @path + '%.mdf'; -- 需配合 xp_cmdshell 或 CLR 掃描目錄
-- 實務建議使用 PowerShell + dbatools: Attach-DbaDatabase -SqlInstance localhost -Path 'D:\MSSQL\Data\*.mdf'