1. 前言

SQLServer 與 Windows 的權限控管方式各自獨立,因此當 SQL Server 需要使用 Windows 的檔案或資料夾權限時,若未設定 Windows 的存取權限,則無法進行存取。

當資料庫首次由 SSMS新增後,由於在新增過程中 SSMS 為主動為資料庫設定 Windows 權限,因此操作上不會有權限不足問題。

但是若是我們將資料庫檔案移動到另一資料夾時,則此時的新資料夾未設定 SQLServer 存取的權限,則可能在附加資料庫時會出現唯讀或是存取被拒問題。

1.1 附加資料庫問題說明

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

  • 附加資料庫時遇到權限不足問題
  • 相同檔名同時附加問題

1.2 快速操作指南

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

2.1 建立範例資料庫及空白資料夾

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

並建立一個空白的資料夾 d:\temp。

D:\db\sql2022 下建立 demodb 資料庫

D:\db\sql2022\demodb.mdf
D:\db\sql2022\demodb_log.ldf

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

將資料庫 demodb 缷離,並複製資料庫到 d:\temp 資料夾中。

2.3 附加資料庫並出現問題

此時將 d:\temp\demodb.mdf 資料庫 附加 進來,有可能會出現以下 存取被拒 問題

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

這個視窗中的關鍵資訊通常是

  • 無法開啟實體檔案 "D:\temp\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 的檔案權限規則。

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

2.4 發生時機說明

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

讓我們將這個常見情境步驟化:

1. 初始狀態:我們有一個在「正式區」(d:\db\sql2022) 運作良好的資料庫 demodb。這個資料庫是透過 SSMS 建立的,所以一切正常。這是因為在安裝 SQL Server 時,其服務帳戶 (例如 NT SERVICE\MSSQLSERVER) 已被授予對預設資料目錄的必要權限。因此,在這些預設位置建立資料庫時,權限會自動處理妥當,完美運作。

2. 操作目的:為了開發新功能,我們需要一個「測試區」。於是,我們手動將 demodb.mdf 和 demodb_log.ldf 這兩個檔案,複製到一個我們自己建立的新資料夾,例如 d:\temp。

3. 問題觸發:當我們試圖在 SSMS 中,附加位於新資料夾 d:\temp 裡的 demodb.mdf 檔案時,就會觸發前面提到的「存取被拒」錯誤。


解釋原因

問題發生的根本原因,正是因為 d:\temp 是一個全新的資料夾,Windows 並沒有自動賦予 SQL Server 服務存取這個資料夾的權限。

既然問題出在 Windows 的資料夾權限上,那麼解決方案也就非常直觀了:手動為它加上權限。

錯誤訊息

2.5 解決方式

要解決這個問題,我們必須親自告訴 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」群組,並在下方的權限設定中,勾選「完全控制」的「允許」選項。
4. 依序點擊「確定」儲存變更。


完成上述任一方法後,回到 SSMS 重新執行附加資料庫操作,問題應該就解決了。

疑難排解:權限未被繼承?

注意:有時候,如果您是先將檔案複製到資料夾,然後才變更資料夾的權限,這些已存在的檔案可能不會自動繼承新的權限設定。  如果您在設定權限後仍然遇到「存取被拒」錯誤,請回到資料夾的「安全性」分頁,點擊「進階」按鈕。在進階安全性設定視窗下方,勾選「以這個物件的繼承權限項目取代所有子物件的權限項目」,然後點擊「確定」。這會強制將資料夾的權限套用到其下的所有檔案。

重點提示

如果不想加入 Users 群組權限也可以僅加入 SQL Server 服務的帳戶名稱,如
NT SERVICE\MSSQL$<具名名稱>

3. 相同檔名同時附加問題

3.1 發生時機

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

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

3.2 解決方法

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

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

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

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