因為自己有一本基於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:日誌檔案授權後)
【讀取與執行】、【讀取】的權限後,在SQL Server 2008中重新嘗試附加資料庫,發現可以附加成功了! 是不是問題就這樣解決了呢?這樣做對嗎? 如果在真實的資料庫管理過程中,我們把資料檔案、日誌檔案的權限放大到Everyone,那肯定是不對的做法。因為這樣資料庫的安全性將大打折扣,雖然對Everyone只授予了【讀取和執行】、【讀取】的權限,但這仍然有洩漏資料的危險。
我們應保證能正常存取的情況下,使資料檔案具有最小的存取權。我們之前授權給Everyone,那所有使用者或帳號都能操作對應的檔案了,這肯定不安全的。那麼如何才能授予最小的存取權限呢?思考一下,我們用SQL Server 2008去附加對應的資料文件,報出「拒絕存取」即權限不夠的錯誤,換句話說,目前SQL Server 2008沒有權限存取這些文件。我們右鍵文件,到檔案屬性中查看一下文件的權限狀況,如下圖所示:(對應資料檔案原本的權限狀況)
才有權操作此資料檔。 SYSTEM是用戶群組,即【本地系統】組,而xrm是一個管理員用戶,如圖所示:
(xrm用戶的資訊)
有權限操作此資料檔和日誌文件,而以SQL Server 2008的超級管理員SA連線登入執行個體後,SQL Server沒有權限存取此資料檔。換句話說,以SQL Server 2008的超級管理員SA連線登入執行個體後,登入的身份就不在SYSTEM使用者群組,也不是xrm這個管理員。那會是什麼呢?我們檢視目前SQL Server 2008的實例服務的相關資訊就知道了,開啟Sql Server Configuration Manager (即SQL Server 設定管理器)檢視一下目前連接到的實例服務的相關資訊,如下圖所示:
(目前實例服務的相關資訊)
發現目前實例SQLSERVER2008的登入身分為「NT AUTHORITYLocalService」,即授權的本地服務也是本地服務」也是了一個本地作業系統】,本地服務也是了一個用戶服務】,換句話說,如果我們只授予【本地服務】這個用戶組的權限(而不是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的【服務】上也可以做到
更多SQL Server附加資料庫出現錯誤5123的正確解決方法相關文章請關注PHP中文網!