天天看點

微軟ASP.NET網站部署指南(10):遷移至SQL Server

1.  綜述

第2章的部署SQL Server Compact和第9章的部署資料庫更新裡解釋了為什麼終于要更新到完整版SQL Server 。本章節将告訴你怎樣來做。

SQL Server Express和完整版SQL Server

一旦你決定使用完整版SQL Server。你須要在開發和測試環境使用SQL Server Express 或者完整版SQL Server。在工具支援和資料庫引擎功能上,SQL Server Compact 和其他版本号的SQL Server都是有差别的,能夠導緻不同的代碼産生不同的結果。

通常在開發和測試環境(本機)是選擇SQL Server Express,由于它是免費的,并且随Visual Studio一起預設安裝的。和SQL Server Compact不一樣, SQL Server Express和完整版SQL Server的資料庫引擎是一樣的。也就是說再SQL Server Express測試的結果和在生産環境完整版SQL Server上測試的結果是一樣的。完整版SQL Server的工具大部分都能夠在SQL Server Express上用(除了SQL Server Profiler)。

并且SQL Server Express也完整地支援存儲過程。視圖,觸發器,複制功能。

(因為虛拟主機一般都不支援SQL Server Express,是以生産環境你須要使用完整版的SQL Server。)

合并資料庫

在Contoso University程式裡有2個SQL Server Compact資料庫。一個是membership 資料庫(aspnet.sdf),另一個是程式資料庫(School.sdf)。遷移的時候你能夠将它們繼續保持2個資料庫。也能夠合并成一個資料庫。為了使用友善,你可能想讓2個庫合并在一起,另一個原因是虛拟主機提供商。一個賬戶可能僅僅同意建立一個資料庫,本教程用的提供商就是這種。

在本章節,你能夠安裝例如以下方式遷移你的資料庫:

    在開發和測試環境遷移到2個SQL Server Express資料庫

    在生産環境遷移到一個完整版的資料庫

提醒:假設依據本章節所做的操作出現錯誤資訊或一些功能不正常的話。請務必check Troubleshooting頁面。

2.  為測試環境建立SQL Server Express資料庫

向測試環境部署QL Server Express資料庫之前,你須要手工建立這些資料庫。但不須要手工建立表和插入資料,Web Deploy會自己主動幫你做這些工作。

從Viewbutton選擇Server Explorer,右鍵Data Connections然後選擇Create New SQL Server Database。

在Create New SQL Server Database對話框的Server name框裡輸入".\SQLExpress",在New database name 框裡輸入"aspnetTest",然後确定OK。

微軟ASP.NET網站部署指南(10):遷移至SQL Server

用相同的步驟建立"SchoolTest"資料庫。(使用Test字尾,是由于開發環境和測試環境在一個機器上。我們須要讓不同的資料庫執行在不同的執行個體上。)

Server Explorer裡顯示了建立的2個資料庫。

微軟ASP.NET網站部署指南(10):遷移至SQL Server

3.  為新資料庫建立授權腳本

開發機的IIS上執行程式的時候,訪問資料庫使用的是預設應用程式池。

可是。預設的應用程式池認證是沒有權限打開資料庫的。是以須要執行一個授權腳本來授權。本小節,你須要建立這個腳本。過後執行它以便在IIS上執行的時候能打開資料庫。

在解決方式的SolutionFiles目錄裡,建立一個Grant.sql檔案,複雜以下的代碼到該檔案裡,儲存并關閉:

IF NOT EXISTS (SELECT name FROM sys.server_principals WHERE name = 'IIS APPPOOL\DefaultAppPool')
BEGIN
    CREATE LOGIN [IIS APPPOOL\DefaultAppPool]
      FROM WINDOWS WITH DEFAULT_DATABASE=[master],
      DEFAULT_LANGUAGE=[us_english]
END
GO

CREATE USER [ContosoUniversityUser]
  FOR LOGIN [IIS APPPOOL\DefaultAppPool]
GO

EXEC sp_addrolemember 'db_datareader', 'ContosoUniversityUser'
GO

EXEC sp_addrolemember 'db_datawriter', 'ContosoUniversityUser'
GO      

