【摘要】數(shù)據(jù)庫(kù)作為一個(gè)共享資源,數(shù)據(jù)庫(kù)中提供的信息必須準(zhǔn)確有效,為了防止出現(xiàn)不符合語(yǔ)義的數(shù)據(jù),防止錯(cuò)誤信息的輸入和不一致的數(shù)據(jù),數(shù)據(jù)庫(kù)管理系統(tǒng)必須提供一定的機(jī)制來(lái)保證數(shù)據(jù)的完整性。作為一個(gè)功能強(qiáng)大的數(shù)據(jù)庫(kù)管理系統(tǒng),SQL Server提供了多種完整性規(guī)則來(lái)保證數(shù)據(jù)的完整性。
【關(guān)鍵詞】SQL Server;數(shù)據(jù)完整性;數(shù)據(jù)庫(kù)系統(tǒng);約束
數(shù)據(jù)的完整性是指數(shù)據(jù)庫(kù)中數(shù)據(jù)的正確性、有效性和一致性。正確性是指數(shù)據(jù)的合法性;有效性是指數(shù)據(jù)是否在定義的有效范圍;一致性是指表示同一個(gè)事實(shí)的兩個(gè)數(shù)據(jù)應(yīng)相同。數(shù)據(jù)庫(kù)管理系統(tǒng)要提供必要的功能,保證數(shù)據(jù)庫(kù)中存儲(chǔ)的數(shù)據(jù)在更新過(guò)程中始終與客觀世界實(shí)際的信息狀態(tài)保持一致。數(shù)據(jù)完整性包括:實(shí)體完整性,它是指主鍵的值不能為空或部分為空,如果主鍵為空或部分為空,則失去了主鍵的惟一標(biāo)識(shí)性。參照完整性是指一個(gè)表的外部鍵必須在另一個(gè)表中找到或者為空。參照完整性反映了事物之間的相互聯(lián)系。用戶(hù)自定義完整性是針對(duì)具體應(yīng)用環(huán)境數(shù)據(jù)必須滿(mǎn)足的語(yǔ)義要求。
1.數(shù)據(jù)完整性的界定
SQL Server 2003是一種比較復(fù)雜的數(shù)據(jù)庫(kù),主要靠?jī)?nèi)部的映射關(guān)系的一種數(shù)據(jù)庫(kù),這種數(shù)據(jù)庫(kù)的服務(wù)一般來(lái)說(shuō)是對(duì)于復(fù)制、集成、分析、通知以及報(bào)表等相關(guān)服務(wù)的融合,此外,Visual Studio.NET等第三方開(kāi)發(fā)工具的有效結(jié)合。因此,本系統(tǒng)使將用SQL Server 2003數(shù)據(jù)庫(kù)。
首先,.NET Framework 與SQL Server 2003有機(jī)結(jié)合的過(guò)程中,SQL Server利用.NET平臺(tái)特有的公用語(yǔ)言運(yùn)行時(shí)(CLR-Common Language Runtime)的特性來(lái)生成數(shù)據(jù)庫(kù)的相關(guān)對(duì)象,在數(shù)據(jù)庫(kù)管理系統(tǒng)中充分利用.NET代碼的功能。
其次,借助SQL Server 2003,可以為網(wǎng)頁(yè)服務(wù)開(kāi)發(fā)提供便利,這樣,SQL Server使用的是 HTTP技術(shù),對(duì)于以Web服務(wù)為中心的應(yīng)用程序的數(shù)據(jù)訪問(wèn)得以更新。
最后,SQL Server 2003還新增了T-SQL事務(wù)語(yǔ)句,從而實(shí)現(xiàn)了可伸縮性數(shù)據(jù)庫(kù)應(yīng)用的開(kāi)發(fā)語(yǔ)言功能的拓展。
數(shù)據(jù)庫(kù)設(shè)計(jì)是針對(duì)應(yīng)用需求和環(huán)境,建立合理的數(shù)據(jù)庫(kù)模式和存儲(chǔ)結(jié)構(gòu),保證數(shù)據(jù)的高效存取,并滿(mǎn)足應(yīng)用的任務(wù)處理要求。
數(shù)據(jù)庫(kù)設(shè)計(jì)過(guò)程分為4個(gè)階段:需求分析、概念設(shè)計(jì)、邏輯設(shè)計(jì)、物理設(shè)計(jì)。需求分析包括數(shù)據(jù)分析和功能分析。確定用戶(hù)要達(dá)到的目標(biāo),從這些目標(biāo)中獲得數(shù)據(jù)庫(kù)的要求,并整理成說(shuō)明書(shū),包括數(shù)據(jù)流程圖、約束條件、技術(shù)指標(biāo)等信息。概念設(shè)計(jì)產(chǎn)生反映企業(yè)組織信息需求的數(shù)據(jù)庫(kù)概念結(jié)構(gòu),概念設(shè)計(jì)的主要方法是采用E-R方法和數(shù)據(jù)字典。邏輯設(shè)計(jì)是從概念模型導(dǎo)出特定的數(shù)據(jù)庫(kù)邏輯模式,在功能、性能、完整性和一致性約束及數(shù)據(jù)庫(kù)可擴(kuò)展性等方面均應(yīng)滿(mǎn)足用戶(hù)提出的要求。邏輯設(shè)計(jì)中,將E-R圖轉(zhuǎn)換為關(guān)系模型。物理設(shè)計(jì)是從滿(mǎn)足用戶(hù)需求的、已確定邏輯數(shù)據(jù)庫(kù)結(jié)構(gòu)轉(zhuǎn)換出一個(gè)有效的、可實(shí)現(xiàn)的物理數(shù)據(jù)庫(kù)結(jié)構(gòu)的過(guò)程。最終生成一個(gè)物理設(shè)計(jì)說(shuō)明書(shū),在實(shí)現(xiàn)數(shù)據(jù)庫(kù)時(shí)根據(jù)說(shuō)明書(shū)進(jìn)行操作。
1.1規(guī)范化
第一范式(1NF):數(shù)據(jù)表中每一個(gè)數(shù)據(jù)項(xiàng)均不能拆分成兩個(gè)或兩個(gè)以上的數(shù)據(jù)項(xiàng)。
第二范式(2NF):數(shù)據(jù)表滿(mǎn)足第一范式,并且數(shù)據(jù)表中任何一個(gè)非主鍵字段的數(shù)值都依賴(lài)于主鍵。
第三范式(3NF):數(shù)據(jù)表滿(mǎn)足第二范式,并且數(shù)據(jù)表中任何兩個(gè)非主鍵字段的數(shù)值之間不存在函數(shù)依賴(lài)。
1.2數(shù)據(jù)完整性
(1)實(shí)體完整性:設(shè)置主鍵、唯一鍵、唯一索引、標(biāo)識(shí)列等方法實(shí)現(xiàn)。
(2)域完整性:設(shè)置默認(rèn)值、檢查、外鍵、數(shù)據(jù)類(lèi)型、規(guī)則等方法實(shí)現(xiàn)。
(3)參照完整性:設(shè)置外鍵、檢查、觸發(fā)器、存儲(chǔ)過(guò)程等方法實(shí)現(xiàn)。
(4)用戶(hù)定義完整性:設(shè)置規(guī)則、觸發(fā)器、存儲(chǔ)過(guò)程、約束等實(shí)現(xiàn)。
2.實(shí)現(xiàn)數(shù)據(jù)完整性的實(shí)現(xiàn)
2.1數(shù)據(jù)庫(kù)的連接
數(shù)據(jù)庫(kù)連接:(ADO通過(guò)OLEDB實(shí)現(xiàn)對(duì)不同數(shù)據(jù)源的訪問(wèn))
(1)初始化COM庫(kù):在CMannagementApp::InitInstance中調(diào)用:CoInitialize(NULL)
(2)初始化數(shù)據(jù)庫(kù):在CManagementDlg的構(gòu)造函數(shù)中實(shí)現(xiàn):
CSting strConnection=\"driver={SQL Server};
Server=127.0.0.1; DATABASE=QUEStoneDB; UID=sa;PWD=123;\";
pDB=new CADODatabase;
pDB->Open(strConnection);
(3)使用創(chuàng)建記錄集:pRs=new CADORecordest(pDB0;
(4)操作完成后關(guān)閉并釋放記錄集指針:
if(pRs pRs->IsOpen())
pRs->Close();
if(pRs)
delete(pRs);
(5)退出系統(tǒng)時(shí)釋放數(shù)據(jù)庫(kù)指針
在CManagementDlg的析構(gòu)函數(shù)中實(shí)現(xiàn)
if(pRs pRs->IsOpen())
pRs->Close();
if(pRs)
delete(pRs);
(6)退出系統(tǒng)時(shí)清除COM庫(kù):
在CManagementApp::ExitInstance中調(diào)用::CoUninitialize();
2.2 ADO.NET 中SQL Server xsgl數(shù)據(jù)庫(kù)建立連接的代碼
String cnStr= \"Password=sa;Persist Security Info=True; User ID=sa;\"+\"Initial Catalog=xsgl; Data Source=B402\";//服務(wù)器名稱(chēng)
SqlConnection cn=new SqlConnection();
cn.ConnectionString=cnStr;
cn.open();
ConnectionString屬性是Connection對(duì)象最重要的一個(gè)屬性,他用來(lái)指定與數(shù)據(jù)庫(kù)建立連接時(shí)使用的連接串,連接串包涵有源數(shù)據(jù)庫(kù)的名稱(chēng)和建立初始連接所需的其他參數(shù),例如用戶(hù)名和密碼這些信息。
2.3使用ASP.net /c#連接access和sql server數(shù)據(jù)庫(kù)
using system.data.oledb;引用命名空間,string strconnection=\"procider=microsoft.jet.oledb.4.0;\";數(shù)據(jù)庫(kù)提供者。
strconnection+=@\"data source=c:\begaspnet\northwind.mdb\";數(shù)據(jù)源標(biāo)準(zhǔn)形式data source=mydrive:mypath\myfile.mdb@防止后面的\解析為轉(zhuǎn)義字符oledbconnection objconnection=new oledbconnection(strconnection);利用定義好的字符串建立連接對(duì)象方便后面使用strconnection 是存放連接數(shù)據(jù)庫(kù)中使用的 提供者和數(shù)據(jù)源兩個(gè)變量如果連接的數(shù)據(jù)庫(kù)文件和當(dāng)前文件在同一個(gè)目錄下strconnection+=\"data source=”;\+=mappath(\"northwind.mdb\")。
2.4 sql server 連接
String strconnectiong=\"user id=;pwd=;\";
strconnection+=\"initial catalog=northwind;server=yoursqlserver;\";
strconnection+=\"connect timeout=30\";
sqlconnection objconnection=new sqlconnection(strconnection);
2.5 C#訪問(wèn)數(shù)據(jù)庫(kù)的幾種函數(shù)和參數(shù)
(1)Provider,指定要連接的數(shù)據(jù)源種類(lèi)。如果使用的是SQL Server DataProvider,則不需要指定Provider參數(shù),因?yàn)镾QL Server DataProvider已經(jīng)指定了所要連接的數(shù)據(jù)源是SQL Server服務(wù)器。如果使用的是OleDB Data Provider 或者其他的連接數(shù)據(jù)源,則不需指定Provider參數(shù)對(duì)應(yīng)關(guān)系 : SQLOLEDB對(duì)應(yīng)于Microsoft OLEDB Provider for SQL Server,
MSDASQL對(duì)應(yīng)于Microsoft OLEDB Provider for ODBC
Microsoft.Jet.OLEDB.4.0對(duì)應(yīng)于Microsoft OLEDB Provider for Access
MSDAORA對(duì)應(yīng)于Microsoft OLEDB Provider for Oracle
(2)Server,指定需要連接的數(shù)據(jù)庫(kù)服務(wù)器(或者數(shù)據(jù)域)。比如Server=(local),指定連接的數(shù)據(jù)庫(kù)服務(wù)器是在本地。如果本地的數(shù)據(jù)庫(kù)還定義了實(shí)例名,Server參數(shù)可以寫(xiě)成Server=(local)\實(shí)例名。另外,可以使用計(jì)算機(jī)名作為服務(wù)器的值。如果連接的是遠(yuǎn)程的服務(wù)器,Server參數(shù)可以寫(xiě)成Server=IP或者\(yùn)"Server=遠(yuǎn)程計(jì)算機(jī)名\"的形式 Server參數(shù)也可以寫(xiě)成Data Source,比如Data Source=IP。
\"server=(local);Initial Catalog=student;user Id=sa;password=;\"=\"Data Source=(localhost);Initial Catalog=student;user Id=sa;password=;\"
(3)DataBase:
DataBase參數(shù)用來(lái)指定連接的數(shù)據(jù)庫(kù)名。比如DataBase=Master,說(shuō)明連接的數(shù)據(jù)庫(kù)是Master,DataBase參數(shù)也可以寫(xiě)成Initial Catalog,如 Initial Catalog=Master。
(4)Uid參數(shù)和Pwd參數(shù):
指定登錄數(shù)據(jù)庫(kù)的用戶(hù)名和密碼。
(5)Connect Timeout參數(shù):
指定打開(kāi)數(shù)據(jù)庫(kù)時(shí)最大的等待時(shí)間,單位是秒。如果不設(shè)置此參數(shù),默認(rèn)是15秒。如果設(shè)置-1表示無(wú)限期等待,一般不推薦使用。
(6)Intergrated Security參數(shù):
用來(lái)說(shuō)明登錄到數(shù)據(jù)源時(shí)是否使用SQL Server的集成安全驗(yàn)證。如果該參數(shù)的取值是True(或者SSPI,或者YES),表示使用Windows驗(yàn)證模式,即不需要通過(guò)Uid和Pwd這樣的方式登錄。如果取值是False或者No,表示登錄時(shí)使用Uid和Pwd方式登錄。一般來(lái)說(shuō),使用集成安全驗(yàn)證的登錄方式比較安全,因?yàn)檫@種方式不會(huì)暴露用戶(hù)名和密碼。安裝SQL Server時(shí),如果選中”Windows身份驗(yàn)證模式“單選按鈕則應(yīng)該使用如下的連接字符串:Data Source=(local);Init Catalog=student;Integrated Security=SSPI。
(7)Pooling、MaxPool Size和Min Pool Size參數(shù):
Pooling參數(shù)用來(lái)說(shuō)明在連接到數(shù)據(jù)源時(shí),是否使用連接池,默認(rèn)是True。當(dāng)改值為T(mén)rue時(shí),系統(tǒng)從適當(dāng)?shù)某刂刑崛QLConnection對(duì)象,或者需要時(shí)創(chuàng)建該對(duì)象并將其添加進(jìn)去。當(dāng)Fasle時(shí),不適用連接池。
當(dāng)應(yīng)用程序連接到數(shù)據(jù)源或者創(chuàng)建連接對(duì)象時(shí),系統(tǒng)不僅要開(kāi)銷(xiāo)一定的通信和內(nèi)存資源,還必須完成諸如建立物理通道(例如套接字或命名管道),與服務(wù)器進(jìn)行初次握手,分析連接字符串信息,由服務(wù)器對(duì)連接進(jìn)行身份驗(yàn)證,運(yùn)行檢查以便在當(dāng)前事務(wù)中登記等任務(wù),因此往往成為最為耗時(shí)的操作。
實(shí)際上,大多數(shù)應(yīng)用程序使用一個(gè)或幾個(gè)不同的連接配置。這意味著在執(zhí)行應(yīng)用程序期間,許多相同的連接將反復(fù)地打開(kāi)和關(guān)閉。為了使打開(kāi)的連接成本最低,ADO.NET使用稱(chēng)為Pooling的優(yōu)化方法。
在連接池中們?yōu)榱颂岣邤?shù)據(jù)庫(kù)的連接效率,根據(jù)實(shí)際情況,預(yù)先存放了若干數(shù)據(jù)庫(kù)連接對(duì)象,這些對(duì)象即使在用完后也不會(huì)被釋放。應(yīng)用程序不是向數(shù)據(jù)源申請(qǐng)連接對(duì)象,而是向連接池盛情數(shù)據(jù)庫(kù)的連接對(duì)象。另外,連接池中的連接對(duì)象數(shù)量必須同實(shí)際需求相符,空置和滿(mǎn)載都對(duì)數(shù)據(jù)庫(kù)的連接效率不利。
Max Pool Size和Min Pool Size這兩個(gè)參數(shù)分別表示連接池中最大和最小連接數(shù)量,默認(rèn)分別是100和0。根據(jù)實(shí)際應(yīng)用適當(dāng)?shù)厝≈祵⑻岣邤?shù)據(jù)庫(kù)的連接效率。
3.結(jié)束語(yǔ)
數(shù)據(jù)的完整性是數(shù)據(jù)庫(kù)應(yīng)用系統(tǒng)最基本的要求之一,在SQL Server數(shù)據(jù)庫(kù)應(yīng)用系統(tǒng)中可采用在服務(wù)器端數(shù)據(jù)表上定義完整性約束,創(chuàng)建數(shù)據(jù)表的完整性規(guī)則、默認(rèn)和觸發(fā)器,或者通過(guò)客戶(hù)端應(yīng)用程序控制等三種方式來(lái)進(jìn)行數(shù)據(jù)的完整性保護(hù)。在開(kāi)發(fā)應(yīng)用系統(tǒng)中,應(yīng)根據(jù)各種完整性約束的優(yōu)點(diǎn)并將它們結(jié)合起來(lái)使用,充分發(fā)揮SQL Server提供的數(shù)據(jù)完整性的效能,在確保數(shù)據(jù)準(zhǔn)確性和一致性方面減少對(duì)用戶(hù)的依賴(lài)性,從而大大提高系統(tǒng)的可靠性。
【參考文獻(xiàn)】
[1]楊正洪.SQL Server7.0關(guān)系數(shù)據(jù)庫(kù)系統(tǒng)管理與開(kāi)發(fā)指南.機(jī)械工業(yè)部出版社,2000.
[2]薛華成.管理信息系統(tǒng).清華大學(xué)出版社,1995.
[3]薩師煊,王珊.數(shù)據(jù)庫(kù)系統(tǒng)概論(第三版)[M].北京:高等教育出版社.2002.
[4]羅遠(yuǎn)模,王珊.SQL Server數(shù)據(jù)庫(kù)系統(tǒng)基礎(chǔ)[M].北京:高等教育出版社,2002.