Microsoft SQL Server本机Web服务使用方案
下面的示例说明了如何创建 Perl 脚本以监视数据库的状态。SQL Server 已经引入了对动态管理视图的支持,这些视图提供了有关正在运行的服务器的动态状态信息。在该示例中,我们创建了一个 Perl 脚本,以便通过查询名为 dm_exec_connections 的动态视图来监视与数据库之间的活动连接的数量。
我们假设运行这段代码的计算机已经正确安装和配置了 Perl。
这里的示例使用 ActiveState 5.8.x Perl 软件包。该脚本利用下列软件包:
安装 http://theoryx5.uwinnipeg.ca/ppms/Crypt-SSLeay.ppd
安装 http://theoryx5.uwinnipeg.ca/ppms/XML-Parser.ppd
安装 http://theoryx5.uwinnipeg.ca/ppms/libxml-perl.ppd
安装 http://theoryx5.uwinnipeg.ca/ppms/XML-RegExp.ppd
安装 http://theoryx5.uwinnipeg.ca/ppms/XML-DOM.ppd
在该示例中,我们需要 SSL,因为 Perl 应用程序将使用 BASIC 身份验证和 SQL-Auth,并且 XML 软件包需要分析响应并显示结果。
注 有关完整脚本的信息,请参见相关的下载。
下面的代码块将 SOAP Lite 软件包实例化。我们需要明确要求将输出格式化为 XML,以便可以分析响应。
my $soap = SOAP::Lite
-> uri('http://Adventure-Works/Customers/')
-> proxy('https://srikr-800/sql/sql_auth')
-> outputxml(1);
接下来,我们需要为该连接设置凭据。因为我们打算使用 SQL-Auth,所以我们需要按如下方式初始化 UsernameToken 标头。
#sample Yukon security SOAPheader
# # # # foo-bar1
# #
my $Username = SOAP::Data->name('Username' => 'AdminUser');
my $Password = SOAP::Data->name('Password' => 'password')
->attr({Type => 'http://docs.oasis-open.org/wss/2004/01
/oasis-200401-wss-username-token-profile-1.0#PasswordText'});
my $UsernameToken= SOAP::Data->name('UsernameToken')
->value(\SOAP::Data->value($Username, $Password));
my $security = SOAP::Header->name(Security)
->attr({'xmlns' => 'http://docs.oasis-open.org/wss
/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd'})
->value(\$UsernameToken);
BASIC 身份验证凭据是通过实现以下存根传入的:
sub SOAP::Transport::HTTP::Client::get_basic_credentials {
return 'User' => 'Password';
}
注 建议不要在脚本文件中存储/引用密码。用户在处理密码时应该遵循标准的安全准则。
接下来,我们调用 Web 方法。因为我们将执行 T-SQL 批处理语句,所以代码如下所示:
#
# Invoking a sqlbatch to retrieve the number of connections
$soap -> on_action (sub { return '""';});
$method = SOAP::Data->name('sqlbatch')->attr({xmlns =>
'http://schemas.microsoft.com/sqlserver/2004/SOAP'});
@param = ( SOAP::Data->name(BatchCommands => 'select session_id,
net_transport, protocol_type from sys.dm_exec_connections'));
最后,我们分析 XML 响应以检索数据:
for my $node($doc->getElementsByTagName("row"))
{
print "\n";
for my $kid ($node->getChildNodes)
{
print $kid->getNodeName(); print ":: ";
for my $gkid ($kid->getChildNodes)
{
print $gkid->getNodeValue(); #print the actual values for the columns
}
print "\t";
}
print "\n";
}
运行该 Perl 脚本可以生成以下输出:
Testing SOAP::Lite client against AdventureWorks Contacts sample web service.
Calling sqlbatch
Server response...
Server response...
session_id:: 54 net_transport:: HTTP protocol_type:: SOAP
connection_id::5EC2B4E2-39A6-4FA7-BBDB-144DAED59A41
session_id:: 53 net_transport:: Shared memory protocol_type:: TSQL
connection_id:: 5AE50B7D-D919-4FBC-BA42-6069A12F4D30
session_id:: 53 net_transport:: Session protocol_type:: TSQL
connection_id::05830BE9-F12F-429D-BBAC-E4EEB2C528EF
parent_connection_id:: 5AE50B7D-D919-4FBC-BA42-6069A12F4D30
上述输出表明与 SQL Server 之间存在两个连接:一个连接使用二进制协议 TDS,并且显示为 protocol_type:: TSQL;另一个连接对应于在运行该 Perl 脚本时生成的 SOAP/HTTP 连接。
我希望将您的注意力引到 session_id 列上面。该会话标识符和与该请求关联的数据库引擎中的 spid(会话进程标识符)匹配。有两个条目的 spid 等于 53,因为一个对应于物理连接(net_transport 是共享内存),另一个对应于在同一物理连接上进行的逻辑会话。(有关多个活动结果集的详细信息,请参阅 Multiple Active Result Sets (MARS) in SQLServer 2。)该逻辑会话的 parent_connection_id 与物理连接匹配这一事实证明了这一点。对于 TDS 而言,连接和会话紧密联系在一起;换句话说,用户无法从不同的物理连接加入现有的会话。SOAP 访问使用户能够通过在请求中指定适当的会话标头来加入现有会话。在 SOAP 中使用多个会话这一主题需要专门撰文加以阐述。感兴趣的读者可以阅读 SQL Server Books Online 来获得有关如何启用和使用会话的详细信息。
其他方案
现在,让我们考察其他一些方案。大多数数据库应用程序都在存储过程中内置了大量以数据为中心的逻辑。本机 XML Web 服务通过使得将存储过程公开为 Web 服务变得非常容易来利用这一投资。另外,本机 Web 服务还可以提高性能,因为数据访问是在进程内发生的,而不是被发送到中间层进程。
查找服务
当 SQL Server 宿主数据以供引用/查找时,可以使用 Web 服务作为公开该数据的理想机制。在该方案中,数据库充当大量数据的储存库。Web 服务利用数据库引擎查询处理功能来获取结果。此类查询中的结果集定义良好,并且大约为几个 KB。此类方案的示例包括:
产品目录
向用户返回特定于地区的信息(天气、交通)的具有位置意识的 Web 服务。
用于 Intranet 的雇员目录
报告生成服务
在很多方案中,数据库服务器宿主作为报告基础的数据。在 Intranet 内部,将这些报告公开为 Web 服务是很方便的。用户可以轻松地创建 T-SQL 存储过程,以便使用 SQL Server 中的 Web 服务生成和公开报告。您还可以轻松地将 Web 服务的结果嵌入到 Office 应用程序(如 Excel 和 InfoPath)中。这不仅使客户端应用程序可以更加容易地检索数据,而且还免除了数据库管理员的支持附加基础结构以便公开 Web 服务的负担。用户还能够使用本机 Web 服务的批处理访问功能来运行特殊查询和生成报告。
跨平台访问用户定义的类型
SQL Server 引入了对用户定义类型的支持。借助于用户定义的类型 (UDT),您可以扩展数据库的标量类型系统(不仅仅是为系统类型定义您自己的别名 — 该功能在以前版本的 SQL Server 中已经可用)。例如,您可以定义一个名为 Point 的 UDT 类型,以捕获点的 x 和 y 坐标。本机 Web 服务利用了公共语言运行库中提供的序列化框架,并且启用了诸如 XML 之类类型的传输。然后,客户端平台可以将该 XML 反序列化为在其平台上定义的对象。这就使 Java 客户端能够发送和接收 UDT 实例。
移动方案
现在,任何能够分析 XML 和提交 HTTP 请求的设备都可以访问 SQL Server。有了这一前提,再加上在丢弃连接时重新加入现有会话的能力,非常适合于为移动设备和不定时连接的设备开发应用程序,而这又使得随时、随地访问 SQL Server 成为可能。
异步服务
可以将本机 Web 服务与 SQL Service Broker(也通过 SQL Server 提供)结合使用,以便构建提供异步服务的解决方案。请考虑一个订单处理工作流。您可以公开一个 SQL Server Web 服务,该服务接收订单,并且通过立即确认它已经收到了该订单进行响应。然后,可以将该订单输入到服务代理程序队列中,以便进行处理。订单的履行可能需要调用其他 Web 服务。在履行该订单时,我们可以使用客户端已经预订的任何通知机制来通知该客户端。
小结
本机 XML Web 服务利用了您在数据库服务器方面的投资,并且使您的数据库能够作为服务提供程序参与工作。我已经详细说明了如何使用该功能提供对异类环境中 SQL Server 中宿主的数据的访问,并且描述了其他适合本机 Web 服务的方案。本机 XML Web 服务通过使范围更为广泛的客户端能够连接到 SQL Server,提高了互操作性,促进了服务的扩张。
(责任编辑:卢兆林)

