


有關(guān)SQL Server 2005 CLR
在SQL Server 2005的許多被大力推薦的特性里面,有一項(xiàng)可能對那些使用SQLServer 工作的編程人員最實(shí)用的是Common Language Runtime,或者簡寫為CLR。CLR可以讓編程人員直接在SQL Server中創(chuàng)建存儲過程、觸發(fā)器,用戶自定義函數(shù),集合體和類型。CLR有很多的承諾,但是也有一些缺陷。
關(guān)于CLR的重要性有一些主要的原因。首先,隨著SQL Server 編程技術(shù)的成熟,代碼編寫人員陷入了SQL Server自身的一些限制之中,并且在很大程度上依賴外部的代碼來執(zhí)行一些繁重的移植。T-SQL (事務(wù)處理SQL)在返回數(shù)據(jù)集方面很好,但是除了這個之外則表現(xiàn)不佳。CLR使得問題的解決有了可能,并且在SQL Server內(nèi)部進(jìn)行數(shù)據(jù)操作,而這些原本需要一個完全獨(dú)立的程序來實(shí)現(xiàn)的。.NET的操作代碼和執(zhí)行速度比SQL Server/T-SQL好得多;.NET中的同一位的代碼可以運(yùn)行更快地運(yùn)行許多次,當(dāng)它是二進(jìn)制的,而不是作為存儲過程來構(gòu)建時。
使用CLR的另一個巨大的好處就是安全。所有的代碼都在運(yùn)行前檢測類型和安全權(quán)限。例如,先前沒有被寫入的內(nèi)存是不允許被問題中的代碼讀取的。CLR也很完善;.NET框架中的每樣?xùn)|西都可以從存儲過程、觸發(fā)器或者用戶函數(shù)進(jìn)行訪問——除了處理類似用戶接口的類,它在SQL Server是無論如何不會有用的。
要防止CLR代碼胡亂運(yùn)行,微軟為CLR代碼的調(diào)用創(chuàng)建了一個三層的安全模型:SAFE, EXTERNAL_ACCESS 和 UNSAFE。SAFE權(quán)限集合在本質(zhì)上與傳統(tǒng)的存儲過程能夠做的事情一樣。在SQL Server之外不能對其進(jìn)行任何修改。EXTERNAL_ACCESS允許通過.NET對注冊表和文件系統(tǒng)進(jìn)行訪問。UNSAFE正如其名。標(biāo)記為UNSAFE的代碼不能做任何事情,并且它實(shí)際上是不應(yīng)該在調(diào)試或者實(shí)驗(yàn)環(huán)境之外使用的。大多數(shù)的編程人員應(yīng)該永遠(yuǎn)都不需要用到高于EXTERNAL_ACCESS級別的任何東西。(如果你需要在存儲過程或者函數(shù)的環(huán)境中與文件系統(tǒng)或者注冊表對話,這有可能意味著你需要重新考慮你嘗試的邏輯了。)
然而,CLR并不是適合一切。一方面,它可能適合那些不容易、需要進(jìn)行編程,在T-SQL中實(shí)現(xiàn)的環(huán)境。許多簡單的操作可以在T-SQL以存儲過程的方式完成,并且不需要擴(kuò)展到外部進(jìn)程。這意味著上下文交換和額外的事務(wù)開銷,這兩項(xiàng)中的任何一項(xiàng)開銷都能首先抹消你使用CLR獲得的速度提升。CLR最好用于替代擴(kuò)展存儲過程——例如,那些必須封閉在數(shù)據(jù)庫中,但是卻非常麻煩,無法用T-SQL從容完成,同時又不能輕松移動到業(yè)務(wù)邏輯末尾的事情。
另一個可能的缺點(diǎn)就是:正如SQL的領(lǐng)袖Rod Paddock在他的blog中指出的,如果你講業(yè)務(wù)邏輯中的某個元素移動到數(shù)據(jù)庫,那就可能會引起可測量性的問題。畢竟,SQL Server 更適合于按比例提高的單個大型機(jī)器,而不是橫跨在幾個比較小的機(jī)器(通常是按照業(yè)務(wù)比例來的)上。這一點(diǎn)指出了有選擇的使用CLR有多重要。T-SQL簡潔、有效;CLR/.NET昂貴并且范圍廣泛。正確的工作選擇正確的工具,盡管擁有眾多選擇也不錯。
關(guān)鍵字:SQL Server 2005 CLR、機(jī)器
新文章:
- CentOS7下圖形配置網(wǎng)絡(luò)的方法
- CentOS 7如何添加刪除用戶
- 如何解決centos7雙系統(tǒng)后丟失windows啟動項(xiàng)
- CentOS單網(wǎng)卡如何批量添加不同IP段
- CentOS下iconv命令的介紹
- Centos7 SSH密鑰登陸及密碼密鑰雙重驗(yàn)證詳解
- CentOS 7.1添加刪除用戶的方法
- CentOS查找/掃描局域網(wǎng)打印機(jī)IP講解
- CentOS7使用hostapd實(shí)現(xiàn)無AP模式的詳解
- su命令不能切換root的解決方法
- 解決VMware下CentOS7網(wǎng)絡(luò)重啟出錯
- 解決Centos7雙系統(tǒng)后丟失windows啟動項(xiàng)
- CentOS下如何避免文件覆蓋
- CentOS7和CentOS6系統(tǒng)有什么不同呢
- Centos 6.6默認(rèn)iptable規(guī)則詳解