配置用于 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 流量(在某些情况下,SQL Server 实例使用的端口上的用户数据报协议(UDP)流量。

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

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

  1. “开始”菜单上,指向“所有程序”,单击“SQL Server 2008 R2”Microsoft,单击“配置工具”,然后单击“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)时,应用程序将使用应用程序池的标识运行。 在域环境中,应用程序池标识使用其运行的计算机帐户来访问网络资源。 计算机帐户采用 [域名]</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 部署数据库时,可以使用 Windows 凭据或 SQL Server 凭据(如果 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 服务器角色?

深入阅读

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