The Will Will Web

記載著 Will 在網路世界的學習心得與技術分享

將 SQLEXPRESS 從 SQL 2005 升級 SQL 2008 的注意事項

像我從 Visual Studio 2008、Visual Studio 2008 SP1、Visual Studio 2010 一直到現在的 Visual Studio 2010 SP1 一路升級上來,在眾多開發工具與開發環境裡有個軟體的版本一直不會變,那就是開發工具內建的 SQLEXPRESS 執行個體,如果你一開始安裝了Visual Studio 2008 就會預設先安裝好 SQL Server 2005 Express Edition 進去,之後升級 Visual Studio 並不會連帶升級 SQLEXPRESS 執行個體的版本,若你單純的想移除 SQLEXPRESS 後改裝新版會引發一些不必要的錯誤,這裡我整理了些問題與注意事項供各位參考。

以下是一些常見問題:

1. 若資料庫不升級,專案無法執行或進行偵錯,因為資料庫版本比資料庫執行個體來的新

由於許多國外的程式範例為了部署方便,都會把 SQL Server 資料庫直接放在 App_Data 目錄下,但是如果資料庫版本為 SQL Server 2008 建立的,或已經將資料庫版本升級至 SQL Server 2008 的話,你的 SQLEXPRESS 又剛好還沒手動升級,那麼將會導致專案無法執行的問題,常見的錯誤訊息是:

無法開啟資料庫 'OOOO',因為版本為 655。這個伺服器支援 611 及更早的版本。不支援降級路徑。

資料庫 'OOOO' 中 'OOOO' 的指令碼層級無法從 655 降級至這個伺服器所支援的 611。這通常意味著已附加未來資料庫,而且目前的安裝不支援此降級路徑。請安裝較新版本的 SQL Server,然後再次嘗試開啟資料庫。

以下是已知的各 SQL Server 所用的資料庫版本號:

  • SQL Server 2005     :database version 611
  • SQL Server 2008     :database version 655
  • SQL Server 2008 R2:database version 661

請注意:已升級的資料庫是無法降級的,詳情請參考德瑞克大人的 SQL Server 2008 R2 版本的資料庫,無法在 SQL Server 2008 版本上使用;Error 948 The database 'xxx' cannot be opened because it is version 661. This server supports version 655 and earlier. A downgrade path is not supported. 以及 使用「資料庫發行精靈」:Visual Studio 2008、SQL Server 2008、SQL Database Publishing Wizard 這兩篇文章。

2. 無法使用「使用者執行個體 (User Instance)」功能

當你簡單的將 SQLEXPRESS 這個資料庫執行個體移除,然後重裝 SQL Server 2008 Express Edition,預設是不啟用使用者執行個體的,否則會在執行的時候會出現以下錯誤訊息:

由於無法啟動使用者執行個體的處理而無法產生 SQL Server 的使用者執行個體。此連接將會關閉。

這個問題也可利用 SQL Server Express Utility (SSEUtil) 工具進行檢測,隨便選一個在 App_Data 下的資料庫,並且用以下指令嘗試將資料庫掛載起來試試:
       
C:\Inetpub\wwwroot\App_Data>SSEUtil -a SiteDb.mdf

只要執行結果呈現 Command completed successfully. 就代表正常。

3. 資料庫無法連接上

我們開發資料庫應用不見得都是用 使用者執行個體 (User Instance) 的方式在運行,也有可能直接透過 TCP/IP 的方式作連接,遇到這種情況通常都是因為沒有開啟 TCP/IP 通訊協定沒有啟用 SQL Server Browser 服務所致,當然你也可以設定 SQLEXPRESS 固定監聽(LISTEN)特定的埠號 (例如: 51433) 也可以不用啟用 SQL Server Browser 服務,但使用非預設的 1433 不好需要有些注意的地方,有興趣可參考我的另一篇文章:SQL Server 透過 TCP/IP 遠端連線時如何使用非 1433 埠號

4. 資料庫登入失敗

這問題也挺常見的,通常是因為你在安裝 SQL Server 的過程中沒有選取支援 SQL Server 驗證方式,這我們通常會在安裝過程中就先啟用,當然事後開啟 SQL Server 驗證也是可行的。

 

以下是我整理起來的 SQLEXPRESS 升級步驟:

1. 移除現有的 SQLEXPRESS 執行個體 (Instance)

直接從控制台的「新增移除程式」移除 Microsoft SQL Server 2005,移除過程中要選取 SQLEXPRESS 執行個體,即可順利移除。

2. 移除 %LOCALAPPDATA%\Microsoft\Microsoft SQL Server Data\SQLEXPRESS 目錄

如果你在 SQL Server 2005 的時候有曾經使用過使用者執行個體功能,會有一些暫存的資料庫檔案在這個目錄裡,但此目錄會影響 SQL Server 2008 SP2 Express Edition 的運作,因此必須先行刪除才能讓新版的 SQLEXPRESS 執行個體正常執行。

3. 下載與安裝 Microsoft SQL Server 2008 SP2 Express Edition Service Pack 2

下載並安裝 Microsoft SQL Server 2008 SP2 Express Edition Service Pack 2 版本,此版本有三個安裝檔,要記得選對版本進行安裝:

  • SQLEXPR_x64_CHT.exe           原生支援 64 位元 x64 版本
  • SQLEXPR_x86_CHT.exe           同時支援 32 位元和 64 位元 (WoW)
  • SQLEXPR32_x86_CHT.exe        原生支援 32 位元 x86 版本

§ 若開發環境需用到 SQL Server 驗證方式,請記得在開發過程中可以順便開啟並設定預設的 sa 密碼。

4. 啟用 User Instance (使用者執行個體) 功能

安裝好新版 SQLEXPRESS 之後可以使用 Management Studio 連進 .\SQLEXPRESS 執行個體,並執行以下 T-SQL 指令啟用 User Instance (使用者執行個體) 功能:

EXEC sp_configure 'show advanced option', '1' 
GO 
RECONFIGURE WITH OVERRIDE 
GO 
EXEC sp_configure 'user instances enabled', 1
GO 
RECONFIGURE WITH OVERRIDE 
GO

5. 手動啟用 SQL Server 驗證功能 (如果安裝過程中忘記啟用的話)

使用 Management Studio 連進 .\SQLEXPRESS 執行個體,在伺服器節點按滑鼠右鍵選取屬性:

在「安全性」頁籤如下圖設定到 SQL Server 與 Windows 驗證模式

或可執行以下 T-SQL 指令也能快速啟用 SQL Server 驗證:

USE [master]
GO
EXEC xp_instance_regwrite 
    N'HKEY_LOCAL_MACHINE', 
    N'Software\Microsoft\MSSQLServer\MSSQLServer', 
    N'LoginMode', REG_DWORD, 2
GO

變更完設定後需要重新啟動 SQL Server 才會生效:

6. 使用「SQL Server 組態管理員」啟用 TCP/IP 通訊協定與重新啟動服務

請點進 [SQL Server 網路組態] / [SQLEXPRESS 的通訊協定],並設定 TCP/IP 服務為「已啟用」。

最後重新啟動 SQL Server (SQLEXPRESS) 服務即可大功告成:

相關連結