雖然 SQL 2012 的 LocalDb 與 SQLEXPRESS 師出同門,不過由於執行個體的執行方式不同,因此資料庫特性也有些不太一樣,就以常見的「還原資料庫」功能來說,預設就無法透過 SQL Server Management Studio (SSMS) 進行還原資料庫的動作,雖然透過 T-SQL 指令還是可以正確執行,不過就是麻煩多了!今天我就來分享一個小技巧,讓你能夠使用 SSMS 圖形化操作介面還原資料庫到任意一個 LocalDb 執行個體,省去許多麻煩的 T-SQL 撰寫工作,也簡化還原資料庫到 LocalDb 執行個體的複雜度。
最近漸漸地將開發環境所需的資料庫都整理到 SQL Server 2012 Express LocalDB 執行個體上,一般來說透過卸離(Detach)與附加(Attach)的方式移動資料庫最為方便,不過當你今天拿到的是從其他資料庫備份下來的檔案,那可就一點都不方便了。我們先來看看,透過正常程序執行「還原資料庫」動作時會遇到什麼問題:
1. 先連接 LocalDb 執行個體

2. 試圖執行「還原資料庫」功能

3. 選取先前備份過的檔案,來源部分要選取「裝置」,然後再挑選 SQL Server 的備份檔案 ( *.bak ),不過這時已經可以看到一些錯誤訊息提示了,如下圖紅框處。

4. 當 SQL 備份檔選好,按下「確定」鍵後,就會出現以下錯誤:設定 'Microsoft.SqlServer.Management.Smo.Settings' 無法使用屬性 BackupDirectory。此物件可能沒有此屬性,或因為存取權限不足而無法擷取。 (Microsoft.SqlServer.Smo)

英文版的錯誤訊息是:Property BackupDirectory is not available for Settings 'Microsoft.SqlServer.Management.Smo.Settings'. This property may not exist for this object, or may not be retrievable due to insufficient access rights. (Microsoft.SqlServer.Smo)

發生這個問題的主因在於 SQL Server 2012 Express LocalDB 並沒有 SQL Server 的資料庫預設位置相關屬性,偏偏 SQL Server Management Studio 必須要有這些屬性資料才能正常執行資料庫還原動作,所以才無法完成資料庫還原這個任務。
我們先連到另一台 SQL Server 2008 Developer Edition 的資料庫執行個體,看看執行個體的屬性設定:

然後切換到「資料庫設定」頁面,最下方就有三個「資料庫預設位置」的參數設定,無論在 SQL Server 標準版、企業版或 EXPRESS 版都會有這三個屬性值,如下圖示(點圖可放大):

當你回到 LocalDb 的執行個體屬性,切換至「資料庫設定」頁面後,將完全看不到任何欄位可設定:

若要解決這個問題,必須修改本機電腦的機碼(Registry)設定,將 LocalDb 缺少的這幾個機碼值補上,就可以透過 SSM 正常使用「資料庫還原」功,以下就是我們要加上的機碼路徑:
- HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL11E.LOCALDB\MSSQLServer
在這個機碼路徑下新增以下 3 個字串值 (REG_SZ) 就是我們要加上的「資料庫預設位置」屬性:
- DefaultData (資料)
- DefaultLog (紀錄檔)
- BackupDirectory (備份)
這三個字串值都需要指定一個「目錄路徑」,但因為 LocalDb 的每個執行個體都是以不同使用者身分執行,所以你要設定的這個目錄必須是「本機所有使用者」都能夠存取的目錄才有意義,整台電腦最沒問題的目錄當然也就是「系統暫存目錄」,也就是 C:\Windows\Temp 目錄,所以本文章會以此目錄當作設定的範例,你當然也可以指定到其他目錄。
新增機碼最簡單的解決方法,就是直接執行以下三行指令,請先進入「命令提示字元」並執行下列指令:
REG ADD "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL11E.LOCALDB\MSSQLServer" /v BackupDirectory /t REG_SZ /d "C:\Windows\Temp" /F
REG ADD "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL11E.LOCALDB\MSSQLServer" /v DefaultData /t REG_SZ /d "C:\Windows\Temp" /F
REG ADD "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL11E.LOCALDB\MSSQLServer" /v DefaultLog /t REG_SZ /d "C:\Windows\Temp" /F
機碼新增完成後若使用 regedit 工具看到的畫面如下:

設定完成後,所有還原資料庫的問題也都將迎刃而解,日後使用「還原資料庫」功能時將跟以往使用 Management Studio 的經驗完全一致,只是唯一要注意的事情就是:你日後建立資料庫時的「資料庫預設路徑」將會置於你所指定的目錄下,可別找不到了!
相關連結