SQL Server附加資料庫出現錯誤5123的正確解決方案

來源:互聯網
上載者:User

SQL Server附加資料庫出現錯誤5123的正確解決方案

因為自己有一本基於SQL Server 2005的資料庫教程,裡邊使用的樣本資料庫是AdventureWorks for SQL Server 2005,而我的機子上裝的是SQL Server 2008,樣本資料庫是AdventureWorks for SQL Server 2008。起初我以為樣本資料庫AdventureWorks for SQL Server 2005 與AdventureWorks for SQL Server 2008 資料庫結構應該差不多,可是在練習的過程中,我發現兩個資料庫中很多表的結構還是有很多不一樣的地方。於是決定到微軟下載中心將樣本資料庫AdventureWorks for SQL Server 2005下過來,附加到SQL Server 2008上,以便順利進行練習。我以SQL Server 2008的超級管理員賬戶“sa”串連登入到執行個體SQLSERVER2008:

在附加樣本資料庫AdventureWorks for SQL Server 2005時,彈出了這個錯誤:

仔細看了一下主要資訊“嘗試開啟或建立物理檔案......時,CREATE FILE遇到作業系統錯誤 5(拒絕訪問。)”  ,一看就知道應當是對要附加的資料檔案的操作許可權不夠。    按一般的思維習慣,我們會對操作許可權不夠的檔案授予足夠的操作許可權。比如,有網友說“給要附加的資料檔案和相應的記錄檔授予Everyone的許可權”,授權過程如下三張所示(注意資料檔案和記錄檔都必須授權):

(圖1:授權資料檔案)

(圖2:資料檔案授權後)

(圖3:記錄檔授權後)

對要附加的資料檔案和記錄檔分別授予Everyone【讀取和執行】、【讀取】的許可權後,在SQL Server 2008中重新嘗試附加資料庫,發現可以附加成功了! 是不是問題就這樣解決了呢?這樣子做對嗎?    如果在真實的資料庫管理過程中,我們把資料檔案、記錄檔的許可權放大到Everyone,那肯定是不對的做法。因為這樣資料庫的安全性將大打折扣,雖然對Everyone只授予了【讀取和執行】、【讀取】的許可權,但這仍然有泄漏資料的危險。

    我們應當保證能正常訪問的情況下,使資料檔案具有最小的訪問權。我們之前授權給Everyone,那所有使用者或賬戶都能操作相應的檔案了,這肯定不安全的。那麼如何才能授予最小的存取權限呢?思考一下,我們用SQL Server 2008去附加相應的資料檔案,報出“拒絕訪問”即許可權不夠的錯誤,換句話說,當前SQL Server 2008沒有許可權訪問這些檔案。我們右鍵檔案,到檔案屬性中查看一下檔案的許可權情況,如所示:

(相應資料檔案原本的許可權情況)

我們發現只有SYSTEM和xrm這兩個組或使用者才有權操作此資料檔案。SYSTEM是一個使用者組,即【本地系統】組,而xrm是一個管理使用者,示:

(xrm使用者的資訊)

SYSTEM使用者組和xrm這個管理使用者都有許可權操作此資料檔案和記錄檔,而以SQL Server 2008的超級管理員SA串連登入執行個體後,SQL Server卻沒有許可權訪問此資料檔案。換句話說,以SQL Server 2008的超級管理員SA串連登入執行個體後,登入的身份不在SYSTEM使用者組,也不是xrm這個管理員。那會是什麼呢?

        我們查看一下當前SQL Server 2008的執行個體服務的相關資訊就知道了,開啟Sql Server Configuration Manager (即SQL Server 組態管理員)查看一下當前串連到的執行個體服務的相關資訊,如所示:

(當前執行個體服務的相關資訊)

發現當前執行個體SQLSERVER2008的登入身份為“NT AUTHORITY\LocalService”,即作業系統授權的【本地服務】,本地服務也是了個使用者組。換句話說,如果我們僅授予【本地服務】這個使用者組的許可權(而不是Everyone),應該也可以在SQL Server 2008中用sa的賬戶附加資料庫了。為此,將剛剛授予相應資料檔案和記錄檔Everyone的許可權都刪除,再授予LocalService使用者組相應資料檔案和記錄檔的許可權,重新嘗試附加相應的資料庫,發現的確可以附加成功!不必說,授予作業系統授權的【本地服務】使用者組比起授予Everyone來說肯定要安全的多。

    上面提到的方法中,我們都是改變了資料檔案原來的許可權範圍(原來的許可權範圍只有SYSTEM即【本地系統】使用者組和xrm這個系統管理員) 。而更好的辦法是不要改變資料檔案的許可權範圍,仍然以SA身份串連登入SQL Server 2008的執行個體也能訪問相應的資料檔案。而要達到這個目的,我們只需要將相應執行個體的登入身份改為SYSTEM【本地系統】使用者組,SYSTEM也是在相應資料檔案的許可權範圍之內的使用者組,而且SQL Server執行個體以本地系統身份運行,安全性將更高。我們可以在SQL Server 組態管理員中將相應的SQL Server執行個體的登入身份修改為【本地系統】即Local System,如下列圖所示:

(修改執行個體的登入身份)

(執行個體的登入身份變為LocalSystem)

然後重啟相應執行個體服務,重新以SA身份串連登入SQL Server 2008的相應執行個體並嘗試附加資料庫, 同樣可以成功的將資料庫附加上!!! 

      其實,如果不是要特別地以SA身份串連登入SQL Server 2008的相應執行個體來附加相應資料庫,那麼在串連登入SQL Server 2008的相應執行個體時,身分識別驗證選擇【Windows 身分識別驗證】,不做前文中所述的其他修改就可以把資料庫附加上去了,原因就在於:【Windows 身分識別驗證】用的是當前作業系統的使用者的許可權,許可權一般都足夠大的。另外,在【SQL Server 組態管理員】中針對執行個體服可以做的操作,在Windows的【服務】上也可以做到。

本文永久更新連結地址:

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.