由於本身有一本基於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的【服務】上也能夠作到。