(注:本腳本是用在本教程的環境上,Win7+IIS+SQL2008。假設你使用不同的SQL版本号,請參看聯機叢書)

4.  為測試環境配置資料庫部署

前面部署資料庫的設定不過複雜檔案到App_Data檔案夾裡,如今要使用SQL腳本,而且在目标資料庫執行才行。實際上,Web Deploy幫你做的就是下邊每一個資料庫的部署:

  1. 建立一個SQL腳本,用于向目标庫裡建立庫結構(表,列。限制等等)
  2. 建立一個SQL腳本,用于向目标庫插入資料庫
  3. 在目标庫裡執行這些腳本

測試環境改動配置設定。打開Project Properties窗體,選擇Package/Publish Web頁籤,然後在Configuration下拉菜單裡選擇Active (Test)或Test。

確定選擇了Exclude files from the App_Data folder項,Web Deploy會讀取App_Data檔案夾下的.sdf檔案。然後在SQL Server Express資料庫裡建立表和對應的資料,可是不須要将他們複雜到目标網站。

確定選擇了Include all databases configured in Package/Publish SQL項, The Package/Publish SQL頁籤就是你配置SQL Server Express設定的地方。

雖然選擇了這個checkbox。可是由于你在Package/Publish SQL頁籤沒選擇不論什麼一個資料庫。是以沒有不論什麼影響。

微軟ASP.NET網站部署指南(10):遷移至SQL Server

選擇Package/Publish SQL頁籤,設定build配置為Test,點選Import from Web.config。

微軟ASP.NET網站部署指南(10):遷移至SQL Server

Visual Studio會自己主動查找Web.config檔案的連接配接字元串。找到了 membership 資料庫和School資料庫,而且在Database Entries表裡加入了2行記錄。

下一步要做的就是怎樣部署這些資料庫, Database Entries表以下的Database Entry Details 面闆會顯示具體的資訊,每選擇一個資料庫。以下都會顯示該資料庫的部署配置資訊。

微軟ASP.NET網站部署指南(10):遷移至SQL Server

配置Membership 資料庫的部署設定

Database Entries裡選擇DefaultConnection-Deployment行。以便顯示membership庫的配置資訊。

在Connection string for destination database裡輸入新SQL Server Express membership資料庫的連接配接字元串(你能夠通過Server Explorer-> Data Connections-> aspnetTest-> Properties窗體裡的Connection

String來擷取)。

微軟ASP.NET網站部署指南(10):遷移至SQL Server

複制連接配接字元串到Package/Publish SQL 頁籤裡的Connection string for destination database 框裡。

Data Source=.\SQLExpress;Initial Catalog=aspnetTest;Integrated Security=True;Pooling=False      

確定選擇了Pull data and/or schema from an existing database項,它會生産腳本以便在目标資料庫自己主動建立。

 Connection string for the source database值是從Web.config檔案中擷取的,指向是開發用的SQL Server Compact資料庫,他是用來生産腳本,然後在目标庫執行的。由于是要部署生産環境資料庫,是以要把名字從"aspnet-Dev.sdf"改成"aspnet-Prod.sdf"。

将Database scripting options從Schema Only改成Schema and data。由于你的資料(測試賬戶)也須要部署到新庫裡。

另外,你自己建立的賦權腳本也須要執行,在Database Scripts框裡點選Add Script,然後在Select File對話框裡選擇你建立的Grant.sql。然後點選Open。

微軟ASP.NET網站部署指南(10):遷移至SQL Server

完畢以後,Database Entries表裡的DefaultConnection-Deployment的設定應該是這種:

微軟ASP.NET網站部署指南(10):遷移至SQL Server

配置School 資料庫的部署設定

接下來。選擇SchoolContext-Deployment行。以配置School資料庫。

相同的方式須要設定連接配接字元串到Connection string for destination database 框裡。

Data Source=.\SQLExpress;Initial Catalog=SchoolTest;Integrated Security=True;Pooling=False      

確定選擇了Pull data and/or schema from an existing database項。

