附加資料庫 (Attach Database)

1. 前言

  1. 附加資料庫問題說明

    在附加資料庫時最常遇到的兩個問題如下:

    • 附加資料庫時遇到權限不足問題
      錯誤訊息: 「存取被拒」(作業系統錯誤5)
      發生原因: Windows 檔案系統權限獨立
      SQL Server 需要對包含 .mdf 檔案的資料夾擁有明確的讀寫權限。
      解決方案: 授予資料夾「完全控制」權限

      • 開啟資料夾屬性: 在包含您的資料庫檔案(.mdf.ldf)的資料夾上按右鍵,選擇「屬性」。
      • 切換至安全性分頁: 點選「安全性」分頁。
      • 編輯權限: 點選「編輯」按鈕。
      • 選擇使用者或群組: 在「群組或使用者名稱」列表中,選擇您要變更權限的使用者(例如,「Users」 群組)或點選「新增」來新增特定的使用者或群組。
      • 設定權限: 在下方的 「Users 的權限」 列表中,勾選「完全控制」旁的「允許」框格。
      • 套用並確認: 點選「套用」按鈕,然後點選「確認」。再次點選「確認」關閉資料夾屬性視窗。
    • 相同檔名同時附加問題
      錯誤訊息: 「無法附加與現有資料庫名稱相同的資料庫」
      發生原因: 常見於複製資料庫時。 常見於從正式區複製資料庫以建立測試環境時。
      解決方案: 變更「附加為」的名稱

      • SQL Server Management Studio 中開啟附加資料庫對話框: 依照正常步驟進行附加資料庫操作。
      • 定位到「附加為」欄位: 在對話框中,找到顯示資料庫名稱的欄位,通常標註為「附加為 (Attach As)」。
      • 變更名稱: 在此欄位中輸入一個新的、唯一且在該伺服器上未被使用的名稱。
      • 確認變更: 完成變更後,點選對話框中的確認按鈕(例如,「確定」或「附加」)。
  2. 快速操作指南

    權限問題解決步驟名稱衝突解決步驟
    1.卸離原始資料庫(若需要)。
    2.建立新資料夾 (如d:(mydb))。
    3.將 mdfldf 檔案複製到新的資料夾。
    4.在 d:\mydb 資料夾上設定「内容」→ 「安全性」。
    5.為 UsersEveryone、群組新增「完全控制」權限。
    6.處理檔案權限繼承問題(若彈出提示)。
    7.重新在 SSMS 中執行附加。
    1.在 SSMS 中開啟「附加資料庫」對話框。
    2.選擇要附加的 mdf 檔案。
    3.在下方的資料庫詳細資料格線中,找到「附加為」欄位。
    4.將預設名稱修改為一個新的、唯一的名稱。
    5.點擊「確定」。

2. 附加資料庫時遇到權限不足問題

  1. 建立範例資料庫及空白資料夾
    本範例以 SQLServer 2025 為例,如果版本不同則以您的實際版本為主。
    在此我們先在 D:\db\sql2025 資料夾建立一個空白的資料庫 demodb

    D:\db\sql2025 下建立 demodb 資料庫
    D:\db\sql2025\demodb.mdf
    D:\db\sql2025\demodb_log.ldf

  1. 缷離資料庫並複製資料庫到空白資料夾

    • 將資料庫 demodb 缷離


    • 卸除後,並複製資料庫 d:\db\sql2025\demodb.mdfd:\db\sql2025\demodb_log.ldfd:\mydb 資料夾中。
    • 接下來,我們嘗試在 SQLServer Management Studio (SSMS) 中附加這個新的資料庫檔案。
  2. 附加資料庫並出現問題
    此時將 d:\mydb\demodb.mdf 資料庫 附加 進來,有可能會出現以下 存取被拒 問題。



    當您在 SQL Server Management Studio (SSMS) 中嘗試附加一個資料庫檔案 (.mdf)時,很可能會看到如下的錯誤訊息視窗:

    這個視窗中的關鍵資訊通常是
    • 無法開啟實體檔案 "D:\mydb\demodb.mdf"
    • 作業系統錯誤 5: "存取被拒"

    簡單來說,這個錯誤的核心並不是您在 SQL Server 中的權限不夠,而是 SQL Server 這個「程式」本身,沒有得到 Windows 作業系統的允許,去讀取您指定的那個資料庫「檔案」。

    學習目標提示
    理解這個錯誤的關鍵,在於學會區分「SQL Server 的世界」和「Windows 的世界」。它們是兩個各自獨立運作的系統。

    核心概念:兩個獨立的權限世界
    問題的根本原因在於:SQL ServerWindows 作業系統是兩套獨立的系統,它們各自擁有自己的權限控管機制。

    正如上圖所示,當 SQL Server 需要操作實體的資料庫檔案(例如 .mdf 和 .ldf 檔案)時,它必須先向 Windows 作業系統「請求」並獲得存取這些檔案的權限。

    為了幫助您更清晰地理解,我們可以透過下表來對比兩者的管理範疇:

    權限系統管理目標核心概念
    SQL Server資料庫內部的使用者、角色、登入等。管理「誰」可以對資料庫內的「資料」做什麼操作(查詢、新增、修改)。
    Windows檔案、資料夾的存取權限。管理「哪個程式或使用者帳戶」可以對「檔案」做什麼操作(讀取、寫入、執行)。

    綜合闡述:即使您是 SQL Server 的最高權限管理員 (sa),當 SQL Server 要去讀取一個 Windows 資料夾裡的檔案時,仍然需要遵守 Windows 的檔案權限規則。

    理解了這個核心概念後,讓我們來看一個最常觸發這個權限問題的實際操作場景。

  3. 發生時機說明
    在開發與測試過程中,我們經常需要複製資料庫。這個 「搬家」 的動作,正是權限問題最常出現的時刻。

    讓我們將這個常見情境步驟化:
    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 的資料夾權限上,那麼解決方案也就非常直觀了:手動為它加上權限。

    錯誤訊息

  4. 解決方式
    要解決這個問題,我們必須親自告訴 Windows:「請允許 SQL Server 存取這個資料夾!」

    重點提示
    當附加資料庫遇到權限不足問題時,需手動去增加資料夾或檔案的權限才能解決。最精準安全的方式是只授權給 SQL Server 服務帳戶,但在開發環境下也可使用Users 群組作為快速替代方案。

    重點提示
    Users vs. Everyone vs. 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. 相同檔名同時附加問題

  1. 發生時機
    在區分「正式區」與「測試區」的場景中,我們通常會複製正式資料庫來當作測試基礎。這時,SQL Server 伺服器上可能已經有一個名為 demodb 的正式資料庫,而您又想附加一個同樣來自 demodb.mdf 的測試資料庫,此時就會發生命名衝突。

    您會看到如下的錯誤訊息:

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

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

    解決方案

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

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