附加資料庫 (Attach Database)
1. 前言
-
附加資料庫問題說明

在附加資料庫時最常遇到的兩個問題如下:
-
附加資料庫時遇到權限不足問題
錯誤訊息: 「存取被拒」(作業系統錯誤5)
發生原因:Windows檔案系統權限獨立
SQL Server需要對包含.mdf檔案的資料夾擁有明確的讀寫權限。
解決方案: 授予資料夾「完全控制」權限- 開啟資料夾屬性: 在包含您的資料庫檔案(
.mdf、.ldf)的資料夾上按右鍵,選擇「屬性」。 - 切換至安全性分頁: 點選「安全性」分頁。
- 編輯權限: 點選「編輯」按鈕。
- 選擇使用者或群組: 在「群組或使用者名稱」列表中,選擇您要變更權限的使用者(例如,
「Users」群組)或點選「新增」來新增特定的使用者或群組。 - 設定權限: 在下方的
「Users 的權限」列表中,勾選「完全控制」旁的「允許」框格。 - 套用並確認: 點選「套用」按鈕,然後點選「確認」。再次點選「確認」關閉資料夾屬性視窗。

- 開啟資料夾屬性: 在包含您的資料庫檔案(
-
相同檔名同時附加問題
錯誤訊息: 「無法附加與現有資料庫名稱相同的資料庫」
發生原因: 常見於複製資料庫時。 常見於從正式區複製資料庫以建立測試環境時。
解決方案: 變更「附加為」的名稱- 在
SQL Server Management Studio中開啟附加資料庫對話框: 依照正常步驟進行附加資料庫操作。 - 定位到「附加為」欄位: 在對話框中,找到顯示資料庫名稱的欄位,通常標註為「附加為 (
Attach As)」。 - 變更名稱: 在此欄位中輸入一個新的、唯一且在該伺服器上未被使用的名稱。
- 確認變更: 完成變更後,點選對話框中的確認按鈕(例如,「確定」或「附加」)。

- 在
-
-
快速操作指南
權限問題解決步驟 名稱衝突解決步驟 1.卸離原始資料庫(若需要)。
2.建立新資料夾 (如d:(mydb))。
3.將mdf及ldf檔案複製到新的資料夾。
4.在d:\mydb資料夾上設定「内容」→ 「安全性」。
5.為Users或Everyone、群組新增「完全控制」權限。
6.處理檔案權限繼承問題(若彈出提示)。
7.重新在SSMS中執行附加。1.在 SSMS中開啟「附加資料庫」對話框。
2.選擇要附加的mdf檔案。
3.在下方的資料庫詳細資料格線中,找到「附加為」欄位。
4.將預設名稱修改為一個新的、唯一的名稱。
5.點擊「確定」。
2. 附加資料庫時遇到權限不足問題
-
建立範例資料庫及空白資料夾
本範例以SQLServer 2025為例,如果版本不同則以您的實際版本為主。
在此我們先在D:\db\sql2025資料夾建立一個空白的資料庫demodb。D:\db\sql2025下建立demodb資料庫
D:\db\sql2025\demodb.mdf
D:\db\sql2025\demodb_log.ldf

-
缷離資料庫並複製資料庫到空白資料夾
- 將資料庫
demodb缷離



- 卸除後,並複製資料庫
d:\db\sql2025\demodb.mdf與d:\db\sql2025\demodb_log.ldf到d:\mydb資料夾中。

- 接下來,我們嘗試在
SQLServer Management Studio (SSMS)中附加這個新的資料庫檔案。
- 將資料庫
-
附加資料庫並出現問題
此時將d:\mydb\demodb.mdf資料庫 附加 進來,有可能會出現以下 存取被拒 問題。




當您在
SQL Server Management Studio (SSMS)中嘗試附加一個資料庫檔案 (.mdf)時,很可能會看到如下的錯誤訊息視窗:這個視窗中的關鍵資訊通常是
• 無法開啟實體檔案"D:\mydb\demodb.mdf"
• 作業系統錯誤 5:"存取被拒"簡單來說,這個錯誤的核心並不是您在
SQL Server中的權限不夠,而是SQL Server這個「程式」本身,沒有得到Windows作業系統的允許,去讀取您指定的那個資料庫「檔案」。學習目標提示
理解這個錯誤的關鍵,在於學會區分「SQL Server的世界」和「Windows的世界」。它們是兩個各自獨立運作的系統。核心概念:兩個獨立的權限世界
問題的根本原因在於:SQL Server和Windows作業系統是兩套獨立的系統,它們各自擁有自己的權限控管機制。正如上圖所示,當
SQL Server需要操作實體的資料庫檔案(例如.mdf和.ldf檔案)時,它必須先向Windows作業系統「請求」並獲得存取這些檔案的權限。
為了幫助您更清晰地理解,我們可以透過下表來對比兩者的管理範疇:權限系統 管理目標 核心概念 SQL Server資料庫內部的使用者、角色、登入等。 管理「誰」可以對資料庫內的「資料」做什麼操作(查詢、新增、修改)。 Windows檔案、資料夾的存取權限。 管理「哪個程式或使用者帳戶」可以對「檔案」做什麼操作(讀取、寫入、執行)。 綜合闡述:即使您是
SQL Server的最高權限管理員 (sa),當SQL Server要去讀取一個Windows資料夾裡的檔案時,仍然需要遵守Windows的檔案權限規則。理解了這個核心概念後,讓我們來看一個最常觸發這個權限問題的實際操作場景。
-
發生時機說明
在開發與測試過程中,我們經常需要複製資料庫。這個 「搬家」 的動作,正是權限問題最常出現的時刻。讓我們將這個常見情境步驟化:
1. 初始狀態:我們有一個在「正式區」(d:\db\sql2025) 運作良好的資料庫demodb。這個資料庫是透過SSMS建立的,所以一切正常。這是因為在安裝SQL Server時,其服務帳戶 (例如NTSERVICE\MSSQLSERVER) 已被授予對預設資料目錄的必要權限。因此,在這些預設位置建立資料庫時,權限會自動處理妥當,完美運作。
2. 操作目的:為了開發新功能,我們需要一個「測試區」。於是,我們手動將demodb.mdf和demodb_log.ldf這兩個檔案,複製到一個我們自己建立的新資料夾,例如d:\mydb。
3. 問題觸發:當我們試圖在SSMS中,附加位於新資料夾d:\mydb裡的demodb.mdf檔案時,就會觸發前面提到的「存取被拒」錯誤。解釋原因
問題發生的根本原因,正是因為d:\mydb是一個全新的資料夾,Windows並沒有自動賦予SQL Server服務存取這個資料夾的權限。
既然問題出在Windows的資料夾權限上,那麼解決方案也就非常直觀了:手動為它加上權限。錯誤訊息

-
解決方式
要解決這個問題,我們必須親自告訴Windows:「請允許SQL Server存取這個資料夾!」重點提示
當附加資料庫遇到權限不足問題時,需手動去增加資料夾或檔案的權限才能解決。最精準安全的方式是只授權給SQL Server服務帳戶,但在開發環境下也可使用Users群組作為快速替代方案。重點提示
Usersvs.Everyonevs.SQL Server服務帳戶 的安全性考量Users: 此群組包含本機上所有標準的互動式使用者帳戶。在您自己的本機開發電腦上,這通常是個可接受的權宜之計。Everyone: 這是一個極度寬鬆的權限設定,它會對「任何人」開放存取權,包含匿名的網路使用者。強烈建議您,除非是在一個完全隔離且臨時的測試環境,否則絕對不要在任何情況下使用Everyone,以免造成嚴重的安全漏洞。SQL Server服務的帳戶名稱:僅加入SQL Server服務的帳戶名稱 的權限,不以帳戶的角度來授權。
操作方式
以下是詳細的操作步驟,我們將從最專業、最安全的方法開始:
1. 在Windows檔案總管 中,找到您存放新資料庫檔案的資料夾(例如d:\mydb),在其上點擊右鍵,選擇「內容」。
2. 切換到「安全性」分頁,點擊「編輯」,然後點擊「新增」。
3. 新增「Users」群組或「Everyone」,並在下方的權限設定中,勾選「完全控制」的「允許」選項。
4. 依序點擊「確定」儲存變更。完成上述任一方法後,回到
SSMS重新執行附加資料庫操作,問題應該就解決了。
疑難排解:權限未被繼承?
注意:有時候,如果您是先將檔案複製到資料夾,然後才變更資料夾的權限,這些已存在的檔案可能不會自動繼承新的權限設定。 如果您在設定權限後仍然遇到「存取被拒」錯誤,請回到資料夾的「安全性」分頁,點擊「進階」按鈕。在進階安全性設定視窗下方,勾選「以這個物件的繼承權限項目取代所有子物件的權限項目」,然後點擊「確定」。這會強制將資料夾的權限套用到其下的所有檔案。重點提示
如果不想加入Users群組權限也可以僅加入SQL Server服務的帳戶名稱,如NTSERVICE\MSSQL$<具名名稱>
3. 相同檔名同時附加問題
-
發生時機
在區分「正式區」與「測試區」的場景中,我們通常會複製正式資料庫來當作測試基礎。這時,SQL Server伺服器上可能已經有一個名為demodb的正式資料庫,而您又想附加一個同樣來自demodb.mdf的測試資料庫,此時就會發生命名衝突。
您會看到如下的錯誤訊息:

-
解決方法
解決這個問題的方法非常簡單,就是在附加時,為這個新的資料庫指定一個不同的「邏輯名稱」。

在SSMS的附加資料庫介面中,下方的資料庫詳細資料清單有幾個關鍵欄位。您會看到「資料庫名稱 (Database Name)」欄位顯示了儲存在.mdf檔案中繼資料的原始名稱(例如demodb),而您需要修改的,是它旁邊的「附加為 (Attach As)」欄位。這個欄位決定了此資料庫在這台SQL Server執行個體上的新邏輯名稱。
解決方案

舉例說明:如上圖所示,雖然我們要附加的實體檔案來自 demodb.mdf,但我們可以將其「附加為」
demodb_test。這樣一來,這個新附加的資料庫在SQL Server中就會被識別為demodb_test,可以與正式區的demodb資料庫和平共存。

此時系統即可區分兩個資料庫,如 正式區 與 測試區 等。