The Will Will Web

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

如何利用「資料庫發行精靈」將新版 SQL 資料庫降級成舊版

不知道各位有沒有遇過一種狀況,那就是原本 SQL Server 2005 的資料庫,將資料庫卸離 (Detach) 後丟進新版的 SQL Server 版本掛載 ( 例如 SQL 2008 或 SQL 2008 R2 ),然後突然間有同事說他的資料庫是舊版的,而你怎樣都再也無法將資料庫卸離後掛載到舊版的 SQL Server 了?!這問題似乎不是很多人知道怎樣處理,今天特別撰文說明整個轉移資料庫的流程,而且此功能已經內建於 Visual Studio 2010 之中,使用上非常方便,只是若沒人提起這功能,自己要找到這功能還真有點困難。^^

資料庫發行精靈 (Database Publishing Wizard) 其實從 Visual Studio 2005 的時候就有了,只是當時並沒有內建於 Visual Studio 2005 之中,當時的版本為 SQL Server Database Publishing Wizard 1.1 需額外下載才能使用。

之後到了 Visual Studio 2008 便內建在開發工具裡,而且不再另外提供下載連結,這時的版本為 SQL Server Database Publishing Wizard 1.2 版,其工具所在目錄為 C:\Program Files (x86)\Microsoft SQL Server\90\Tools\Publishing\1.2\SqlPubWiz.exe 

接著到了 Visual Studio 2008 SP1 又推出了更新版為 SQL Server Database Publishing Wizard 1.3 版,不過該工具由於是直接從 Visual Studio 2008 升級上去的關係,所以此版本的安裝路徑還是跟之前的 1.2 版一樣,在 C:\Program Files (x86)\Microsoft SQL Server\90\Tools\Publishing\1.2 目錄裡,關於版本號可以從控制台的新增與移除程式理看得到:

如果你沒有安裝 Visual Studio 2008 卻又想要安裝 SQL Server Database Publishing Wizard 1.3 版的話,微軟是有提供下載連結的:http://go.microsoft.com/fwlink/?LinkId=119368

目前的最新版為 SQL Server Database Publishing Wizard 1.4 版,並內建於 Visual Studio 2010 之中 ( 註: 我找不到有可獨立下載的地方 ),其安裝好之後的程式所在路徑為 C:\Program Files (x86)\Microsoft SQL Server\90\Tools\Publishing\1.4\SqlPubWiz.exe

編按:這資料庫發行精靈的歷史我研究了好久,說真的我也不知道我研究這歷史要幹嘛,就是覺得要介紹這工具不知道有點怪,然後花了些時間研究,不寫出來還不太甘心,哈~ XD

講述完資料庫發行精靈的歷史之後,接下來就開始講解使用的方法,這個資料庫發行精靈雖然是個 精靈 (Wizard),可以透過 Visual Studio 2010 啟動或直接執行 SqlPubWiz.exe 啟動該程式,並透過視窗介面一步步操作即可完成,使用上並不複雜,但此工具同時還能當成指令列工具才操作,可透過批次檔自動化一些資料庫發行的相關自動化作業。

以下我用三種情境跟各位說明如何使用此工具:

1. 透過 SqlPubWiz.exe 程式啟動

前段文章的說明之中有提到 SqlPubWiz.exe 程式的所在路徑為 C:\Program Files (x86)\Microsoft SQL Server\90\Tools\Publishing\1.4\ 目錄,因此可以透過檔案總管進入該目錄後直接用滑鼠雙擊 SqlPubWiz.exe 來啟動程式。

點開後第一步是先指定來源伺服器的連線資訊,你可以透過連接字串或直接指定伺服器資訊進行連結:

第二步為選取該伺服器中的資料庫,並且要勾選「為選取資料庫中的所有物件編寫指令碼」,此選項預設為勾選。

第三步為指定編寫後的指令要儲存在哪個檔案,需指定完整檔案路徑:

第四步非常重要,由於我們的目的是為了要將資料庫降級,例如將 SQL Server 2008 R2 的資料庫降級到 SQL Server 2005,這時你就必須選取四當的目標資料庫版本,透過資料庫發行精靈就會幫你產生適當的 T-SQL 指令碼方便你建立適當的資料庫。

第四步除此之外還有的重點,那就是可以設定要發行的資料類型,預設選取為「結構描述和資料」,也代表著最後產生出來的指令碼不僅僅是資料庫中的物件編碼(DDL)而已,還包含改資料庫中完整的資料,並且以 INSERT INTO 的方式,完全用 T-SQL 來表示資料的內容。

最後確認一下設定資料後按下完成,資料庫發行精靈就會立即產生指令碼

最後,你只要拿著這份 T-SQL 指令檔 ( 以上圖的例子就是 G:\Temp\AdventureWorksLT.sql 這個檔案 ) 到目的資料庫 ( SQL 2005 ) 執行,就可以建立一個完全相同規格且完全相同資料的資料庫起來了!

 

2. 透過 Visual Studio 2010 啟動

如下圖示,先開啟伺服器總管視窗,你在資料連接裡應該已經建立好一些常用的資料庫連線,你可以在任意一個資料連接的項目上按下滑鼠右鍵選取 Publish to provider 項目:

image

由於在資料連接裡已經包含了連線參數,因此資料庫發行精靈啟動後會省去第一個連接資料庫的步驟,直接連接到該伺服器,並讓你選取資料庫:

剩下的步驟就一模一樣了,因此不再贅述。

 

3. 在命令提示字元下使用 SqlPubWiz.exe 程式

先開啟命令提示字元視窗,並 CD 進入 C:\Program Files (x86)\Microsoft SQL Server\90\Tools\Publishing\1.4 目錄。

我們可以先輸入 SqlPubWiz.exe help script 查詢使用方法:

使用方式:

sqlpubwiz script ( -C connection_string | -d local_database_name ) (output_file) [參數]

參數:

輸出選項:

  [-f] :                       覆寫現有檔案
  [-noschemaqualify] :         輸出指令碼未以結構描述名稱限定物件名稱。
  [-schemaonly] :              僅編寫結構描述的指令碼
  [-dataonly] :                僅編寫資料的指令碼
  [-targetserver] :            指定指令碼應以何種版本的 SQL Server 為目標。
                               有效的版本為 "2000" 和 "2005"。 預設值: 2005
  [-q] :                       隱藏輸出
  [-nodropexisting] :           預設值: False

本機連接相關:

  [-C connection_string] :     連接字串
  [-d local_database_name] :   要編寫指令碼的資料庫名稱
  [-U local_user_name] :       使用者名稱
  [-P local_password] :        密碼
  [-S local_server_name] :     伺服器名稱

 

以下是幾個常用的指令範例:

‧連接到 (local)\SQLEXPRESS 伺服器,將 AdventureWorksLT 資料庫編碼後輸出 (用 Windows 驗證)

SqlPubWiz.exe script -S (local)\SQLEXPRESS -d AdventureWorksLT G:\Temp\AdventureWorksLT.sql

‧連接到 (local)\SQLEXPRESS 伺服器並指定帳號密碼,將 AdventureWorksLT 資料庫編碼後輸出

SqlPubWiz.exe script -S (local)\SQLEXPRESS –U sa –P xxxxx -d AdventureWorksLT G:\Temp\db1.sql

 

相關連結