配置用于 Web 部署发布的数据库服务器

作者 :Jason Lee

本主题介绍如何配置 SQL Server 2008 R2 数据库服务器以支持 Web 部署和发布。

本主题中所述的任务对于每个部署方案都是通用的,不管 Web 服务器是配置为使用 IIS Web 部署工具 (Web 部署) 远程代理服务、Web 部署处理程序还是脱机部署,还是应用程序在单个 Web 服务器或服务器场上运行。 部署数据库的方式可能会根据安全要求和其他注意事项而更改。 例如,可以使用或不使用示例数据部署数据库,也可以在部署后部署用户角色映射或手动配置它们。 但是,配置数据库服务器的方式保持不变。

无需安装任何其他产品或工具即可配置数据库服务器以支持 Web 部署。 假设数据库服务器和 Web 服务器在不同的计算机上运行,只需:

  • 允许SQL Server使用 TCP/IP 进行通信。
  • 允许SQL Server流量通过任何防火墙。
  • 为 Web 服务器计算机帐户提供SQL Server登录名。
  • 将计算机帐户登录名映射到任何所需的数据库角色。
  • 为将运行部署的帐户授予SQL Server登录名和数据库创建者权限。
  • 若要支持重复部署,请将部署帐户登录名映射到 db_owner 数据库角色。

本主题将演示如何执行其中每个过程。 本主题中的任务和演练假定你从 Windows Server 2008 R2 上运行的 SQL Server 2008 R2 的默认实例开始。 在继续之前,请确保:

  • 已安装 Windows Server 2008 R2 Service Pack 1 和所有可用更新。
  • 服务器已加入域。
  • 服务器具有静态 IP 地址。
  • SQL Server 2008 R2 Service Pack 1 和所有可用更新均已安装。

SQL Server 实例只需要包含数据库引擎服务角色,该角色会自动包含在任何SQL Server安装中。 但是,为了便于配置和维护,我们建议你包括 管理工具 - 基本管理工具 - 完整的 服务器角色。

注意

有关将计算机加入域的详细信息,请参阅 将计算机加入域和登录。 有关配置静态 IP 地址的详细信息,请参阅 配置静态 IP 地址。 有关安装 SQL Server 的详细信息,请参阅安装 SQL Server 2008 R2

启用对SQL Server的远程访问

SQL Server使用 TCP/IP 与远程计算机通信。 如果数据库服务器和 Web 服务器位于不同的计算机上,则需要:

  • 配置SQL Server网络设置,以允许通过 TCP/IP 进行通信。
  • 配置任何硬件或软件防火墙以允许 TCP 流量 (在某些情况下,用户数据报协议 (UDP) 流量) SQL Server实例使用的端口上。

若要使SQL Server通过 TCP/IP 进行通信,请使用 SQL Server 配置管理器 更改 SQL Server 实例的网络配置。

使SQL Server能够使用 TCP/IP 进行通信

  1. “开始”菜单上,指向“所有程序”,依次单击“Microsoft SQL Server 2008 R2”、“配置工具”和“SQL Server 配置管理器”。

  2. 在树视图窗格中,展开“SQL Server网络配置”,然后单击“MSSQLSERVER 的协议”。

    注意

    如果已安装 SQL Server 的多个实例,则会看到每个实例的[实例名称] 项的协议。 需要逐个实例配置网络设置。

  3. 在详细信息窗格中,右键单击 TCP/IP 行,然后单击 “启用”。

    在详细信息窗格中,右键单击 TCP/IP 行,然后单击“启用”

  4. 在“警告”对话框中,单击“确定”

    在“警告”对话框中,单击“确定”

  5. 需要重新启动 MSSQLSERVER 服务,然后新的网络配置才会生效。 可以在命令提示符处、从服务控制台或SQL Server Management Studio执行此操作。 在此过程中,你将使用 SQL Server Management Studio。

  6. 关闭 SQL Server 配置管理器。

  7. “开始”菜单上,指向“所有程序”,单击“Microsoft SQL Server 2008 R2”,然后单击“SQL Server Management Studio”。

  8. 在“ 连接到服务器 ”对话框的“ 服务器名称 ”框中,键入数据库服务器的名称,然后单击“ 连接”。

    在“连接到服务器”对话框的“服务器名称”框中,键入数据库服务器的名称,然后单击“连接”。

  9. “对象资源管理器”窗格中,右键单击父服务器节点 (例如 TESTDB1) ,然后单击“重启”。

    在“对象资源管理器”窗格中,右键单击父服务器节点 (例如 TESTDB1) ,然后单击“重启”。

  10. “Microsoft SQL Server Management Studio”对话框中,单击“”。

    在“Microsoft SQL Server Management Studio”对话框中,单击“是”。

  11. 重新启动服务后,关闭SQL Server Management Studio。

