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会自动帮你做这些工作。
从View按钮选择Server Explorer,右键Data Connections然后选择Create New SQL Server Database。
在Create New SQL Server Database对话框的Server name框里输入".\SQLExpress",在New database name 框里输入"aspnetTest",然后确定OK。
用同样的步骤创建"SchoolTest"数据库。(使用Test后缀,是因为开发环境和测试环境在一个机器上,我们需要让不同的数据库运行在不同的实例上。)
Server Explorer里显示了创建的2个数据库。
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帮你做的就是下边每个数据库的部署:
- 创建一个SQL脚本,用于向目标库里创建库结构(表,列,约束等等)
- 创建一个SQL脚本,用于向目标库插入数据库
- 在目标库里运行这些脚本
测试环境修改配置设置,打开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选项卡没选择任何一个数据库,所以没有任何影响。
选择Package/Publish SQL选项卡,设置build配置为Test,点击Import from Web.config。
Visual Studio会自动查找Web.config文件的连接字符串,找到了 membership 数据库和School数据库,并且在Database Entries表里添加了2行记录。下一步要做的就是如何部署这些数据库, Database Entries表下面的Database Entry Details 面板会显示详细的信息,每选择一个数据库,下面都会显示该数据库的部署配置信息。
配置Membership 数据库的部署设置
Database Entries里选择DefaultConnection-Deployment行,以便显示membership库的配置信息。
在Connection string for destination database里输入新SQL Server Express membership数据库的连接字符串(你可以通过Server Explorer-> Data Connections-> aspnetTest-> Properties窗口里的Connection String来获取)。
复制连接字符串到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。
完成以后,Database Entries表里的DefaultConnection-Deployment的设置应该是这样的:
配置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的设置应该是这样的:
最后,在Package/Publish SQL选项卡上保存修改。
为赋权脚本设置Transacted Mode
部署过程中,会自动生产脚本以便部署schema和数据,默认情况下,这些脚本是在一个事务里运行的,但自定义的脚本(想赋权脚本)默认不在事务里运行,如果部署存在混合事务模式的话,就有可能出现超时的情况,,本章节将指导你如何设置自定义脚本文件也在一耳光事务里运行。
在Solution Explorer,右键ContosoUniversity项目,选择Unload Project。
然后重新右键该项目,选择Edit ContosoUniversity.csproj。
Visual Studio编辑器会显示项目文件的XML内容。注意到里面有很多PropertyGroup元素(下图里省略了一些)。
第一个没有Condition
实现,它的设置和build配置无关,另外几个,有一个是Debug用的,一个是 Release用的,另外一个是Test用的,注意到,Test的这个PropertyGroup
元素里面,有个元素叫PublishDatabaseSettings
,是
你在Package/Publish SQL选项卡里设置的内容:
注意到上图标记的红色框,在Object里的Source元素是指向了你配置的自定义文件,他的Transacted属性值是False,这个就是设置事务模式的,你需要将它设置为True,设置应该是这样的:
保存关闭项目文件,然后右键解决方案里的项目,选择重新Reload Project。
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章的内容)
Visual Studio部署了修改后的程序,并在Output窗口显示了成功信息。
运行程序,重新测试,添加一个student来验证数据库更新操作十分正常,再访问Update Credits页面(需要登录)来验证membership数据库是否工作正常。
7. 为生产环境创建SQL Server数据库
测试环境部署并测试以后,可以向生产环境部署了。注意本章节前面的内容提到了Cytanium 只允许创建运行一个数据库,所以我们需要将2个数据库的所有内容都合并到一个新的数据库里。
进入Cytanium控制面板,鼠标移动到Databases上,然后选择SQL Server 2008。
在SQL Server 2008页面,点击Create Database。
输入数据库名为"School"然后点击Save保存。程序自动添加contosou前缀,所以你的真正数据库名字是contosouSchool。
同一页面,点击Create User,在Cytanium's服务器上创建的是混合账户,而不是平时用到的系统集成账户。你需要修改Web.config文件的连接字符串里的账户信息。这个步骤,你将创建一个用户。
在SQL User Properties 页面输入必填项:
输入用户名: ContosoUniversityUser
输入密码:Pas$w0rd.
选择contosouSchool作为默认数据库
选择contosouSchool check box
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的设置应该是这样的:
配置School 数据库的部署设置
接下来,选择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。
Database scripting options项修改为Schema and data。
完成以后,SchoolContext-Deployment的设置应该是这样的:
保存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进行加密,那是因为你的服务器是放在自己公司里的,部署到虚拟主机上话,你要充分信任主机提供商的安全保护能力呦。
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窗口显示了成功信息。
测试之前,需要先删除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对话框:
在Active solution configuration框里选择New,New Solution Configuration 对话框出现以后,为新build配置输入新名称MigrateToSQLExpress,然后选择从Test复制设置。选择Create new project configurations点击OK。
打开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。
保存Package/Publish SQL里的修改。
部署到测试环境
Solution Configurations下拉框里选择MigrateToSQLExpress build配置, Publish profile下拉框里选择Test,然后点击Publish Web。(如果你自定义了你的Visual Studio使这些工具栏的这些设置不能用的话,请参考第8章的内容)
Visual Studio部署了修改后的程序,并在Output窗口显示了成功信息。
修改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。
卸载成功以后,同样的方式也卸载SqlServerCompact包(必须卸载,因为EntityFramework.SqlServerCompact依赖于它)。
同样的步骤,删除ContosoUniversity.DAL项目里的这2个包。
最后,可以MigrateToSqlExpress Build配置了,因为它仅仅是为迁移数据而准备的。Build菜单里选择Configuration Manager,在弹出的Configuration Manager对话框里,Active solution configuration下拉菜单里选择Edit,在Edit Solution Configurations对话框里选择MigrateToSQLExpress,然后点击Remove。
现在已经成功将数据库迁移至SQL Server Express和完整版SQL Server,下一章节,将做另外一处数据库修改,然后在测试、生产环境使用SQL Server Express和完整版SQL Server的时候,如何部署这些修改。