亚洲成精品动漫久久精久,九九在线精品视频播放,黄色成人免费观看,三级成人影院,久碰久,四虎成人欧美精品在永久在线

掃一掃
關(guān)注微信公眾號

SQL Server 2005上的CLR和ADO.NET 2.0
2007-07-29   IT168 





通過集成CLR,SQL Server 2005已經(jīng)獲得了很多新的特性,借助CLR的集成可以用任何.NET語言建立存儲過程、觸發(fā)器、用戶自定義函數(shù)、用戶自定義類型、用戶自定義聚合。通過這個集成筆者認為SQL Server主要可以獲得如下優(yōu)勢。

提供了一個更加完善的開發(fā)模型,對于熟悉面向?qū)ο蟮拈_發(fā)人員和一直在SQL Server平臺進行T-SQL開發(fā)的開發(fā)人員都提供開發(fā)的舞臺。更深層次講,這兩類開發(fā)人員可以根據(jù)自己熟悉的領(lǐng)域?qū)?yīng)用進行優(yōu)化,T-SQL開發(fā)人員可以根據(jù)執(zhí)行計劃分析和優(yōu)化應(yīng)用,面向?qū)ο箝_發(fā)人員可以根據(jù)已有的Best Practice,借助代碼復(fù)查以優(yōu)化自己的應(yīng)用。

提供了更好的安全性,這個主要來源于CLR運行于托管環(huán)境的原因,通過運行過程中CAS(Code-Access Security),所有的代碼執(zhí)行過程都是在一個安全的調(diào)用鏈運行,與以往不同的是,即便用戶獲得了某個已開發(fā)好的功能的使用權(quán)限,但是如果該功能所使用的某個組件的安全性與目標資源的安全性相沖突,也會被CLR判斷為非法。

以往的代碼面臨的主要安全問題如下:

1.非授權(quán)使用或者越權(quán)使用;

2.代碼注入;

3.額外信息泄漏;

4.偽裝、欺騙代碼執(zhí)行;

""498)this.style.width=498;">

圖1:執(zhí)行過程中代碼主要面臨的安全問題

那么在CLR中,執(zhí)行每一個Assembly的時候都要基于既有的或者定制的安全策略進行訪問檢查,不僅僅是調(diào)用者權(quán)限檢查,也包括用戶與目標資源之間的訪問關(guān)系,更為主要的是在每個功能調(diào)用的過程中,還要檢查每上游組件的安全要求是否與自身安全要求抵觸,如果出現(xiàn)異常,那么這個調(diào)用鏈也會被終止。執(zhí)行過程如下:

""498)this.style.width=498;">

圖2:單個Assembly的執(zhí)行過程

""498)this.style.width=498;">

圖3:Assembly調(diào)用鏈的安全檢查

這樣做的好處在于:可以大大豐富SQL Server的對象系統(tǒng)。

相信很多T-SQL設(shè)計人員在進行數(shù)據(jù)庫設(shè)計的時候,會碰到因為相對非常有限的數(shù)據(jù)類型無法描述業(yè)務(wù)對象的情況。但有了CLR的支持,SQL Server 2005可以描述的對象系統(tǒng)基本上擴展為無限。但是,筆者這里根據(jù)經(jīng)驗提醒用戶在使用該功能的時候要注意如下幾個內(nèi)容:

1.設(shè)計新的數(shù)據(jù)對象要考慮到中間結(jié)果的存儲問題。

2.涉及到查詢的時候還是要考慮采用T-SQL,這主要是出于效率問題。

3.盡可能考慮到事件、Delegate回調(diào)對于處理性能的影響,不是必要的話盡量不用。



可以把整個開發(fā)的流程完全集成到統(tǒng)一的Visual Studio 2005中,全開發(fā)生命期可以在一個框架下完成。

更深層次講,在完成統(tǒng)一個項目的時候,可以充分利用CLR進行復(fù)雜數(shù)據(jù)結(jié)構(gòu)的計算能力效率和T-SQL的關(guān)系數(shù)據(jù)處理能力優(yōu)勢。

