Python和SQL Server 2017的強大功能

Python和SQL Server 2017的強大功能

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的示例,顯示數據庫如何觸發外部進程來對做爲參數提供的數據執行活動。這是爲了考慮安全性,數據可靠性和事務響應時間的問題。git

Python的用例

經過從SQL調用Python腳本而不是依賴於中間件,能夠更容易地完成某些任務。特別是在數據庫中事件發起任務的狀況下。任務可能包括程序員

  1. 經過TCP / HTTP / SOAP向網絡系統發送數據或從基於網絡的系統接收數據。
  2. 利用本地平臺資源,如文件系統,網絡或GPU。
  3. 經過使用通用數據格式(如JSON,XML或YAML)構建一個或多個系統之間的實時集成。
  4. 經過與外部應用程序通訊生成數據或文件。

固然也不免存在一些潛在的缺點github

  1. 若是您使用Python須要互聯網訪問,那麼存在必須保持安全的數據可能會被意外地經過互聯網共享的風險。任何互聯網訪問必須由網絡仔細監管。
  2. 容許經過「啓用外部腳本執行」在服務器上執行Python腳原本暴露安全風險。
  3. 相同服務器上的資源密集型Python腳本可能會影響大型OLTP系統上正在進行的事務的性能。

衡量這些優勢和缺點,彷佛有時候Python能夠發揮有用的做用,若是能夠最小化風險。做爲一個例子,讓咱們考慮一下咱們如何使用Python構建數據緩存系統供應用層使用。sql

緩存示例解決方案

緩存數據能夠提升應用程序的性能。以緩存的存儲開銷爲代價,當遇到與數據庫的聊天網絡通訊以及數據庫面臨重複查詢時資源消耗高的狀況下,咱們能夠得到有用的性能提高。當咱們構建緩存基礎架構時,咱們面臨着何時刷新緩存的內容的常見問題。咱們傾向於在必定時間間隔以後採用重建緩存的簡單解決方案。然而,這是很是低效的。當數據更改時刷新緩存更好,只刷新改變的內容。在建立,更新或刪除數據時,咱們能夠實時接近實時。有許多工具和框架可用於解決刷新問題,可是它們受到如何肯定數據發生變化以及什麼時候發生更改的問題。數據庫是最好的全部可以作到這一點。數據庫

對於咱們這裏提供的緩存系統,咱們將把本身限制在微軟堆棧中,以防止Python自己。json

  • Microsoft SQL Server 2017(CPT)windows

    • 服務代理隔離事務數據庫。
    • Python執行腳本,能夠經過HTTP更新緩存(Python 3.5可執行文件與Anaconda發行版中的庫)
  • .Net 4.5.2數組

    • ASP.Net MVC爲咱們的示例Web UI
    • ASP.Net WebAPI封裝緩存存儲爲咱們的示例解決方案。

如下是咱們的示例解決方案緩存系統的圖示:
pic1

  • WebApplication提供用於讀取和更新數據的用戶界面。
  • 咱們示例緩存存儲解決方案中的RESTful.Cache應用程序是使用ASP.Net WebAPI2構建的,其內容類型爲JSON。 HTTP-GET操做從本地緩存(靜態集合)傳送數據。
  • MS SQL Server 2017(CPT)是一個數據庫服務器

    • TransDB OLTP數據庫,處理事務繁忙。
    • Cacher執行Python腳本執行的代理數據庫,啓用了啓用「外部腳本啓用」選項的腳本執行。 請參閱Microsoft.Doc:啓用外部腳本的服務器配置選項
    • Service Broker是SQL服務器的可靠消息傳遞框架,有助於橋接Cacher-Agent和TransDB。 能夠處理Cacher-Agent接收到的消息來更新緩存。
  • Python是使用SQL 2017(CPT)的數據庫系統的集成腳本語言

解決方案的架構

在咱們的解決方案中,咱們將在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;

  1. TransDB和Cacher託管的環境應該在其實例上建立一個Service Broker端點,若是這兩個端點獨立託管在兩個不一樣的SQL實例上,那麼每一個實例應該有本身的端點。
  2. TransDB和Cacher數據庫應該啓用代理。 請參閱Microsoft.Technet:如何:激活數據庫中的Service Broker消息傳遞.aspx)
  3. ALTER DATABASE TransDB SET ENABLE_BROKER;

    GO

ALTER DATABASE CacheDB SET ENABLE_BROKER;
GO

.NET應用程序

