QUOTE:
简介
Microsoft® SQL Server™ 2005 提供了一个标准机制,用于使用 SOAP 通过 HTTP 访问数据库引擎。通过使用此机制,可将 SOAP/HTTP 请求发送到 SQL Server 以执行以下内容:
• Transact-SQL 批处理语句,带参数或不带参数。
• 存储过程,扩展存储过程以及用户定义的标量值函数。
在 SQL Server 2005 之前,可用于连接 SQL Server 的唯一机制就是通过名为 Tabular Data Stream (TDS) 的自定义二进制协议。利用 SOAP/HTTP 访问,我们提供了一种开放的且具有相关文档的协议,可以作为后备手段,以连接到 SQL Server。提供 SOAP/HTTP 访问,可以使更多类型的客户端访问 SQL Server,其中包括“无痕迹安装”客户端,因为已不再需要在客户端设备上安装 Microsoft 数据访问组件 (MDAC) 栈以尝试连接到 SQL Server。它方便了与各种平台上的 .NET、SOAP 工具包、Perl 以及更多功能的互操作。由于 SOAP/HTTP 访问机制基于各种应用广泛的技术(如 XML 和 HTTP),它能内在地促进异构环境中与 SQL Server 的互操作性及对 SQL Server 的访问。任何能够分析 XML 和提交 HTTP 请求的设备现在都能够访问 SQL Server。
很多企业都采用异构的环境,其中运行于 UNIX 和 Linux 平台上的应用程序可能需要连接到 SQL Server。在以前,此类用户唯一可用的解决方案就是使用 JDBC 或 ODBC 驱动程序。SOAP/HTTP 访问现在提供另一个低成本的后备方法。对于 DBA 使用 Perl 编写了运行于 UNIX 上的脚本以管理 SQL Server 资源的场景,这非常有用。在开发使用智能集成开发环境 (IDE)(其中内置了 SOAP/HTTP 支持,如 Microsoft Visual Studio® .NET 或 Jbuilder 就属于此类 IDE)开发客户端应用程序时,这也十分有用。这些 IDE 将生成特定的代理代码,这些代理代码对 SQL Server 通信进行抽象,并提供客户端应用程序可以使用的对象。使用 SOAP/HTTP 还实现了随时随地对 SQL Server 的访问,而这使得开发用于移动设备或偶尔连接的设备的应用程序更为容易。一旦建立了连接,并且服务器已开始处理请求,则可以使用 TDS 所基于的客户端上的现有机制(如使用 SqlClient、ODBC 和 OLEDB)对此进行监视。
要求
SQL Server 2005 本机 Web 服务要求使用 Microsoft Windows Server™ 2003 作为操作系统,因为它们依赖于此版本提供的内核模式 http 驱动程序 http.sys。由于 SQL Server 利用内核模式 http.sys 驱动程序,所以不必安装 IIS 以在 SQL Server 外公开 Web 服务,这就简化了管理。
应该根据应用程序要求决定是否安装 IIS。
例如,特定的应用程序可能从使用显式中间层而受益。在这种情况下,IIS 将很有用。
QUOTE:
HTTP 终结点
为了将 SQL Server 设置为可以本机侦听 HTTP SOAP 请求的 Web 服务,需要创建 HTTP 终结点并定义该终结点公开的方法。当创建 HTTP 终结点时,必须使用唯一的 URL 进行创建,将使用此 URL 侦听传入的 HTTP 请求。例如,如果您使用 URL“http://servername/sql”创建一个终结点,发送到 http://servername/sql 的 SOAP 请求将由 http.sys. 拾取,然后将此 SOAP 请求路由到承载与该 URL 关联的终结点的 SQL Server 实例。请求将从此处传递到 SQL Server 内的 SOAP 处理层。
SQL Server 实例可以具有多个终结点,每个终结点都可以将任意数量的存储过程(通过使用 Transact-SQL 或 CLR 实现)公开为终结点上的 WebMethod,且可以通过 SOAP 远程过程调用 (RPC) 而调用。WebMethod 可以具有与所公开的实际存储过程不同的名称。WebMethod 名称就是在 WSDL 中作为操作名称向用户显示的名称。
注意 务必指出,终结点中的 WebMethod 子句是特定于 SQL Server 2005 的,与 ASMX WebMethod 属性无关。
用户可以对终结点执行 AdHoc Transact-SQL 语句。这可以通过使用数据定义语言 (DDL) 中的一个可选子句在终结点上允许进行批处理而实现。允许进行批处理将隐式地将名为“sqlbatch”的 WebMethod 公开给用户。在接下来的各节中将进一步对这些概念进行说明。
创建 HTTP 终结点
HTTP 终结点是使用 Transact-SQL DDL 创建和管理的。创建 HTTP 终结点是允许 HTTP/SOAP 访问 SQL Server 2005 的第一步。每个终结点都具有名称和一个选项集合,这些选项一起定义终结点的行为。
为了演示如何使用“创建 HTTP 终结点”的内容,让我们看看 Hello World 示例,以了解如何通过 SQL Server Web 服务调用存储过程。
首先,使用以下 T-SQL 在主数据库中创建名为“hello world”的存储过程。此存储过程只是显示输入参数中提供的字符串。
CREATE PROCEDURE hello_world
(@msg nvarchar(256))
AS BEGIN
select @msg as 'message'
END
然后,使用以下 T-SQL 创建 HTTP 终结点,此终结点将允许将此存储过程作为一个 WebMethod 进行访问:
CREATE ENDPOINT hello_world_endpoint
STATE = STARTED
AS HTTP (
AUTHENTICATION = ( INTEGRATED ),
PATH = '/sql/demo',
PORTS = ( CLEAR )
)
FOR SOAP (
WEBMETHOD
'http://tempuri.org/'.'hello_world'
(NAME = 'master.dbo.hello_world'),
BATCHES = ENABLED,
WSDL = DEFAULT
)
所有终结点均存储在主数据库中,在元数据视图 master.sys.http_endpoints 中。除非进行定义,否则终结点不会具有任何 SOAP 方法。在上例中,我们将存储过程 master.dbo.hello_world 作为“hello_world”WebMethod 公开;该 WebMethod 可以使用任何名称,如可以命名为“http://tempuri.org”命名空间下的“testproc1”。如果将 WSDL 子句的值指定为 DEFAULT,将使终结点使用默认格式对请求 WSDL 生成的 WSDL 进行响应。通过在上面的语句中设置 WSDL=NONE,可以取消 WSDL 生成。在接下来的部分中,我们将对 WSDL 生成的细节进行讨论。
QUOTE:
身份验证与安全
HTTP 终结点支持以下标准身份验证机制:基本、摘要、集成(NTLM、Kerberos)以及 SQL 身份验证。首先会在 HTTP 传输层进行身份验证。一旦这个验证成功,将使用用户的 SID 进行 SQL 身份验证。除了以下情况,这适合于所有选项:通过指定 LOGIN_TYPE = MIXED 启用了 SQL 身份验证。SQL 身份验证凭证将使用 WsSecurity 用户名称标记标头作为 SOAP 数据包的一部分发送。管理员能按每个终结点设置基于 IP 的限制,以通过仅允许特定的 IP 或 IP 范围访问 HTTP 终结点来限制对终结点的访问。从概念上讲,“终结点”就是一个“应用程序”,实现单个应用程序的所有方法均映射到终结点,因此安全机制应用到终结点以控制对应用程序的访问。终结点通过设计进行保护;下面列出一些可以帮助保证终结点安全的事项。
• 默认关闭。不映射任何默认终结点或 Web 方法;必须显式地创建和指定。
• 安全检查也应用到对象,因此,映射的存储过程仅在用户对终结点具有连接权限且对存储过程具有执行权限时才可以执行。
• 不支持匿名连接到终结点。所有请求(包括 WSDL 请求)均要通过身份验证。为了提交任何请求,客户端必须根据 SQL Server 原则进行身份验证。
当创建了终结点后,只有系统管理员角色和终结点所有者的成员才能连接到该终结点。必须向用户授予访问终结点的连接权限;此操作是通过执行以下语句实现的:
GRANT CONNECT ON HTTP ENDPOINT::hello_world_endpoint TO [DOMAIN\USER]
非 Microsoft 平台上的客户端可以通过使用基本身份验证或 SQL 身份验证连接到 SQL Server。不过使用基本身份验证或 SQL 身份验证要求保证通道的安全,以使用户只能在启用了 SSL 的端口上进行连接。
WSDL
WSDL 是以 XML 编写的用于描述 Web 服务的文档。它指定服务的位置和服务公开的操作(或方法)。WSDL 提供了客户端与 Web 服务交互所必需的信息。Visual Studio .NET 和 Jbuilder 一类的工具将使用 WSDL 生成代理代码,应用程序可使用此代理代码与 Web 服务进行通信。如果终结点启用了 WSDL,该终结点将在收到 WSDL 请求时产生 WSDL。当向本文早些时候创建的终结点发送已通过身份验证的请求时,它将产生 WSDL。WSDL 请求是简单的窗体 HTTP get 请求。
http://servername/sql/demo?wsdl
服务器将查询与终结点相关的元数据,并动态生成 WSDL。生成的 WSDL 提供了存储过程参数的丰富类型说明。服务器可以生成不同风格的 WSDL,根据是使用基元 xsd 类型还是复杂类型来描述请求/响应消息中的参数,我们分别将之称为简单 WSDL 和复杂 WSDL。默认使用复杂类型。
QUOTE:
SOAP RPC:方法调用
在上面创建的终结点中,我们已将此存储过程 master.dbo.hello_world 作为 Web 方法公开,而 Web 方法可以通过 SOAP RPC 执行。以下是一个 SOAP 消息的示例,该消息通过 HTTP 发送到服务器以通过 SOAP 调用此 SP。
<SOAP-ENV:Envelope
<soap:binding transport="http://schemas.xmlsoap.org/soap/http"
<soap:body use="literal" />
<hello_world xmlns="http://tempuri.org/">
<msg>Hello World!</msg>
</hello_world>
<soap:body use="literal" />
</SOAP-ENV:Envelope>
结果将为一个包含以下内容的 SOAP 包封:
<SqlRowSet1 xmlns="urn:schemas-microsoft-com:sql:SqlRowSet1">
<row>
<message>Hello World!</message>
</row>
</SqlRowSet1>
批处理:即席查询
当通过使用 T-SQL 命令在终结点上启用了批处理时,另一个 SOAP 方法(名为“sqlbatch”)将隐式地在终结点上公开。sqlbatch 方法允许通过 SOAP 执行 T-SQL 语句。此方法采用两个参数。第一个参数名为“<BatchCommands>”,是批量的 T-SQL 语句。第二个参数名为“<Parameters>”;如果 T-SQL 语句使用了任何参数,它将包含一个参数信息的数组。例如,下面是 SOAP 请求的请求体,其中调用了 sqlbatch 方法,并执行一个参数化的查询。
<sqlbatch xmlns="http://schemas.microsoft.com/SQLServer/2001/12/SOAP">
<BatchCommands>
SELECT EmployeeID, LoginID, Gender
FROM Employee
WHERE EmployeeID=@x
FOR XML AUTO;
</BatchCommands>
<Parameters>
<SqlParameter name="x" sqlDbType="Int" maxLength="20"
xmlns="http://schemas.microsoft.com/SQLServer/2001/12/SOAP/types/SqlParameter">
<Value xsi:type="xsd:string">1</Value>
</SqlParameter>
</Parameters>
</sqlbatch>
此 SOAP 请求的响应将包括以下内容:
<sqlresultstream:SqlXml xsi:type="sqlsoaptypes:SqlXml">
<SqlXml>
<Employees EmployeeID="1" FirstName="Nancy" LastName="Davolio"/>
</SqlXml>
</sqlresultstream:SqlXml>
QUOTE:
管理
我们已经了解了创建终结点并根据终结点提交 SOAP 请求非常简单。由于现在仅须管理一个组件(即 SQL Server),所以管理得到了简化。我们不需要管理 IIS 组件。终结点抽象为管理员提供了更大的灵活性,他们可以启用 IP 筛选。这还消除了打开另一个端口的需要,因为我们可以重新使用供 http/https Web 通信使用的端口。通过仅显式地向特定的个体授予 CONNECT 特权,还可以仅向这些用户提供对终结点的访问权限。
结束语
通过使用本机 SOAP 访问,我们已提供了基于应用广泛并有相应文档说明的标准(如 SOAP/HTTP)的协议,用以访问 SQL Server。这样使得更多类型的客户端可以连接到 SQL Server,从而加强了互操作性,并更方便扩展。