Python是SQL Server 2017的新功能。它主要是为了容许在SQL Server中使用基于Python的机器学习,可是它能够与任何Python库或框架一块儿使用。 为了提供可能的例子,Hitendra展现了如何安全地使用该功能来提供智能应用程序缓存,其中SQL Server能够自动指示数据什么时候更改以触发缓存刷新。前端
MS SQL Server 2017已经经过启用SQL服务器经过“使用Python的机器学习服务”在TSQL中执行Python脚本,添加到其高级分析扩展,如今称为“机器学习服务”。这基本上提供了一种数据库程序员能够直接从Python传递数据的方法。这样作的有用性不只限于为数据分析提供机器学习功能,由于Python具备许多易于使用的模块和框架来解决许多问题,例如使用数据结构执行大量计算工做,用于分析的图形处理,网络操做,数据库操做,网络操做或基于本地/网络的文件系统操做。显然,其中许多在中间件方面作得最好,可是在数据库系统中,有时候直接与外部系统通讯,而不是依靠外部进程经过轮询数据源来执行任务更方便。若是在数据库或数据层中有一个这样的解决方案,而且不提供任何安全性问题时,这不是问题。python
在这里,咱们将尝试演示在Advanced Analytics Extension中使用Python的示例,显示数据库如何触发外部进程来对做为参数提供的数据执行活动。 这是为了考虑安全性,数据可靠性和事务响应时间的问题。程序员
Python的用例数据库
经过从SQL调用Python脚本而不是依赖于中间件,能够更容易地完成某些任务。 特别是在数据库中事件发起任务的状况下。 任务可能包括json
1.经过TCP / HTTP / SOAP向基于网络的系统发送数据或从其接收数据。数组
2.使用本地平台资源,如文件系统,网络或GPU。缓存
3.经过使用通用数据格式(如JSON,XML或YAML)构建一个或多个系统之间的实时集成。安全
4.经过与外部应用程序通讯生成数据或文件。服务器
固然,不多有潜在的缺点网络
1.若是您使用Python须要互联网访问,那么存在必须保持安全的数据可能会被互联网意外分享的风险。 任何互联网访问必须由网络仔细监管。
2.容许经过“启用外部脚本执行”在服务器上执行Python脚原本暴露安全风险。
3.同一台服务器上的资源密集型Python脚本可能会影响大型OLTP系统上正在进行的事务的性能。
衡量这些优势和缺点,彷佛有时候Python能够发挥有用的做用,若是能够最小化风险。 做为一个例子,让咱们考虑一下咱们如何使用Python构建数据缓存系统供应用层使用。
缓存示例解决方案
缓存数据能够提升应用程序的性能。以缓存的存储开销为代价,当遇到与数据库的聊天网络通讯以及数据库面临重复查询时资源消耗高的状况下,咱们能够得到有用的性能提高。当咱们构建缓存基础架构时,咱们面临着何时刷新缓存的内容的常见问题。咱们倾向于在必定时间间隔以后采用重建缓存的简单解决方案。然而,这是很是低效的。当数据更改时刷新缓存更好,只刷新改变的内容。在建立,更新或删除数据时,咱们能够实时接近实时。有许多工具和框架可用于解决刷新问题,可是它们受到如何肯定数据发生变化以及什么时候发生更改的问题。数据库是最好的全部可以作到这一点。
对于咱们这里提供的缓存系统,咱们将把本身限制在微软堆栈中,以防止Python自己。
如下是咱们的示例解决方案缓存系统的图示:
解决方案的架构
在咱们的解决方案中,咱们将在RESTful.Cache应用程序中缓存实体“产品类型名称”,而且WebApplication将具备建立新产品类型条目并从RESTful.Cache读取的功能。
条件
除此以外,还有一些先决条件和一些咱们须要考虑的信息。
1.托管CacheDB的SQL实例必须安装“具备Python的机器学习服务”
2.要在CacheDB中使用TSQL执行Python脚本,应运行SQL Service MSSQLLaunchpad或SQL Server Launchpad。 请参阅Microsoft.Net:Microsoft机器学习服务
3.使用SP_Configure启用外部脚本执行,请参阅Microsoft.Doc:启用外部脚本的服务器配置选项
sp_configure 'external scripts enabled', 1;
RECONFIGURE;
4.TransDB和Cacher托管的环境应该在其实例上建立一个Service Broker端点,若是这两个端点独立托管在两个不一样的SQL实例上,那么每一个实例应该有本身的端点。
5.TransDB和Cacher数据库应该启用代理。 请参阅Microsoft.Technet:如何:激活数据库中的Service Broker消息传递
6.ALTER DATABASE TransDB SET ENABLE_BROKER;
GO
ALTER DATABASE CacheDB SET ENABLE_BROKER;
GO
.NET应用程序
WebApplication有两个主要的MVC动做; 一个使用HTTP动词POST更新TransDB中的一个新实体,另外一个使用HTTP动词GET从缓存返回产品类型列表的操做。
RESTful.Cache有两种操做方法,一种是使用HTTP动词POST更新新添加的实体产品类型的缓存,另外一种用于从本地缓存获取全部缓存的产品类型。
对于咱们的示例解决方案,这两个应用程序都在IIS中托管在各个应用程序池标识下,以保护应用程序安全 可是对于实际的系统实现,托管环境能够是内部网或互联网环境中的单个Web服务器。
RESTful.Cache受权规则只有两个服务账户来处理HTTP请求,即
abc \ WebApp_SVC和abc \ CacherAgent_SVC。 abc \ CacherAgent_SVC服务账户容许SQL中的Python脚本经过HTTP到达应用程序来刷新缓存。
abc \ WebApp_SVC用户用于具备受权规则模式的WebApplication,以容许访问RESTful.Cache应用程序。
SQL数据库和服务代理
OLTP数据库TransDB有几个对象,包括表,存储过程和Service Broker对象。
为了咱们的目的,过程UpdateProductType使用新记录更新ProductType表,而且AcknowledgeProductTypeCache过程是CacheIntegration队列的激活过程,当正在处理消息时即从Cacher数据库接收来自目标的确认。 它还处理异常,若是有的话,并将其记录在CacheIntegrationError表中。
有关Service Broker的更多信息,请访问Microsoft.DOC:SQL Server Service Broker
对于咱们的示例解决方案,TransDB是建立新的ProductType记录时建立更新缓存消息的源数据库,执行操做的消息,它具备UpdateMessage消息类型,CacheIntegration合同将CacheSource服务发送到目标 数据库。 该服务具备CacheQueue,由Service Broker组件用于执行可靠的消息传递。 ToCacheTarget路由具备将消息传递到其目标的信息。
为了消除任何增长事务处理时间的机会以及避免事务数据库中其他数据的任何安全风险,咱们将经过使用咱们的示例解决方案中名为Cacher数据库的代理数据库来解除缓存更新过程。 Service Broker消息传递基础设施将有助于链接TransDB和Cacher数据库,基于事件的消息处理将使咱们可以更新驻留在基于网络的系统上的缓存存储。 Cacher数据库正在扮演代理角色,以便在更新消息到达时执行缓存刷新。 它经过执行Python脚本更新缓存。
1.CacheLog和CacheIntegrationError表,以跟踪缓存什么时候被刷新,而且具备缓存刷新过程当中可能发生的任何错误的记录。
2. PerformCacheUpdate过程经过Service Broker从TransDB接收传入的消息。 若是消息的类型是UpdateMessage,那么它将执行另外一个过程UpdateWebCache,执行Python脚本执行。
a.1. UpdateWebCache过程的执行结果保存在表变量中,而后在消息对话结束时插入到CacheLog表中。
b.当接收到的消息具备错误或结束消息类型时,过程也会结束对话,而且在错误类型上,将异常日志写入CacheIntegrationError表中。
Cacher的Service Broker对象,主要是UpdateMessage消息类型和CacheIntegration契约与TransDB的相同,CacheQueue有一个称为PerfomCacheUpdate的激活过程,一个名为CacheTarget的服务,该路由具备有关TransDB服务CacheService和端点地址的信息。
对于咱们的示例解决方案,数据库队列的最大队列读取器设置为1。 若是须要,能够增长这一点,例如,若是数据修改很高,而且您须要增长缓存刷新率。
服务代理端点
对于咱们的解决方案,数据库托管在同一个实例上,所以二者都使用相同的Service Broker Endpoint来发送和接收消息。
可是,若是咱们要在单个实例上托管数据库,那么每一个SQL实例的服务账户都应该有一个Service Broker端点。 而且这两个SQL实例都应该有权限容许将消息发送到对方的端点。 链接的受权和授予能够经过如下TSQL命令集完成。 请注意,在消息传递基础结构中,有一个发送方,另外一方是接收方,正如所提到的,若是SQL实例是发送方和接收方的一部分,则每一个实例都应该有本身的进程标识。 下图显示了每一个SQL Server在其自身身份下运行的方式。
这是用于在Cacher数据库的SQL实例中受权和授予端点链接到TransDB的SQL实例服务账户[identity]的SQL代码。
ALTER AUTHORIZATION ON ENDPOINT::ServiceBrokerEndpoint TO [abc\TransDB_SVC]
GO
GRANT CONNECT ON ENDPOINT::ServiceBrokerEndpoint TO [abc\TransDB_SVC]
GO
一样,这里是用于受权和授予端点链接到Cache SQL数据库SQL实例服务账户[identity]的代码。
ALTER AUTHORIZATION ON ENDPOINT::ServiceBrokerEndpoint TO [abc\CacherAgent_SVC]
GO
GRANT CONNECT ON ENDPOINT::ServiceBrokerEndpoint TO [abc\CacherAgent_SVC]
GO
Python脚本
这是Python脚本文本,在TSQL变量@UpdateCache中保存为字符串。 它具备具备逻辑的UpdateCache方法,经过传递具备做为输入参数接收的Name和Id字段的数据对象来对RESTful.Cache执行HTTP POST调用。 它接收一个JSON对象,并将其做为方法的输出结果返回给调用者。
在脚本结束时,返回的对象被转换为数组,所以能够将其结构化为SQL结果。
DECLARE @UpdateCache NVARCHAR(MAX) = N'
import pandas as PND #data structure package
def UpdateCache(name,id):
import requests as HTTP #http request package
#Perfom HTTP POST to update cache
httpRequest = HTTP.post( http://localhost/RESTful.Cache/ProductType/UpdateCache ,{ Name :name, Id :id})
cacheLog = httpRequest.json()
return cacheLog
#Update cache and build log element
log = [UpdateCache( '+ @Name+' ,'+ CAST(@Id as VARCHAR(10)) +')]
#Return data frame i.e. table structure from SQL
OutputDataSet = PND.DataFrame(data=log)
';
在SQL Server中使用Python脚本时,有一些值得注意的事情。
咱们能够编写一个连续脚本或将它们分组到咱们在这个解决方案中所作的方法中。或者,咱们能够建立一个内联类或建立一个包,并在命令提示符下使用PIP命令在python中导入它们。
2.在这个CPT版本的MS SQL中,import语句只能在它放置的范围内导入包,所以咱们能够注意到ImportCache中存在导入请求import语句,而在import脚本的顶部存在import语句导入熊猫一行在脚本的末尾。
3. UpdateCache方法的输出对象当即转换为数组,这样pandas.DataFrame能够将对象转换成数据结构,SQL Server能够轻松地将其解释为具备行和列的表。
分配给OutputDataSet对象的数据结构在SQL Server的TSQL执行上下文中可用。
5.最后一行程序dbo.UpdateWebCache,WITH RESULT SETS(AS TYPE dbo.UpdateCacheLog);具备用户定义的表类型dbo.UpdateCacheLog,它有助于保持底层列的顺序,并避免在从接收的数据结构生成结果集的过程当中发生任何不匹配。另外一种方法是在Python和结果集中构建映射列结构。
数据库安全
TransDB是一个OLTP数据库,咱们不但愿对系统发生任何安全漏洞,所以,经过咱们的示例解决方案,这种数据库能够托管在未安装“机器学习服务”的SQL实例上。 Cacher是可以到达基于网络的系统的代理,所以能够保留在安装机器学习服务的SQL实例上。 两个SQL实例均可以具备单独的服务账户身份,该身份已被受权仅链接到特定端口的Service Broker端点。 安全认证通讯的另外一种方法是使用证书。 对于Service Broker端点受权,请参阅Microsoft.Technet:如何:经过使用证书(Transact-SQL)容许服务代理程序网络访问以获取更多详细信息。
全部组件放在一块儿
放置全部组件后,咱们的WebApplication容许咱们建立一个新的ProductType,并经过RESTful HTTP调用从刷新的缓存中列出相同的产品类型。 在墙后面有管理数据的组件,高速缓存对前端应用程序是不可见的。
结论
诸如电子商务,医疗电子治理等应用能够从良好的缓存实现中受益。 经过扩展咱们熟悉的技术的使用,咱们能够得到易于维护的解决方案,而无需学习新框架或功能的成本。
咱们的示例解决方案符合咱们所须要的
l ·当数据由其中一个OLTP事务建立或修改时,系统将刷新基于网络的缓存系统进行读取访问。
l ·它可以使用异步事件来刷新缓存,靠近实时。这不会影响原始交易的表现。
l ·能够经过HTTP在事务和缓存系统之间画一条安全线,以保护数据在OLTP数据库中的安全。
l 启用了最小的监控功能;一个缓存日志和异常日志,能够进一步增强构建管理控制台。
l ·使用Service Broker消息传递组件,当异步消息处理发生时,解决方案足够灵活,能够触发或到达基于网络的系统。换句话说,数据库与SQL Service Broker消息集成在一块儿,而且基于接收到的数据,执行一个动做来获取或发送数据到外部数据层之外的系统。
l ·经过使用服务代理消息传递外部系统触发专用数据库内的事件有助于保护OLTP数据库的事务和数据。