Connection string for the source database值是從Web.config檔案中擷取的,指向是開發用的SQL Server Compact資料庫。他是用來生産腳本。然後在目标庫執行的。由于是要部署生産環境資料庫,是以要把名字從" School -Dev.sdf"改成" School -Prod.sdf"。

改動Database scripting options為Schema and data。

也須要為資料庫賦予讀寫權限。是以也須要加入Grant.sql腳不能檔案。

完畢以後,Database Entries表裡的SchoolContext -Deployment的設定應該是這種:

微軟ASP.NET網站部署指南(10):遷移至SQL Server

最後。在Package/Publish SQL頁籤上儲存改動。

為賦權腳本設定Transacted Mode

部署過程中,會自己主動生産腳本以便部署schema和資料。預設情況下。這些腳本是在一個事務裡執行的。但自己定義的腳本(想賦權腳本)預設不在事務裡執行。假設部署存在混合事務模式的話,就有可能出現逾時的情況,,本章節将指導你怎樣設定自己定義腳本檔案也在一耳光事務裡執行。

在Solution Explorer,右鍵ContosoUniversity項目,選擇Unload Project。

微軟ASP.NET網站部署指南(10):遷移至SQL Server

然後又一次右鍵該項目,選擇Edit ContosoUniversity.csproj。

微軟ASP.NET網站部署指南(10):遷移至SQL Server

Visual Studio編輯器會顯示項目檔案的XML内容。注意到裡面有非常多PropertyGroup元素(下圖裡省略了一些)。

微軟ASP.NET網站部署指南(10):遷移至SQL Server

第一個沒有

Condition

 實作,它的設定和build配置無關。另外幾個。有一個是Debug用的,一個是 Release用的,另外一個是Test用的,注意到。Test的這個

PropertyGroup

 元素裡面。有個元素叫

PublishDatabaseSettings

。是

你在Package/Publish SQL頁籤裡設定的内容:

微軟ASP.NET網站部署指南(10):遷移至SQL Server

注意到上圖示記的紅色框。在Object裡的Source元素是指向了你配置的自己定義檔案,他的Transacted屬性值是False,這個就是設定事務模式的,你須要将它設定為True。設定應該是這種:

微軟ASP.NET網站部署指南(10):遷移至SQL Server

儲存關閉項目檔案。然後右鍵解決方式裡的項目。選擇又一次Reload Project。

微軟ASP.NET網站部署指南(10):遷移至SQL Server

5.  為測試庫的連接配接字元串建立Web.Config Transform

Package/Publish SQL 裡為SQL Express資料庫設定的連接配接字元串僅僅是為Web Deploy更新目标資料庫用的,程式用到的連接配接字元串還是須要在Web.config檔案中又一次設定的(通過之前将的Transform)。

打開Web.Test.config檔案。connectionStrings元素替換成例如以下代碼:

<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
  <connectionStrings>
    <add name="DefaultConnection"
         connectionString="Data Source=.\SQLExpress;Initial Catalog=aspnetTest;Integrated Security=True;Pooling=False;MultipleActiveResultSets=True"
         providerName="System.Data.SqlClient"
         xdt:Transform="SetAttributes" xdt:Locator="Match(name)"/>
    <add name="SchoolContext"
         connectionString="Data Source=.\SQLExpress;Initial Catalog=SchoolTest;Integrated Security=True;Pooling=False;MultipleActiveResultSets=True"
         providerName="System.Data.SqlClient"
         xdt:Transform="SetAttributes" xdt:Locator="Match(name)"/>
  </connectionStrings>
  <!-- appSettings element, comments, and system.web element -->
</configuration>      

終于部署結果是在Web.config 裡。connectionString元素裡每一個add元素的providerName屬性被替換成上述代碼。這個和Package/Publish SQL頁籤裡的是不一樣的。另外字元串裡加入上MultipleActiveResultSets=True,是由于這是Entity Framework和Universal Providers所必須的設定。

6.  部署到測試環境

如今已經準備好開始部署到測試環境了。

在Solution Configurations下拉框裡選擇Test,Publish profile裡選擇Test,然後點選Publish Web。(假設你自己定義了你的Visual Studio使這些工具欄的這些設定不能用的話,請參考第8章的内容)

微軟ASP.NET網站部署指南(10):遷移至SQL Server