若要允许SQL Server流量通过防火墙,首先需要知道SQL Server实例使用的端口。 这取决于SQL Server实例的创建和配置方式:

  • SQL Server 的默认实例侦听 (并响应 TCP 端口 1433 上的) 请求。
  • SQL Server 的命名实例侦听 (,并响应动态分配的 TCP 端口上的) 请求。
  • 如果启用了 SQL Server Browser 服务,则客户端可以在 UDP 端口 1434 上查询该服务,找出要用于特定SQL Server实例的 TCP 端口。 但是,出于安全原因,此服务通常会被禁用。

假设使用的是 SQL Server 的默认实例,则需要将防火墙配置为允许流量。

方向 从端口 到端口 端口类型
入站 任意 1433 TCP
出站 1433 任意 TCP

注意

从技术上讲,客户端计算机将使用 1024 到 5000 之间的随机分配的 TCP 端口来与SQL Server通信,你可以相应地限制防火墙规则。 有关SQL Server端口和防火墙的详细信息,请参阅通过防火墙与 SQL 通信所需的 TCP/IP 端口号如何:将服务器配置为侦听特定 TCP 端口 (SQL Server 配置管理器)

在大多数 Windows Server 环境中,可能需要在数据库服务器上配置 Windows 防火墙。 默认情况下,除非规则特别禁止,否则 Windows 防火墙允许所有出站流量。 若要使 Web 服务器能够访问数据库,需要配置一个入站规则,以便在SQL Server实例使用的端口号上允许 TCP 流量。 如果使用 SQL Server 的默认实例,则可以使用下一过程来配置此规则。

配置 Windows 防火墙以允许与默认SQL Server实例通信

  1. 在数据库服务器的 “开始 ”菜单上,指向 “管理工具”,然后单击“ 高级安全 Windows 防火墙”。

  2. 在树视图窗格中,单击“ 入站规则”。

    在树视图窗格中,单击“入站规则”。

  3. “操作 ”窗格中的“ 入站规则”下,单击“ 新建规则”。

  4. 在“新建入站规则向导”的“ 规则类型 ”页上,选择“ 端口”,然后单击“ 下一步”。

    在“新建入站规则向导”的“规则类型”页上,选择“端口”,然后单击“下一步”。

  5. 在“ 协议和端口 ”页上,确保选中 “TCP ”,并在“ 特定本地端口 ”框中键入 1433,然后单击“ 下一步”。

    在“协议和端口”页上,确保选中“TCP”,并在“特定本地端口”框中键入 1433,然后单击“下一步”。

  6. “操作” 页上,保留“ 允许连接” 处于选中状态,然后单击“ 下一步”。

  7. “配置文件”页上,将“域”保留为选中状态,清除“专用”和“公共检查”框,然后单击“下一步”。

    在“配置文件”页上,保持“域处于选中状态”,清除“专用”和“公共检查”框,然后单击“下一步”。

  8. 在“名称”页上,为规则指定一个适当的描述性名称 (例如,SQL Server默认实例 - 网络访问) ,然后单击“完成”。

