小魔女 发表于 2015-1-16 22:37:02

MYSQL网页设计SQL Server 本机 Web 服务的利用计划

由于MySQL数据库已经如此普及,对企业来说它无疑是一个更好的选择。server|web择要:取得有关怎样设置SQLServer以便在异类情况中举行Web服务会见的具体会商,而且懂得更多有关SQLServer中Web
服务的次要计划的信息。
下载相干的WebServicePerlScript.exe代码示例。
简介
在SQLServer中,我们向数据库引擎中增加了对本机XMLWeb服务的撑持。这一功效是环绕尽人皆知的尺度(如SOAP1.2
、WSDL1.1和HTTP)计划的。将办理计划创建在这些尺度之上,能够在年夜多半企业都具有的异类情况中撑持互操纵性和服务扩大。
增加到SQLServer中的新的基本布局年夜年夜有益于间接向服务器内部公然Web服务,这是由于将本机SOAP仓库内置到数据库
引擎中打消了利用两头层历程(如IIS)到达这一方针的必要。它还使SQLServer可以作为组件介入面向服务的系统布局,
由于服务在这些新的系统布局中供应了黏合剂。本机XMLWeb服务使您既能够将存储历程作为Web服务公然,并且能够针对
数据库服务器实行特别的T-SQL语句。实践上,我们已基于SOAP创立了一种新的会见SQLServer的机制;SOAP供应了
与以后的TabularDataStream(TDS)公用二进制协定几近不异的功效。
我们起首具体考查怎样设置SQLServer以便在异类情况中举行Web服务会见。我们将检察怎样利用Perl剧本举行数据库
办理,而且扼要考查一下其他可使用本机Web服务的计划。
异类会见
请思索如许一个情况,在这里,运转在非Microsoft操纵体系上的使用程序必要毗连到SQLServer。关于此类使用程序,
我们的倡议是利用SQLServer受权(SQL-Auth)毗连到SQLServerWeb服务。让我们考查一下该机制是怎样事情的。
要公然Web服务,用户必要做的第一件事变是创立一个闭幕点。请察看以下所示的用于创立闭幕点的数据界说言语(DDL)
语句。它将一个名为“GetCustomerInfo”的存储历程公然为Web服务。
注只管术语WEBMETHOD在观点上与ASP.NET中的不异,但它在其他方面与ASP.NET有关。
CREATEENDPOINTsql_auth_endpoint
STATE=STARTEDASHTTP(SITE=*,PATH=/sql/sql_auth,
AUTHENTICATION=(BASIC),PORTS=(SSL))
FORSOAP(
WEBMETHODGetCustomerInfo
(
name=AdventureWorks.dbo.GetCustomerInfo,
schema=STANDARD),
LOGIN_TYPE=MIXED,
WSDL=DEFAULT,
DATABASE=AdventureWorks,
BATCHES=ENABLED,
NAMESPACE=http://Adventure-Works/Customers/)
为了坚持SQLServer中的“计划平安”主题,我们在任何情形下都不同意对SQLServer举行ANONYMOUS会见。这意味
着一切毗连都必要利用受撑持的身份考证计划之一在HTTP传输级别举行身份考证。BASIC是最多见和利用最普遍的身份验
证模子之一,由于它遭到年夜多半客户真个撑持。可是,它也是最不平安的选择,由于它请求以明文发送暗码。为了不该成绩,
我们请求每中选择BASIC作为身份考证范例时,都要为SSL启用闭幕点。要启用SSL,必需实行以下命令:
httpcfgsetssl/iIP:Port/hHash/gGuid个中,Hash是证书哈希,Guid是一个标识注册该证书的实体的全局独一标识符(GUID)字符串。用户能够经由过程在Certificate
中查找Thumbprint值来猎取证书的哈希值。作为最好实行战略,请为SQLServer的每一个实例创立单个GUID,而且关于该实
例实行的一切证书注册,都利用统一个GUID。您可使用任何工具来发明该GUID值。Httpcfg.exe随附了Windows撑持工具。
因而,在该示例中,它将成为:
httpcfgsetssl/i1.1.1.1:443/h4463b7899c499a38812a7bbe7d73f4d31d026b2f/g
"{2bb50d9c-7f6a-4d6f-873d-5aee7fb43290}"
个中,1.1.1.1会被宿主SQLServer的盘算机的IP地点交换。
那末,怎样在闭幕点上启用SQL-Auth呢?这是经由过程在闭幕点语法的payload节中指定“LOGIN_TYPE=MIXED”完成的。通
过指定“MIXED”,您可使用集成式或SQL身份考证对SQLServer实例举行身份考证。如今,我们使SQL凭证可以作
为无效负载(动静)的一部分活动。在完成该事情时,我们已当心地确保传输凭证的SOAP标头与WS-SecurityUsername
标志相婚配。遵守WS-Security尺度天然能够进步互操纵性;比方,只需很少的几行代码,就能够利用WebServices
Enhancements2.0forMicrosoft.NET(WSE)天生用户名标志SOAP标头。
正如您能够在上述会商中看到的那样,存在两种级其余身份考证:
传输级别
动静级别
如今,让我们深切切磋这两个级其余身份考证是怎样事情的。
一切哀求老是在传输级别举行身份考证。因而,假如用户提交有效的BASIC身份考证凭证,则毗连失利,而且产生
HTTP401会见被回绝毛病。假如用户乐成地在传输级别举行身份考证,则我们具有两个选择。我们可使用传输凭
据或作为SOAP动静的一部分到来的凭证登录SQLServer。所选的凭证是由SOAP动静中是不是存在SQL-Auth凭
据断定的。假如SOAP动静中存在凭证,则我们将试图利用SQL-Auth凭证登录SQLServer数据库。假如该办法
失利,则我们向用户前往失利,而且我们不会前进到利用BASIC身份考证凭证。假如SOAP动静中不存在凭证,则
我们将试图利用传输凭证登录SQLServer。
包括SQL凭证的SOAP动静以下所示:
<?xmlversion="1.0"encoding="utf-8"?>:
<soap:Envelopexmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">:
<soap:Header>:
<Securityxmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-
200401-wss-wssecurity-secext-1.0.xsd"
xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">:
<wsse:UsernameToken>:
<wsse:Username>user</wsse:Username>:
<wsse:PasswordType="http://docs.oasis-
open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">:
password</wsse:Password>:
</wsse:UsernameToken>:
</Security>:
</soap:Header>:
<soap:Body>:
<GetCustomerInfoxmlns="http://Adventure-Works/Customers/">:
<CustomerID>1</CustomerID>:
<OutputParam>HelloWorld</OutputParam>:
</GetCustomerInfo>:
</soap:Body>:
</soap:Envelope>:

在SOAP动静中指定有效的凭证会发生以下SOAP毛病(该毛病被前往给用户):
<?xmlversion="1.0"encoding="utf-8"?>:
<SOAP-ENV:Envelopexml:space="preserve"xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:sql="http://schemas.microsoft.com/sqlserver/2004/SOAP"
xmlns:sqlsoaptypes="http://schemas.microsoft.com/sqlserver/2004/SOAP/types"xmlns:sqlrowcount="http://schemas.microsoft.com/sqlserver/2004/SOAP/types/SqlRowCount"xmlns:sqlmessage="http://schemas.microsoft.com/sqlserver/2004/SOAP/types/SqlMessage"xmlns:sqlresultstream="http://schemas.microsoft.com/sqlserver/2004/SOAP/types/SqlResultStream"xmlns:sqltransaction="http://schemas.microsoft.com/sqlserver/2004/SOAP/types/SqlTransaction"xmlns:sqltypes="http://schemas.microsoft.com/sqlserver/2004/sqltypes">:
<SOAP-ENV:Body>:
<SOAP-ENV:Faultxmlns:sqlsoapfaultcode="http://schemas.microsoft.com/sqlserver/2004/SOAP/SqlSoapFaultCode">:
<faultcode>SOAP-ENV:Client</faultcode>:
<faultstring>:
TherewasanerrorintheincomingSOAPrequestpacket:Client,LoginFailure,AccessDenied
</faultstring>:
<faultactor>http://schemas.microsoft.com/sqlserver/2004/SOAP</faultactor>:
<detailxmlns:SOAP-1_2-ENV="http://www.w3.org/2003/05/soap-envelope">:
<SOAP-1_2-ENV:Code>:
<SOAP-1_2-ENV:Value>SOAP-1_2-ENV:Sender</SOAP-1_2-ENV:Value>:
<SOAP-1_2-ENV:Subcode>:
<SOAP-1_2-ENV:Value>sqlsoapfaultcode:LoginFailure</SOAP-1_2-ENV:Value>:
<SOAP-1_2-ENV:Subcode>:
<SOAP-1_2-ENV:Value>sqlsoapfaultcode:AccessDenied</SOAP-1_2-ENV:Value>:
</SOAP-1_2-ENV:Subcode>:
</SOAP-1_2-ENV:Subcode>:
</SOAP-1_2-ENV:Code>:
<SOAP-1_2-ENV:Reason>:
<SOAP-1_2-ENV:Textxml:lang="en-US">:
TherewasanerrorintheincomingSOAPrequestpacket:
Sender,LoginFailure,AccessDenied
</SOAP-1_2-ENV:Text>:
</SOAP-1_2-ENV:Reason>:
<SOAP-1_2-ENV:Node>https://srikr-800.redmond.corp.microsoft.com:443/sql/sql_auth</SOAP-1_2-ENV:Node>:
<SOAP-1_2-ENV:Role>:
http://schemas.microsoft.com/sqlserver/2004/SOAP</SOAP-1_2-ENV:Role>:
<SOAP-1_2-ENV:Detail/>:
</detail>:
</SOAP-ENV:Fault>:
</SOAP-ENV:Body>:
</SOAP-ENV:Envelope>:
该办理计划只使用HTTP、SOAP、BASIC身份考证和SSL,这使它关于异类情况很幻想。鄙人一部分中,我们将看到怎样利
用该办理计划来创立Perl剧本,以便间接毗连到SQLServer。
利用Perl剧本举行办理和监督
经由过程SQLServer中的Web服务,能够从任何具有Web服务撑持的平台毗连到SQLServer。为了申明这一互操纵性
,我们将创立Perl剧本以毗连到SQLServer。Perl被广泛用于创立剧本,以便匡助办理和监督数据库服务器。
上面的示例申明了怎样创立Perl剧本以监督数据库的形态。SQLServer已引进了对静态办理视图的撑持,这些
视图供应了有关正在运转的服务器的静态形态信息。在该示例中,我们创立了一个Perl剧本,以便经由过程查询名为
dm_exec_connections的静态视图来监督与数据库之间的举动毗连的数目。
我们假定运转这段代码的盘算机已准确安装和设置了Perl。
这里的示例利用ActiveState5.8.xPerl软件包。该剧本使用以下软件包:
安装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软件包必要剖析
呼应并显现了局。
注有关完全剧本的信息,请拜见相干的下载。
上面的代码块将SOAPLite软件包实例化。我们必要明白请求将输入格局化为XML,以即可以剖析呼应。
my$soap=SOAP::Lite->:
uri(http://Adventure-Works/Customers/)->:
proxy(https://srikr-800/sql/sql_auth)->:
outputxml(1):
接上去,我们必要为该毗连设置凭证。由于我们盘算利用SQL-Auth,以是我们必要按以下体例初始化UsernameToken标头。
#sampleYukonsecuritySOAPheader
#<wsse:Securityxmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">:
#<wsse:UsernameToken>:
#<wsse:Username>sql_user</wsse:Username>:
#
<wsse:PasswordType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">:
foo-bar1</wsse:Password>:
#</wsse:UsernameToken>:
#</wsse:Security>:
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身份考证凭证是经由过程完成以下存根传进的:
subSOAP::Transport::HTTP::Client::get_basic_credentials{returnUser=>Password:
}
注倡议不要在剧本文件中存储/援用暗码。用户在处置暗码时应当遵守尺度的平安原则。
接上去,我们挪用Web办法。由于我们将实行T-SQL批处置语句,以是代码以下所示:
##Invokingasqlbatchtoretrievethenumberofconnections$soap->:
on_action(sub{return"";}):
$method=SOAP::Data->name(sqlbatch)->attr({xmlns=>:
http://schemas.microsoft.com/sqlserver/2004/SOAP}):
@param=(SOAP::Data->name(BatchCommands=>:
selectsession_id,net_transport,protocol_typefromsys.dm_exec_connections)):
最初,我们剖析XML呼应以检索数据:
formy$node($doc->getElementsByTagName("row")){print"
":
formy$kid($node->getChildNodes){print$kid->getNodeName():
print"::":
formy$gkid($kid->getChildNodes){print$gkid->getNodeValue():
#printtheactualvaluesforthecolumns}print"        ":
}print"
":
}
运转该Perl剧本能够天生以下输入:
TestingSOAP::LiteclientagainstAdventureWorksContactssamplewebservice.
CallingsqlbatchServerresponse...
Serverresponse...
session_id::54net_transport::HTTP
protocol_type::SOAP
connection_id::5EC2B4E2-39A6-4FA7-BBDB-144DAED59A41
session_id::53net_transport::Sharedmemory
protocol_type::TSQL
connection_id::5AE50B7D-D919-4FBC-BA42-6069A12F4D30
session_id::53net_transport::Sessionprotocol_type::TSQL
connection_id::05830BE9-F12F-429D-BBAC-E4EEB2C528EF
parent_connection_id::5AE50B7D-D919-4FBC-BA42-6069A12F4D30
上述输入标明与SQLServer之间存在两个毗连:一个毗连利用二进制协定TDS,而且显现为protocol_type::TSQL;
另外一个毗连对应于在运转该Perl剧本时天生的SOAP/HTTP毗连。
我但愿将您的注重力引到session_id列下面。该会话标识符和与该哀求联系关系的数据库引擎中的spid(会话历程标识符)婚配。
有两个条目标spid即是53,由于一个对应于物理毗连(net_transport是共享内存),另外一个对应于在统一物理毗连长进行
的逻辑会话。(有关多个举动了局集的具体信息,请参阅MultipleActiveResultSets(MARS)inSQLServer2。)该逻
辑会话的parent_connection_id与物理毗连婚配这一现实证实了这一点。关于TDS而言,毗连和会话严密接洽在一同;换
句话说,用户没法从分歧的物理毗连到场现有的会话。SOAP会见利用户可以经由过程在哀求中指定得当的会话标头来到场现有会话。
在SOAP中利用多个会话这一主题必要专门撰文加以论述。感乐趣的读者能够浏览SQLServerBooksOnline来取得有关如
何启用和利用会话的具体信息。
其他计划
如今,让我们考查其他一些计划。年夜多半数据库使用程序都在存储过程当中内置了大批以数据为中央的逻辑。本机XMLWeb服务
经由过程使得将存储历程公然为Web服务变得十分简单来使用这一投资。别的,本机Web服务还能够进步功能,由于数据会见是在
历程内产生的,而不是被发送到两头层历程。
查找服务
当SQLServer宿主数据以供援用/查找时,可使用Web服务作为公然该数据的幻想机制。在该计划中,数据库充任大批数据
的贮存库。Web服务使用数据库引擎查询处置功效来猎取了局。此类查询中的了局集界说优秀,而且约莫为几个KB。此类计划的示例包含:
产物目次
向用户前往特定于区域的信息(天色、交通)的具有地位认识的Web服务。
用于Intranet的雇员目次
呈报天生服务
在良多计划中,数据库服务器宿主作为呈报基本的数据。在Intranet外部,将这些呈报公然为Web服务是很便利的。用户可
以轻松地创立T-SQL存储历程,以便利用SQLServer中的Web服务天生和公然呈报。您还能够轻松地将Web服务的了局嵌
进到Office使用程序(如Excel和InfoPath)中。这不但使客户端使用程序能够加倍简单地检索数据,并且还免去了数
据库办理员的撑持附加基本布局以便公然Web服务的包袱。用户还可以利用本机Web服务的批处置会见功效来运转特别查询和天生呈报。
跨平台会见用户界说的范例
SQLServer引进了对用户界说范例的撑持。借助于用户界说的范例(UDT),您能够扩大数据库的标量范例体系(不单单是为系
统范例界说您本人的别号―该功效在之前版本的SQLServer中已可用)。比方,您能够界说一个名为Point的UDT范例,
以捕捉点的x和y坐标。本机Web服务使用了大众言语运转库中供应的序列化框架,而且启用了诸如XML之类范例的传输。
然后,客户端平台能够将该XML反序列化为在其平台上界说的工具。这就使Java客户端可以发送和吸收UDT实例。
挪动计划
如今,任何可以剖析XML和提交HTTP哀求的设备都能够会见SQLServer。有了这一条件,再加上在抛弃毗连时从头到场现
有会话的才能,十分合适于为挪动设备和不准时毗连的设备开辟使用程序,而这又使得随时、随地会见SQLServer成为大概。
异步服务
能够将本机Web服务与SQLServiceBroker(也经由过程SQLServer供应)分离利用,以便构建供应异步服务的办理计划。请
思索一个定单处置事情流。您能够公然一个SQLServerWeb服务,该服务吸收定单,而且经由过程当即确认它已收到了该定单进
行呼应。然后,能够将该定单输出到服务代办署理程序行列中,以便举行处置。定单的实行大概必要挪用其他Web服务。在实行该订
单时,我们可使用客户端已预订的任何关照机制来关照该客户端。
小结
本机XMLWeb服务使用了您在数据库服务器方面的投资,而且使您的数据库可以作为服务供应程序介入事情。我已具体申明了
怎样利用该功效供应对异类情况中SQLServer中宿主的数据的会见,而且形貌了其他合适本机Web服务的计划。本机XMLWeb
服务经由过程使局限更加普遍的客户端可以毗连到SQLServer,进步了互操纵性,增进了服务的扩大。
使用DBaaS能让收入损失从其他业务上得到弥补,如软件更新和硬件管理。也许决定走DBaaS之路的客户可能会跳过解决方案提供商,尽管这个决策看起来有点短视。

飘灵儿 发表于 2015-1-19 18:52:23

同样会为索引视图等应用带来麻烦。看看行级和事务级的快照数据放在tempdb中,就能感觉到目前架构的尴尬。

小魔女 发表于 2015-1-25 17:07:42

需要注意的一点,也是我使用过程中发现的一个问题。在建立function->schema->table后,如果在现有的分区表上建立没有显式声明的聚集索引时,分区表会自动变为非分区表。这一点很让我纳闷。

老尸 发表于 2015-2-3 11:55:38

也可谈一下你是怎么优化存储过程的?

灵魂腐蚀 发表于 2015-2-8 20:40:18

现在是在考虑:如果写到服务器端,我一下搞他个10个存储过程导过去,那久之服务器不就成垃圾箱了吗?即便优化了我的中间层.

小妖女 发表于 2015-2-26 08:49:47

大侠们有推荐的书籍和学习方法写下吧。

乐观 发表于 2015-3-15 23:09:48

我个人认为就是孜孜不懈的学习

第二个灵魂 发表于 2015-3-22 18:00:13

两个月啃那本sqlserver2005技术内部-存储引擎,花了几个月啃四本书
页: [1]
查看完整版本: MYSQL网页设计SQL Server 本机 Web 服务的利用计划