Visual Studio部署了改動後的程式,并在Output窗體顯示了成功資訊。

微軟ASP.NET網站部署指南(10):遷移至SQL Server

執行程式。又一次測試,加入一個student來驗證資料庫更新操作十分正常,再訪問Update Credits頁面(須要登入)來驗證membership資料庫是否工作正常。

7.  為生産環境建立SQL Server資料庫

測試環境部署并測試以後。能夠向生産環境部署了。注意本章節前面的内容提到了Cytanium 僅僅同意建立執行一個資料庫。是以我們須要将2個資料庫的全部内容都合并到一個新的資料庫裡。

進入Cytanium控制台。滑鼠移動到Databases上,然後選擇SQL Server 2008。

微軟ASP.NET網站部署指南(10):遷移至SQL Server

在SQL Server 2008頁面,點選Create Database。

輸入資料庫名為"School"然後點選Save儲存。

程式自己主動加入contosou字首,是以你的真正資料庫名字是contosouSchool。

微軟ASP.NET網站部署指南(10):遷移至SQL Server

同一頁面。點選Create User,在Cytanium'sserver上建立的是混合賬戶。而不是平時用到的系統內建賬戶。你須要改動Web.config檔案的連接配接字元串裡的賬戶資訊。這個步驟,你将建立一個使用者。

微軟ASP.NET網站部署指南(10):遷移至SQL Server

在SQL User Properties 頁面輸入必填項:

    輸入username: ContosoUniversityUser

    輸入password:Pas$w0rd.

選擇contosouSchool作為預設資料庫

選擇contosouSchool check box

微軟ASP.NET網站部署指南(10):遷移至SQL Server

8.  為生産環境建立配置資料庫部署

如今能夠來想配置測試環境一樣。來設定Package/Publish Web和Package/Publish SQL裡的參數了。

打開Project Properties窗體,選擇Package/Publish Web頁籤,然後在Configuration下拉菜單裡選擇Active (Release)或Release。

確定選擇了Exclude files from the App_Data folder項.,資料庫部署不須要複制App_Data目錄裡的内容,不過在目标庫生成并執行腳本。

確定選擇了Include all databases configured in Package/Publish SQL tab項。

選擇Package/Publish SQL頁籤。設定build配置為Release。和測試環境一樣點選Import from Web.config。

能夠看到2行記錄被加入到Database Entries表裡了。

在為每一個資料庫設定部署參數的時候,與測試環境的設定唯一不同的是:測試環境須要設定2個不同的連接配接字元串。而生成環境須要設定同樣的連接配接字元串。由于它們是被部署到一個生成環境資料庫上的。

配置Membership 資料庫部署設定

選擇Database Entries 表裡的DefaultConnection-Deployment 行來設定membership 資料庫的部署資訊。

在Connection string for destination database裡輸入運作剛剛建立的生成環境資料庫的連接配接字元串資訊(你能夠從歡迎郵件裡得到)。郵件裡的位址和以下的類似:

Data Source=vserver01.cytanium.com;Initial Catalog={myDataBase};User Id={myUsername};Password={myPassword};      

替換3個變量以後,字元串變成了:

Data Source=vserver01.cytanium.com;Initial Catalog=contosouSchool;User Id=ContosoUniversityUser;Password=Pas$w0rd;      

複制connection string到Package/Publish SQL裡的Connection string for destination database裡。

確定選擇了Pull data and/or schema from an existing database項

Connection string for the source database值是從Web.config檔案擷取的,指向了App_Data檔案夾下的SQL Server Compact資料庫,改動aspnet-Dev.sdf為aspnet-Prod.sdf。

Database scripting options項改動為Schema and data。

完畢以後,DefaultConnection-Deployment的設定應該是這種:

接下來。選擇SchoolContext-Deployment來配置School資料庫的設定。

複制相同的connection string(在上面membership設定裡)到Connection string for destination database。

確定選擇了Pull data and/or schema from an existing database項,Connection string for the source database的值是從Web.config檔案擷取的。 指向的是開發庫。改動School-Dev.sdf為School-Prod.sdf。

完畢以後,SchoolContext-Deployment的設定應該是這種:

微軟ASP.NET網站部署指南(10):遷移至SQL Server

儲存Package/Publish SQL 頁籤上的改動。

9.  為生産庫的連接配接字元串建立Web.Config Transform

為了讓Web.config裡的資料庫連接配接位址指向新的生産環境資料庫,你改動又一次設定Web.config的transfermation。

連接配接位址和Package/Publish SQL頁籤裡的位址是差點兒一樣的。唯一的差别是加入了一個MultipleResultSets選項。

打開Web.Release.config替換例如以下的内容到connectionStrings元素節點:

<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
  <connectionStrings>
    <add name="DefaultConnection"
         connectionString="Data Source=vserver01.cytanium.com;Initial Catalog=contosouSchool;User Id=ContosoUniversityUser;Password=Pas$w0rd;MultipleActiveResultSets=True"
         providerName="System.Data.SqlClient"
         xdt:Transform="SetAttributes" xdt:Locator="Match(name)"/>
    <add name="SchoolContext"
         connectionString="Data Source=vserver01.cytanium.com;Initial Catalog=contosouSchool;User Id=ContosoUniversityUser;Password=Pas$w0rd;MultipleActiveResultSets=True"
         providerName="System.Data.SqlClient"
         xdt:Transform="SetAttributes" xdt:Locator="Match(name)"/>
  </connectionStrings>
  <!-- appSettings element, comments, and system.web element -->
</configuration>      

有時候,你能夠看到一些建議。要對Web.config 檔案中的connection strings進行加密。那是由于你的server是放在自己公司裡的,部署到虛拟主機上話,你要充分信任主機提供商的安全保護能力呦。

10.    部署到生産環境

如今能夠向生産環境部署了,部署過程将讀取App_Data 目錄下的SQL Server Compact 資料庫檔案,然後在生産環境資料庫裡又一次建立全部的表和資料。

在部署之前。確定上傳了app_offline.htm檔案,原因參考第7章内容。

首先要通過Cytanium 控制台裡的File Manager 功能将aspnet-Prod.sdf和School-Prod.sdf備份到開發環境裡的App_Data檔案夾。確定再次向生産環境部署的資料是最新的。

在Solution Configurations下拉框裡選擇Release,Publish profile裡選擇Release,然後點選Publish Web。

(假設你自己定義了你的Visual Studio使這些工具欄的這些設定不能用的話,請參考第8章的内容)

Visual Studio部署了改動後的程式。并在Output窗體顯示了成功資訊。

微軟ASP.NET網站部署指南(10):遷移至SQL Server

測試之前。須要先删除app_offline.htm檔案。與此同一時候也能夠删除App_Data檔案夾下的sdf檔案。

執行程式,又一次測試,加入一個student來驗證資料庫更新操作十分正常。再訪問Update Credits頁面(須要登入)來驗證membership資料庫是否工作正常。

11.    開發環境切換到SQL Server Express

綜述裡介紹的内容。開發的時候最好使用和測試、生産環境相同的資料庫(還記得上面說的SQL Server Express和完整版SQL Server是一樣功能麼?)。本小節我們将設定ContosoUniversity項目使用SQL Server Express。

最簡單的方式是讓Code First和membership system來幫你建立新資料庫:

n  改動connection strings來指定新的SQL Express資料庫

n  同意程式, Code First會自己主動建立程式資料庫

n  點選登入,并注冊一個測試賬戶,ASP.NET membership系統會自己主動幫你建立membership資料庫

隻是,假設你有非常多測試賬戶須要建立的話,你肯定不想手工輸入。能夠将SQL Server Compact的資料遷移到SQL Server Express閃個。假設你想這麼做,那請繼續,假設不想這麼多。請忽略這一章節,繼續訪問:為Web.config檔案更新Connection String。

建立開發環境Membership資料庫

從View菜單選擇Server Explorer,右鍵Data Connections選擇Create New SQL Server Database。

在Create New SQL Server Database對話框, Server name 裡輸入.\SQLExpress,New database name框裡輸入aspnetDev,點選OK确定。

配置資料庫部署