有关为SQL Server配置 Windows 防火墙的详细信息,特别是如果需要通过非标准或动态端口与SQL Server通信,请参阅如何:为数据库引擎访问配置 Windows 防火墙

配置登录名和数据库权限

将 Web 应用程序部署到 Internet Information Services (IIS) 时,应用程序将使用应用程序池的标识运行。 在域环境中,应用程序池标识使用运行它们的服务器的计算机帐户来访问网络资源。 计算机帐户采用 [domain name]</strong>[machine name]$格式,例如 FABRIKAM\TESTWEB1$。 若要允许 Web 应用程序通过网络访问数据库,需要:

  • 将 Web 服务器计算机帐户的登录名添加到 SQL Server 实例。
  • 将计算机帐户登录名映射到任何所需的数据库角色 (通常 db_datareaderdb_datawriter) 。

如果 Web 应用程序在服务器场而不是单个服务器上运行,则需要对服务器场中的每个 Web 服务器重复这些过程。

注意

有关应用程序池标识和访问网络资源的详细信息,请参阅 应用程序池标识

可以通过多种方式处理这些任务。 若要创建登录名,可以:

  • 使用 Transact-SQL 或 SQL Server Management Studio 在数据库服务器上手动创建登录名。
  • 在 Visual Studio 中使用 SQL Server 2008 Server 项目来创建和部署登录名。

SQL Server登录名是服务器级对象,而不是数据库级对象,因此它不依赖于要部署的数据库。 因此,可以随时创建登录名,最简单的方法通常是在开始部署数据库之前在数据库服务器上手动创建登录名。 可以使用下一过程在 SQL Server Management Studio 中创建登录名。

为 Web 服务器计算机帐户创建SQL Server登录名

  1. 在数据库服务器的“开始”菜单上,指向“所有程序”,单击“Microsoft SQL Server 2008 R2”,然后单击“SQL Server Management Studio”。

  2. 在“ 连接到服务器 ”对话框的“ 服务器名称 ”框中,键入数据库服务器的名称,然后单击“ 连接”。

    此图演示:在“连接到服务器”对话框的“服务器名称”框中,键入数据库服务器的名称,然后单击“连接”。

  3. “对象资源管理器”窗格中,右键单击“安全性”,指向“新建”,然后单击“登录”。

  4. “登录名 - 新建 ”对话框的“ 登录名 ”框中,键入 Web 服务器计算机帐户的名称 (例如 FABRIKAM\TESTWEB1$) 。

    在“登录名 - 新建”对话框的“登录名”框中,键入 Web 服务器计算机帐户的名称 (例如 FABRIKAM\TESTWEB1$) 。

  5. 单击" 确定"。

此时,数据库服务器已准备好进行 Web 部署发布。 但是,在将计算机帐户登录名映射到所需的数据库角色之前,部署的任何解决方案都不起作用。 将登录名映射到数据库角色需要更多考虑,因为要部署数据库之后才能映射角色。 若要将计算机帐户登录名映射到所需的数据库角色,可以:

  • 首次部署数据库后,手动将数据库角色分配给登录名。
  • 使用部署后脚本将数据库角色分配给登录名。

有关自动创建登录名和数据库角色映射的详细信息,请参阅 将数据库角色成员身份部署到测试环境。 或者,可以使用下一过程手动将计算机帐户登录名映射到所需的数据库角色。 请记住,在部署数据库 之前 ,无法执行此过程。

将数据库角色映射到 Web 服务器计算机帐户登录

  1. 像以前一样打开SQL Server Management Studio。

  2. “对象资源管理器”窗格中,依次展开“安全性”节点和“登录名”节点,然后双击计算机帐户登录名 (例如 FABRIKAM\TESTWEB1$) 。

    在“对象资源管理器”窗格中,依次展开“安全”节点和“登录名”节点,然后双击计算机帐户登录名 (例如 FABRIKAM\TESTWEB1$) 。

  3. “登录属性 ”对话框中,单击“ 用户映射”。

  4. “映射到此登录名的用户” 表中,选择数据库的名称 (例如 ContactManager) 。

  5. “数据库角色成员身份:[数据库名称]” 列表中,选择所需的权限。 对于 Contact Manager 示例解决方案,必须选择 db_datareaderdb_datawriter 角色。

    在 [数据库名称] 的数据库角色成员身份列表中,选择所需的权限。对于 Contact Manager 示例解决方案,必须选择db_datareader和db_datawriter角色。

  6. 单击" 确定"。