開發(fā)基于CLR的數(shù)據(jù)庫對象

通過CLR的集成,可以在SQL Server 2005中建立如下的一些數(shù)據(jù)類型:

Scalar-valued user-defined functions (scalar UDFs)

Table-valued user-defined functions (TVFs)

User-defined procedures (UDPs)

User-defined triggers

上述四個類型算是基本的數(shù)據(jù)類型,因為它可以直接地映射到類的公共靜態(tài)方法,除此之外還可以定義更為復(fù)雜的用戶聚合函數(shù)。由于受到訪問能力的限制,在SQL Server 2000中用戶自定義函數(shù)能訪問的對象有限,但是SQL Server 2005借助.NET平臺甚至于可以把一些計算通過協(xié)調(diào)遠端的Web Service一并完成。

筆者認為,在SQL Server 2005平臺上,開發(fā)人員的思維要具有擴展性,不僅要考慮SQL Server 本身支持的內(nèi)容,還要考慮到Windows平臺支持的內(nèi)容、企業(yè)內(nèi)部SOA其他應(yīng)用的支持,直至整個Internet環(huán)境下的任何可以用資源。

""498)this.style.width=498;">

圖3:CLR支持后擴展數(shù)據(jù)對象的資源分布

相對而言,開發(fā)User-Function和User-Defined Procedure都是比較容易,這里筆者就開發(fā)CLR 觸發(fā)器作些說明。正如大家所知,Trigger主要包括兩類:“DML 觸發(fā)器”和“DDL 觸發(fā)器”。DML觸發(fā)器主要在DELETE、UPDATE、INSERT的時候觸發(fā),DDL 觸發(fā)器則會在CREATE、ALTER、DROP的時候觸發(fā)。在使用T-SQL編寫觸發(fā)器的時候可以通過INSERTED和DELETED這兩個虛表,結(jié)合COLUMN_UPDATED()函數(shù)完成DML事件的響應(yīng)。在集成了CLR之后,用.NET語言寫觸發(fā)器可以訪問如下內(nèi)容:

繼續(xù)訪問DELETED和INSERTED這兩個虛表;

通過UPDATE操作,判斷哪些列受到了修改;

通過訪問數(shù)據(jù)庫對象獲得DDL的執(zhí)行語句;

除此而外,開發(fā)CLR 觸發(fā)器的時候還可以通過SqlContext.TriggerContext獲得當(dāng)前操作的上下文,明確究竟是DML的INSERT、UPDATE、DELETE,還是DDL的CREATE、DROP、ALTER操作。

代碼示例1:INSERT或DELETE操作的DML觸發(fā)器寫法

SqlConnection connection = new SqlConnection ("context connection = true");

connection.Open();

SqlCommand command = connection.CreateCommand();

command.CommandText = "SELECT * from " + "inserted";

代碼實例2:判斷哪些列被UPDATE

reader = command.ExecuteReader();

reader.Read();

for (int columnNumber = 0; columnNumber < triggContext.ColumnCount; columnNumber++)

{

pipe.Send("Updated column "

+ reader.GetName(columnNumber) + "? "

+ triggContext.IsUpdatedColumn(columnNumber).ToString());

}

reader.Close();

代碼實例3:通過訪問Context判斷DLL操作的內(nèi)容

using System;

using System.Data;

using System.Data.Sql;

using Microsoft.SqlServer.Server;

using System.Data.SqlClient;

using System.Data.SqlTypes;

using System.Xml;

using System.Text.RegularExpressions;

public class CLRTriggers

