﻿# 如何還原資料庫到 SQL Server 2012 LocalDB 執行個體

雖然 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 執行個體

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/37fbc7a12c5b130e5b2b-SNAGHTML92b79648.png)

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

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/d68f7a144a43458fdbef-image_1707.png)

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

[![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/6e20f6d32044b04614fb-SNAGHTML92b690ec_thumb.png)](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/eb45799451f5a815fd79-SNAGHTML92b690ec.png)

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

![設定 'Microsoft.SqlServer.Management.Smo.Settings' 無法使用屬性 BackupDirectory。此物件可能沒有此屬性，或因為存取權限不足而無法擷取。 (Microsoft.SqlServer.Smo)](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/1c14bd2395ff8d52b591-SNAGHTML92a79bc4.png)

英文版的錯誤訊息是：**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)**

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/82db25dbd55a2819b023-image_1889.png)

發生這個問題的主因在於 SQL Server 2012 Express LocalDB 並沒有 SQL Server 的**資料庫預設位置**相關屬性，偏偏 SQL Server Management Studio 必須要有這些屬性資料才能正常執行資料庫還原動作，所以才無法完成資料庫還原這個任務。

我們先連到另一台 SQL Server 2008 Developer Edition 的資料庫執行個體，看看執行個體的屬性設定：

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/bfa8ae724c504ff73370-image_1708.png)

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

[![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/542e82110bc07316c97e-SNAGHTML92c67f7e_thumb.png)](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/68bdb59018b29ba574d5-SNAGHTML92c67f7e.png)

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

[![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/bc92283bc899caf32af2-SNAGHTML92c9ffb5_thumb.png)](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/b1970c0969c9f73ce91b-SNAGHTML92c9ffb5.png)

若要解決這個問題，必須修改本機電腦的機碼(Registry)設定，將 LocalDb 缺少的這幾個機碼值補上，就可以透過 SSM 正常使用「資料庫還原」功，以下就是我們要加上的機碼路徑：

-   **HKEY\_LOCAL\_MACHINE\\SOFTWARE\\Microsoft\\Microsoft SQL Server\\MSSQL11E.LOCALDB\\MSSQLServer**

在這個機碼路徑下新增以下 3 個字串值 (REG\_SZ) 就是我們要加上的「資料庫預設位置」屬性：

-   DefaultData       (資料)
-   DefaultLog        (紀錄檔)
-   BackupDirectory   (備份)

這三個字串值都需要指定一個「目錄路徑」，但因為 LocalDb 的每個執行個體都是以不同使用者身分執行，所以你要設定的這個目錄必須是「本機所有使用者」都能夠存取的目錄才有意義，整台電腦最沒問題的目錄當然也就是「系統暫存目錄」，也就是 **C:\\Windows\\Temp** 目錄，所以本文章會以此目錄當作設定的範例，你當然也可以指定到其他目錄。

新增機碼最簡單的解決方法，就是直接執行以下三行指令，請先進入「命令提示字元」並執行下列指令：

```csharp
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 工具看到的畫面如下：

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/b901491fb3b3cabbefa7-SNAGHTML92e17aed.png)

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

**相關連結**

-   [How to restore a database on a Microsoft SQL Server LocalDb instance, based on a \*.bak file.](http://www.roelvanlisdonk.nl/?p=2896),
-   [SQL Server 2012 Express LocalDB (SqlLocalDB) 深入剖析](/post/2012/09/03/SQL-Server-2012-Express-LocalDB-Quick-Start.aspx)
-   [用來還原、復原和管理備份的 RESTORE 陳述式 (Transact-SQL)](http://msdn.microsoft.com/zh-tw/library/ms190372.aspx)
-   SQL Server 無敵手冊 - 2009第二屆iT邦幫忙鐵人賽
-   [Download: Microsoft® SQL Server® 2012 Express - Microsoft Download Center](https://www.microsoft.com/zh-tw/sql-server/sql-server-downloads)