尽管手动映射数据库角色通常足以满足测试环境的需求,但自动部署或一键式部署到过渡或生产环境则不太理想。 有关使用部署后脚本自动执行此类任务的详细信息,请参阅 将数据库角色成员身份部署到测试环境

注意

有关服务器项目和数据库项目的详细信息,请参阅 Visual Studio 2010 SQL Server数据库项目

配置部署帐户的权限

如果用于运行部署的帐户不是SQL Server管理员,则还需要为此帐户创建登录名。 若要创建数据库,帐户必须是 dbcreator 服务器角色的成员或具有等效的权限。

注意

使用 Web 部署或 VSDBCMD 部署数据库时,如果SQL Server实例配置为支持混合模式身份验证) ,则可以使用 Windows 凭据或SQL Server凭据 (。 下一过程假定你想要使用 Windows 凭据,但在配置部署时,没有任何阻止你在连接字符串中指定SQL Server用户名和密码。

设置部署帐户的权限

  1. 像以前一样打开SQL Server Management Studio。

  2. “对象资源管理器”窗格中,右键单击“安全性”,指向“新建”,然后单击“登录”。

  3. “登录名 - 新建 ”对话框的“ 登录名 ”框中,键入部署帐户的名称 (例如 FABRIKAM\matt) 。

  4. “选择页 ”窗格中,单击“ 服务器角色”。

  5. 选择“ dbcreator”,并单击“ 确定”。

    选择“dbcreator”,并单击“确定”。

若要支持后续部署,还需要在第一次部署后将部署帐户添加到数据库上的 db_owner 角色。 这是因为在后续部署中,你要修改现有数据库的架构,而不是创建新数据库。 如上一部分所述,由于明显的原因,在创建数据库之前,无法将用户添加到数据库角色。

将部署帐户登录名映射到 db_owner 数据库角色

  1. 像以前一样打开SQL Server Management Studio。

  2. “对象资源管理器”窗口中,展开“安全”节点,展开“登录名”节点,然后双击计算机帐户登录名 (例如 FABRIKAM\matt) 。

  3. “登录属性 ”对话框中,单击“ 用户映射”。

  4. “映射到此登录名的用户” 表中,选择数据库的名称 (例如 ContactManager) 。

  5. “数据库角色成员身份:[数据库名称]” 列表中,选择 db_owner 角色。

    在 [数据库名称] 的数据库角色成员身份列表中,选择db_owner角色。

  6. 单击" 确定"。

结论

数据库服务器现在应已准备好接受远程数据库部署并允许远程 IIS Web 服务器访问数据库。 在尝试部署和使用数据库之前,可能需要检查以下要点:

  • 是否已SQL Server配置为接受远程 TCP/IP 连接?
  • 是否配置了允许SQL Server流量的防火墙?
  • 是否为将访问SQL Server的每个 Web 服务器创建了计算机帐户登录名?
  • 数据库部署是否包含用于创建用户角色映射的脚本,或者首次部署数据库后是否需要手动创建这些映射?
  • 是否为部署帐户创建了登录名并将其添加到 dbcreator 服务器角色?

深入阅读

有关部署数据库项目的指南,请参阅 部署数据库项目。 有关通过运行部署后脚本创建数据库角色成员身份的指南,请参阅 将数据库角色成员身份部署到测试环境。 有关如何应对成员身份数据库带来的独特部署挑战的指导,请参阅 将成员资格数据库部署到企业环境