【原文地址】 Recipe: Deploying a SQL Database to a Remote Hosting Environment (Part 1)
【原文发表日期】 Friday, December 22, 2006 12:58 AM
场景:
你开发完了一个得意的ASP.NET应用,所有的东西都测试过了而且在你本机上一切工作都正常,充分利用了ASP.NET 2.0中的成员,角色和用户信息等新功能,万事俱备,准备将它发布到一个远程主机环境,跟整个世界分享这个应用。
将.aspx文件和编译的程序集拷贝到远程系统是非常容易的,只要使用FTP或者直接向上拷贝文件即可。但许多开发人员面临的挑战是,如何在远程主机的站点上架设和重建数据库内容,包括数据定义和数据本身。不幸的是,过去以来一直没有极其简单的方式来达成这个目的。
好消息是,这个星期,SQL Server产品组推出了新的 SQL Server Hosting Toolkit的发布候选版 ,这个工具包将使部署你的SQL解决方案到远程主机环境容易之极。这个工具包允许你在本地操作SQL Express,SQL Server 2000,和 SQL Server 2005数据库,然后把你的数据定义和数据轻松地迁移,安装到一个共享的远程主机SQL Server账号上。
下面的内容将描述你可以如何开始使用这个工具包。
SQL Server Hosting Toolkit
SQL Server Hosting Toolkit可以免费获取,同时发布的还有一个数据库发布向导(Database Publishing Wizard),该向导支持2种数据库主机部署场景:
1) 数据库发布向导允许你指向一个你正在本机上操作的数据库,然后自动生成一个.SQL脚本文件,该文件包含了在任何远程系统上重建一个当前数据库的完整拷贝所需的安装逻辑。这个.SQL脚本包括了需要创建数据库定义(表,视图,存储过程,触发器,全文索引目录,角色,规则等等,可在此处参考所有细节),以及把与你本地数据库同样的数据内容填充到新数据库里去的所有的东西(这类似于MySQL 的dump工具)。把这些安装逻辑封装在单个.SQL 文件的好处是,大多数主机供应商已经支持上传 .SQL 文件到他们的主机环境,并且通过他们的管理控制面板运行这些脚本的能力。假定你现有一个支持这个功能的web主机供应商,你可以马上开始使用数据库发布向导来轻松地部署你的网站,而不需要主机供应商安装或配置什么东西。
2) 数据库发布向导也允许你指向一个你正在本机上操作的数据库,然后使用 web service 向你的远程主机环境迁移和重建数据库(而不用创建一个.SQL 文件或者使用主机供应商的管理控制面板运行这个文件)。不过,这个发布选项需要主机环境提供SQL发布web-service。 SQL Server Hosting Toolkit包含了一个免费的SQL发布web-service实现,我们将与主机供应商密切合作来部署这个web-service。
数据库发布向导允许你在本地使用 SQL Express 或 SQL Server 2000/2005 ,然后在远程主机环境中使用SQL 2000 或 SQL 2005。它不要求SQL服务器的版本是一样的,所以,你可以在本地使用SQL Express 2005,然后上传到主机环境中的SQL 2000服务器,而不用改动任何编码。
数据库发布向导也支持对内置的ASP.NET 2.0成员,角色管理,用户信息和健康监测等数据定义的处理。许多人遇上问题,因为随 ASP.NET一起发布的来建立这些数据定义的内置.SQL 脚本在安装时(install-time)需要DBO权限,但很多主机供应商对此并不支持(注:脚本在运行时(runtime)不需要DBO权限,只是在安装时(install time)才需要,但这有时会是个障碍,除非主机供应商愿意为你安装)。而在另一方面,数据库发布向导在安装ASP.NET 2.0成员,角色管理,用户信息等数据定义和数据时,并不需要DBO权限,应该允许你,和使用数据库发布向导部署其他数据库一样,轻松地部署 ASPNETDB数据表和存储过程。
教程一:使用.SQL文件把SQL Express数据库部署到一个SQL Server主机账号上去
在接下来的几周内,我将写一系列的帖子示范如何使用SQL Server Hosting Toolkit中的种种功能。这系列中的第一个教程讨论如何使用它来轻松地生成一个本地SQL Express数据库的 .SQL 安装文件,然后你可以将它拷贝到一个远程主机账号上,用它来重新建立一个 SQL Server 数据库,为你的网站所用。
起始准备:下载和安装数据库发表向导
我们要做的第一步是确认我们安装了SQL Hosting Toolkit中的数据库发布向导。点击这里下载安装。
数据库发布向导既有图形界面的向导,也有命令行工具。图形界面的向导既可以单独运行,也可以通过它向Visual Studio 2005 和 Visual Web Developer Express的解决方案管理器中添加的context-menu支持来运行。为本教程的目的,我们将使用后面这个解决方案管理器的集成方法,它使得发布极其容易。
第一步:创建一个使用本地SQL Express或SQL Server数据库的ASP.NET网站
为方便这个演示,我们将使用随VS 2005(VS) 和Visual Web Developer Express(VWD)而来的内置的Personal Starter Kit模板。为创建一个基于这个模板的新web项目,在VWD或VS中选择文件->新网站,然后在新网站对话框中选择Personal Starter Kit模板。在默认情形下,这个personal starter kit应用是配置使用SQL Express(这数据库是免费的,可以在这里下载)的。执行之后,如下图所示:
在创建应用后,你可以在VWD/VS中选“网站”->“ASP.NET配置”菜单项来运行web管理工具,创建一个新的用户,把该用户添加到网站的“admin”角色中去。然后你就可以这个新的管理员用户账号登录,试着上传新的相片或者定制网站上现有的相片(注意,这么做的话,相片的元数据以及原相片的二进制数据都是储存在数据库里的):
上述步骤结束之后,我们将拥有2个SQL Express数据库,安装在我们项目的/app_data文件夹里。其中一个SQL Express数据库名为personal.mdf,内含特定于我们网站的数据表和存储过程,譬如photo(相片)和album(相册)表,以及基本的内容管理支持等。另外一个SQL Express数据库名为aspnetdb.mdf,内含默认的ASP.NET 2.0成员,角色和用户信息提供器的数据库贮藏,被我们的应用用来做登录和管理之用。
第二步:为我们的数据库创建 .SQL 安装脚本
至此,我们建立了新的应用和本地数据库,向数据库中添加了自定义数据,象新用户账号以及他们的角色成员,以及新的相片和相册等,我们想要把这应用部署到一个远程主机服务器上去。
我们要做的第一步是创建 .SQL 脚本文件,这些文件将允许我们在远程主机账号上自动重建完全一样的数据库定义和数据库内容。我们将使用作为SQL Hosting Toolkit的一部分安装在本机上的数据库发布向导(Database Publishing Wizard)来做。
一开始,点击 Visual Studio 或 Visual Web Developer中的服务器管理器页,查看一下我们的程序所用的数据库:
在上图中可以看到,我们用到了2个SQL Express数据库:ASPNETDB.MDF 和 Personal.MDF。想为每个数据库生成一个 .SQL 安装文件的话,只要选择管理器里的数据库,然后按右鼠标,在其上选择“Publish to Provider(发布到提供者)”上下文菜单项(是由数据库发布向导添加的):
这会启动数据库发布向导,允许我们按部就班地生成数据库的安装脚本。就象在本帖子里的简介部分提到的一样,数据库发布向导支持2个部署选项: 1) 生成 .SQL 安装脚本文件,你能将它们拷贝到远程主机上然后使用他们现有的管理控制面板工具来运行它们,或者 2) 使用主机网站提供的数据库发布Web Service直接把数据库上传。
在这第一个教程里,我们将使用 .SQL 脚本文件的方法,所以,保留默认的单选按钮选项,给你想生成的 .SQL 安装脚本文件提供一个名字:
在点击“下一步”之后,向导会提供选项让你定制生成 .SQL 安装文件时的一些设置。注意,你可以控制是否要删除目标数据库中的现有对象,脚本针对的是SQL 2000 还是SQL 2005 ,是否要同时安装数据定义和数据,还是只要数据定义,或者只要数据:
在本教程中,保留默认的选项,点击“下一步”,生成.SQL 脚本:
至此,你就拥有一个名为Personal.SQL的文件,内含你可以在任何SQL服务器上运行的脚本,该脚本能用来重建数据库中的数据表,存储过程,视图,全文索引目录等,以及导入创建.SQL文件时对应数据库中的所有的数据记录。
该.SQL文件本身是个文本文件,所以你可以用任何文本编辑器将它打开,查看其中的内容,或者添加你自己的语句来做任何定制:
注意,上面的.SQL文件既包括了创建Photos表所需的DDL SQL语句(包括该表所有约束和主键/外键等关系),也包括了在该表创建后在改该表内插入数据的SQL语句。在上面的例子中,甚至包括了插入相片的二进制数据的SQL语句,因为这些数据是保存在数据库里的。
把上述步骤对ASPNETDB SQL Express数据库重复执行之后,你将拥有2个你可以用来在任何SQL服务器上自动重建你的SQL数据库的.SQL 安装脚本:
注意,我们建立的.SQL文可以用来在一个服务器上创建2个单独的数据库,或者也可以在同个数据库里运行,从而生成一个包含了你程序的所有的数据表,存储过程和数据的单一数据库。要实现这个目的,只要对同个数据库运行这两个脚本就可以了。假如没有表名和存储过程名冲突的话,你将拥有一个包括所有东西的单一数据库。当你的主机账号只提供了一个可用的数据库实例时,这后一个选项是非常有用的。
第三步:用我们的 .SQL 文件创建我们的远程数据库
至此,我们生成了 .SQL 文件,我们就可以用它们来在我们的主机环境中安装数据库了。我们怎么使用 .SQL 文件安装数据库的细节取决于主机供应商是如何让我们访问我们的SQL账号的。有些主机供应商提供了一个基于HTML的文件上传工具,允许你提供一个 .SQL 文件,然后他们可以在你拥有的SQL数据库里执行这个文件。
其他的主机供应商提供一个在线的查询工具(如下图所示),允许你拷贝/粘贴SQL语句来在你的数据库里运行。如果你的主机供应商提供了类似的在线查询工具的话,那么你可以用一个文本编辑器打开.SQL文件,然后把其中的内容拷贝/粘贴到查询文本框里,然后运行这些语句。
不同主机供应商提供的SQL工具的质量不尽相同。在测试数据库发布向导时,我们发现主机供应商提供的一些定制的SQL管理工具会不正确地分析合法的SQL语句从而导致问题,特别是对于GOTO语句。这个页面描述了一个你也许见过的一些主机供应商的工具遭遇GOTO语句的问题。为了帮助全面提高SQL主机管理工具的质量,SQL Server产品组在明年的早些时候会发布一个免费的SQL HTML管理工具的源码,主机供应商可以将其集成到他们的界面中去。如果顺利的话,这将有助于改进所有Windows主机环境的标准体验。
如果你的主机供应商没有可用的HTML web管理工具让你轻松管理你的SQL数据库的话,那么你也可以编写一个简单的ASP.NET 网页,你可以将它和你的 .SQL 文件一起FTP到你的网站,然后访问该网页,该网页则把 .SQL 文件当作文本文件读入内存,然后将其变成一个字符串传给ADO.NET来执行。这将给予你和上面的查询分析器一样的结果,为你完全重建你的数据库。
Step 4: 第四步:更新web.config中的连接字符串
一旦在我们的主机环境的数据库里上传数据完毕,我们要向远程网站上传我们的.aspx文件,程序集和其他内容(一般是通过FTP来做的)。
我们要做的最后一步是打开我们的 web.config 文件,更新 <connectionStrings> 部分来指向我们远程主机的新数据库位置。注意,你需要从主机供应商那里得到确切的SQL服务器,数据库名字,以及用户名/密码。
用我们上面的personal starter kit作为例子,我们要改动 web.config 文件中的 <connectionStrings> 部分中的默认连接字符串(原本使用的是本地/app_data文件夹中的2个SQL Express数据库):
< add name ="Personal" connectionString ="Data Source=./SQLExpress;Integrated Security=True;User Instance=True;AttachDBFilename=|DataDirectory|Personal.mdf" />
< remove name ="LocalSqlServer"/>
< add name ="LocalSqlServer" connectionString ="Data Source=./SQLExpress;Integrated Security=True;User Instance=True;AttachDBFilename=|DataDirectory|aspnetdb.mdf" />
</ connectionStrings >
来使用单个SQL Server 2000数据库(Server123机器上的scottguDB数据库)。
< add name ="Personal" connectionString ="Data Source=Server123;Initial Catalog=scottguDB;Integrated Security=True" providerName ="System.Data.SqlClient" />
< remove name ="LocalSqlServer"/>
< add name ="LocalSqlServer" connectionString ="Data Source=Server123;Initial Catalog=scottguDB;Integrated Security=True" providerName ="System.Data.SqlClient" />
</ connectionStrings >
我们能够使用单个数据库(而不是上面的2个数据库),因为我们对单一数据库运行了2个 .SQL文件,这样,把所有的数据定义和数据库合并到单个数据库实例里去了。
第五步:完成
至此,我们就可以在主机环境里远程运行我们的应用了,它应该是工作的。
总结
作为SQL Hosting Toolkit的一部分推出的数据库发布向导应该使得为任何数据库(SQL Express 或者 SQL Server)创建 .SQL 文件非常容易。你可以使用它来轻松地dump你本机的数据库,然后用来在远程系统上重新建立完全一样的数据库。
在将来的教程里,我将示范你如何不用 .SQL 文件就可以重建远程数据库(而是在VS里通过web service把数据库直接发布到你的主机环境中去),请静候相关细节。
希望本文对你有所帮助,
Scott
附注:我们正计划把数据库发布向导加到 Visual Studio "Orcas"(下一个VS版本)中去,这意味着在那个时段里,你就不用单独下载数据库发布向导了。但我们要确定你不必等到那个时候,这是我们今天就将它提供给Visual Studio 2005和Visual Web Developer Express 2005的原因。
附注2:请访问此页阅读我以前写的其他方面的ASP.NET Tips,Tricks 和 Recipes。