WebApplication有兩個主要的MVC動做; 一個使用HTTP動詞POST更新TransDB中的一個新實體,另外一個使用HTTP動詞GET從緩存返回產品類型列表的操做。

pic2

RESTful.Cache有兩種操做方法,一種是使用HTTP動詞POST更新新添加的實體產品類型的緩存,另外一種用於從本地緩存獲取全部緩存的產品類型。

pic3

對於咱們的示例解決方案,這兩個應用程序都在IIS中託管在各個應用程序池標識下,以保護應用程序安全 可是對於實際的系統實現,託管環境能夠是內部網或互聯網環境中的單個Web服務器。

pic4

RESTful.Cache受權規則只有兩個服務賬戶來處理HTTP請求,即

pic5

abc WebApp_SVC和abc CacherAgent_SVC。 abc CacherAgent_SVC服務賬戶容許SQL中的Python腳本經過HTTP到達應用程序來刷新緩存。

abc WebApp_SVC用戶用於具備受權規則模式的WebApplication,以容許訪問RESTful.Cache應用程序。

SQL數據庫和服務代理

OLTP數據庫TransDB有幾個對象,包括表,存儲過程和Service Broker對象。

pic6

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腳本更新緩存。

Cacher數據庫具備:

  1. CacheLog和CacheIntegrationError表,以跟蹤緩存什麼時候被刷新,而且具備在緩存刷新過程當中可能發生的任何錯誤的記錄。
  2. PerformCacheUpdate過程經過Service Broker從TransDB接收傳入消息。若是消息的類型是UpdateMessage,那麼它將執行另外一個過程UpdateWebCache,執行Python腳本執行。

    1. UpdateWebCache過程的執行結果保存在表變量中,而後在消息對話結束時插入到CacheLog表中。
    2. 當接收到的消息具備錯誤或結束消息類型時,過程也會結束會話,而且在錯誤類型上,將異常日誌寫入CacheIntegrationError表中。
  3. UpdateWebCache過程從做爲參數傳遞的傳入XML消息中提取Id和Name,並將這些值嵌入到Python腳本文本中。腳本執行結果集是類型爲UpddateCacheLog的結構化表。

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腳本時,有一些值得注意的事情。

  1. 咱們能夠編寫一個連續的腳本或將它們分組到咱們在這個解決方案中所作的方法中。或者,咱們能夠建立一個內聯類或建立一個包,並在命令提示符下使用PIP命令在python中導入它們。
  2. 在這個MST的CPT版本中,import語句只能在它放置的範圍內導入包,所以咱們能夠注意到ImportCache中存在導入請求import語句,而且import語句導入熊貓存在於腳本的頂部在腳本的最後。
  3. 方法UpdateCache的輸出對象當即轉換爲數組,這樣pandas.DataFrame能夠將對象轉換成數據結構,SQL Server能夠輕鬆地將其解釋爲具備行和列的表。
  4. 分配給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)容許服務代理程序網絡訪問.aspx)以獲取更多詳細信息。

全部組件放在一塊兒

放置全部組件後,咱們的WebApplication容許咱們建立一個新的ProductType,並經過RESTful HTTP調用從刷新的緩存中列出相同的產品類型。 在牆後面有管理數據的組件,高速緩存對前端應用程序是不可見的。

結論

諸如電子商務,醫療電子治理等應用能夠從良好的緩存實現中受益。經過擴展咱們熟悉的技術的使用,咱們能夠得到易於維護的解決方案,而無需學習新框架或功能的成本。

咱們的示例解決方案符合咱們所須要的

  • 當經過其中一個OLTP事務建立或修改數據時,系統刷新基於網絡的緩存系統進行讀取訪問。
  • 它可以使用異步事件來刷新緩存,靠近實時。這不會影響原始交易的表現。
  • 它能夠經過HTTP在事務和緩存系統之間繪製一條安全線,以保持數據在OLTP數據庫中的安全。
  • 它具備最小的監控功能;一個緩存日誌和異常日誌,能夠進一步增強構建管理控制檯。
  • 使用Service Broker消息組件,解決方案足夠靈活,能夠在異步消息處理髮生時觸發或到達基於網絡的系統。換句話說,數據庫與SQL Service Broker消息集成在一塊兒,而且基於接收到的數據,執行一個動做來獲取或發送數據到外部數據層之外的系統。
  • 經過使用服務代理消息隔離外部系統觸發專用數據庫內的事件有助於保護OLTP數據庫的事務和數據。

The source code for this project is available here in githib.
https://github.com/hi10p/SQL17Python

相關文章
相關標籤/搜索