{

public static void DropTableTrigger()

{

SqlTriggerContext triggContext = SqlContext.TriggerContext;

switch(triggContext.TriggerAction)

{

case TriggerAction.DropTable:

SqlContext.Pipe.Send("Table dropped! Here's the EventData:");

SqlContext.Pipe.Send(triggContext.EventData.Value);

break;

default:

SqlContext.Pipe.Send("Something happened!

Here's the EventData:");

SqlContext.Pipe.Send(triggContext.EventData.Value);

break;

}

}

}

SQL Server 2005上的ADO.NET 2.0



SQL Server 2005對于應(yīng)用開發(fā)業(yè)提供了一系列新的功能,不過很多需要通過ADO.NET 2.0來訪問。根據(jù)筆者的經(jīng)驗,如果您確定您的產(chǎn)品或者項目依托于SQL Server 2005,而不是做數(shù)據(jù)庫產(chǎn)品無關(guān)的通用產(chǎn)品的話,完全可以考慮這些新的特性,但是要注意這些特性很可能會改變您的很多應(yīng)用架構(gòu)。

不會影響到系統(tǒng)構(gòu)架的新特性如下:

(1)新的數(shù)據(jù)類型,包括XML數(shù)據(jù);



(2)支持Snapshot級的事務(wù)隔離級別;

(3) 支持系統(tǒng)快速高可用功能的Mirroring;

但是,下面一些功能將會影響到您的系統(tǒng)架構(gòu):

(1)一步的SQL Server訪問

(2)MARS (Multiple Active Result Set),不僅可以讓您復(fù)用與數(shù)據(jù)庫的連接,而且還可以在源數(shù)據(jù)更新的時候,主動根據(jù)SQL Server觸發(fā)更新。

事務(wù)的控制上,ADO.NET 2.0可以借助SQL Server自己的事務(wù)機制或者System.Transactions的支持,可以用非常簡單的方式使用本地或者分布式事務(wù)。如果你的數(shù)據(jù)操作僅僅限于當(dāng)前一個固定的SQL Server,那么筆者建議您采用Promotion的輕量級交易機制。你所要做的就是在SqlConnection的ConnectionString屬性定義時增加一個Enlist關(guān)鍵字即可,這樣當(dāng)你的ADO.NET訪問涉及DML操作時,CLR會自動為您增加一個事務(wù),保證操作的原子性。但如果你的操作不僅僅限于當(dāng)前SQL Server,還要訪問其他異構(gòu)數(shù)據(jù)庫或者隊列之類的其他對象,那么您需要分布式事務(wù)的支持,這時候您需要在DTC的調(diào)度下,同時使用SQL Server 2005本地事務(wù)、System.Transactions和System.Data.SqlClient三者,把整個處理包裝到一個代價比較昂貴的分布式交易中。總而言之,到底要使用那種事務(wù)處理,要看您的應(yīng)用需要。

筆者要提醒您注意的是,在CLR的托管代碼支持下,SQL Server 2005采用CLR 事務(wù)和T-SQL的事務(wù)有很大的區(qū)別:

CLR中定義的包括事務(wù)的處理內(nèi)容必須被ROLLBACK或者COMMIT,除非SQL Server在處理內(nèi)容沒有執(zhí)行結(jié)束之前出現(xiàn)嚴重錯誤,導(dǎo)致內(nèi)容不能執(zhí)行結(jié)束。

(1)出現(xiàn)事務(wù)嵌套時,內(nèi)部事務(wù)不可以ROLLBACK或者COMMIT外部的事務(wù)。

(2)不要試圖提交非本Function或者Procedure的事務(wù),這樣會導(dǎo)致Run-Time Error。

(3) 試圖回退非本Function或者Procedure的事務(wù)時,會導(dǎo)致事務(wù)執(zhí)行掛起,借助該特性可以用來調(diào)試事務(wù)內(nèi)部的內(nèi)容。

XML的串行化支持

SQL Server 2000僅僅提供了有限的HTTP直接訪問支持,但是在引入了CLR 集成后,Internet / Intranet應(yīng)用可以借助于XML串行化,直接以XML方式訪問系統(tǒng)的用戶自定義類型數(shù)據(jù),尤其對于給予HTTP訪問BLOB對象的時候也可以支持,此外可以在SQL Server內(nèi)部通過該特性訪問Web Service。

熱詞搜索:

上一篇:啟明星辰天清漢馬防火墻多功能安全網(wǎng)關(guān)
下一篇:Integration Services:高性能策略

分享到: 收藏