如今須要為新資料庫配置部署設定了,無需改動如今有的測試環境設定,你能夠建立一個新的Build配置,以Test Build配置為基礎取名為MigrateToSQLExpress。

從Visual Studio的Build菜單,選擇Configuration Manager彈出Configuration Manager對話框:

微軟ASP.NET網站部署指南(10):遷移至SQL Server

在Active solution configuration框裡選擇New,New Solution Configuration 對話框出現以後,為新build配置輸入新名稱MigrateToSQLExpress,然後選擇從Test複制設定。

選擇Create new project configurations點選OK。

微軟ASP.NET網站部署指南(10):遷移至SQL Server

打開Project Properties窗體,選擇Package/Publish Web頁籤。Configuration下拉框裡選擇Active (MigrateToSQLExpress),選擇Exclude files from the App_Data folder并確定選中Include all databases configured

in Package/Publish SQL tab。

選擇Package/Publish SQL頁籤,設定build配置為Active(MigrateToSQLExpress),點選Import from Web.config。

在Database Entries表裡,取消選擇SchoolContext-Deployment(由于不須要部署School資料庫)。然後選擇DefaultConnection-Deployment來配置membership 資料庫的設定。

在Connection string for destination database裡,輸入以下列出的connection string,它指向你剛為開發環境建立的新SQL Server Express membership資料庫。

Data Source=.\SQLExpress;Initial Catalog=aspnetDev;Integrated Security=True;Pooling=False;      

確定選擇了Pull data and/or schema from an existing database項,

 Connection string for the source database的值來自Web.config檔案。它指向原來的開發環境SQL Server Compact membership資料庫。

将Database scripting options 的項從Schema Only改動為Schema and Data。

微軟ASP.NET網站部署指南(10):遷移至SQL Server

儲存Package/Publish SQL裡的改動。

部署到測試環境

Solution Configurations下拉框裡選擇MigrateToSQLExpress build配置, Publish profile下拉框裡選擇Test,然後點選Publish Web。

微軟ASP.NET網站部署指南(10):遷移至SQL Server

改動Web.config 裡的Connection Strings

打開Web.config檔案。替換以下的代碼到connectionStrings元素節點:

<connectionStrings>
  <add name="DefaultConnection" connectionString="Data Source=localhost\SQLExpress;Initial Catalog=aspnetDev;Integrated Security=True;Pooling=False;MultipleActiveResultSets=True;" providerName="System.Data.SqlClient"/>
  <add name="SchoolContext" connectionString="Data Source=localhost\SQLExpress;Initial Catalog=SchoolDev;Integrated Security=True;Pooling=False;MultipleActiveResultSets=True;" providerName="System.Data.SqlClient"/>
</connectionStrings>      

Control-F5執行,和測試、生産環境一樣,加入一個student驗證資料庫能否正常工作。

假設依照上面的步驟遷移了使用者資料,訪問Update Credits頁面來驗證部署是否正确,假設沒有的話,建立一個administrator賬戶然後訪問Update Credits頁面來驗證。

12.    清除SQL Server Compact檔案

如今,不在須要支援SQL Server Compact 的資料庫檔案和NuGet包了。假設你原因,能夠删除這些不必要的檔案(不強求)。

在Solution Explorer裡删除App_Data檔案夾下的.sdf檔案(amd64和x86子檔案夾)。

在Solution Explorer裡,右鍵ContosoUniversity項目選擇Add Library Package Reference。在Add Library Package Reference對話框裡選擇EntityFramework.SqlServerCompact包并點選Uninstall。

微軟ASP.NET網站部署指南(10):遷移至SQL Server

解除安裝成功以後,相同的方式也解除安裝SqlServerCompact包(必須解除安裝,由于EntityFramework.SqlServerCompact依賴于它)。

相同的步驟,删除ContosoUniversity.DAL項目裡的這2個包。

最後,能夠MigrateToSqlExpress Build配置了,由于它不過為遷移資料而準備的。

Build菜單裡選擇Configuration Manager,在彈出的Configuration Manager對話框裡。Active solution configuration下拉菜單裡選擇Edit,在Edit Solution

Configurations對話框裡選擇MigrateToSQLExpress,然後點選Remove。