![數(shù)據(jù)庫(kù)的管理_第1頁(yè)](http://file4.renrendoc.com/view5/M01/30/1E/wKhkGGYQ8oKAGTFRAASYCct9nag806.jpg)
![數(shù)據(jù)庫(kù)的管理_第2頁(yè)](http://file4.renrendoc.com/view5/M01/30/1E/wKhkGGYQ8oKAGTFRAASYCct9nag8062.jpg)
![數(shù)據(jù)庫(kù)的管理_第3頁(yè)](http://file4.renrendoc.com/view5/M01/30/1E/wKhkGGYQ8oKAGTFRAASYCct9nag8063.jpg)
![數(shù)據(jù)庫(kù)的管理_第4頁(yè)](http://file4.renrendoc.com/view5/M01/30/1E/wKhkGGYQ8oKAGTFRAASYCct9nag8064.jpg)
![數(shù)據(jù)庫(kù)的管理_第5頁(yè)](http://file4.renrendoc.com/view5/M01/30/1E/wKhkGGYQ8oKAGTFRAASYCct9nag8065.jpg)
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第6章數(shù)據(jù)庫(kù)的管理數(shù)據(jù)庫(kù)管理的主要目的是,防止不合法用戶對(duì)數(shù)據(jù)庫(kù)進(jìn)行非法操作,實(shí)現(xiàn)數(shù)據(jù)庫(kù)的平安性;防止不合法數(shù)據(jù)進(jìn)入數(shù)據(jù)庫(kù),實(shí)現(xiàn)數(shù)據(jù)庫(kù)的完整性;防止并發(fā)操作產(chǎn)生的事務(wù)不一致性,進(jìn)行并發(fā)控制;防止計(jì)算機(jī)系統(tǒng)硬件故障、軟件錯(cuò)誤、操作操作等所造成的數(shù)據(jù)喪失,采取必要的數(shù)據(jù)備份措施,并能從錯(cuò)誤狀態(tài)恢復(fù)到正確狀態(tài)。本章從數(shù)據(jù)庫(kù)管理系統(tǒng)的角度講述數(shù)據(jù)庫(kù)管理的原理和方法,主要介紹數(shù)據(jù)庫(kù)的平安性、完整性、并發(fā)控制和恢復(fù)技術(shù),并以SQLServer為例進(jìn)行具體說(shuō)明。6.1數(shù)據(jù)庫(kù)的平安性6.1.1數(shù)據(jù)庫(kù)平安性概述數(shù)據(jù)庫(kù)的平安性是指保護(hù)數(shù)據(jù)庫(kù)以防止非法用戶訪問(wèn)數(shù)據(jù)庫(kù),造成數(shù)據(jù)泄露、更改或破壞。在數(shù)據(jù)庫(kù)系統(tǒng)中大量數(shù)據(jù)集中存放,并為許多用戶直接共享,數(shù)據(jù)庫(kù)的平安性相對(duì)于其它系統(tǒng)尤其重要。實(shí)現(xiàn)數(shù)據(jù)庫(kù)的平安性是數(shù)據(jù)庫(kù)管理系統(tǒng)的重要指標(biāo)之一。數(shù)據(jù)庫(kù)的平安性不是孤立的。在網(wǎng)絡(luò)環(huán)境下,數(shù)據(jù)庫(kù)的平安性與三個(gè)層次相關(guān):網(wǎng)絡(luò)系統(tǒng)層、操作系統(tǒng)層、數(shù)據(jù)庫(kù)管理系統(tǒng)層。這三層共同構(gòu)筑起數(shù)據(jù)庫(kù)的平安體系,它們與數(shù)據(jù)庫(kù)的平安性逐步緊密,重要性逐層加強(qiáng),從外到內(nèi)保證數(shù)據(jù)庫(kù)的平安性。在規(guī)劃和設(shè)計(jì)數(shù)據(jù)庫(kù)的平安性時(shí),要綜合每一層的平安性,使三層之間相互支持和配合,提高整個(gè)系統(tǒng)的平安性。在此只討論數(shù)據(jù)庫(kù)管理系統(tǒng)對(duì)數(shù)據(jù)庫(kù)進(jìn)行平安管理的問(wèn)題,網(wǎng)絡(luò)系統(tǒng)層的平安性、操作系統(tǒng)層的平安性不做介紹。影響數(shù)據(jù)庫(kù)平安性的因素很多,不僅有軟硬件因素,還有環(huán)境和人的因素;不僅涉及技術(shù)問(wèn)題,還涉及管理問(wèn)題、政策法律問(wèn)題等等。其內(nèi)容包括計(jì)算機(jī)平安理論、策略、技術(shù),計(jì)算機(jī)平安管理、評(píng)價(jià)、監(jiān)督,計(jì)算機(jī)平安犯罪、偵察、法律等等。概括起來(lái),計(jì)算機(jī)系統(tǒng)的平安性問(wèn)題可分為三大類,即:技術(shù)平安類、管理平安類和政策法律類。此處只在技術(shù)層面介紹數(shù)據(jù)庫(kù)的平安性。為了準(zhǔn)確地測(cè)定和評(píng)估計(jì)算機(jī)系統(tǒng)的平安性能指標(biāo),標(biāo)準(zhǔn)和指導(dǎo)計(jì)算機(jī)系統(tǒng)的生產(chǎn),逐步建立和開(kāi)展了一套“可信計(jì)算機(jī)系統(tǒng)評(píng)測(cè)標(biāo)準(zhǔn)”。其中最重要的是1985年美國(guó)國(guó)防部(DoD)公布的《DoD可信計(jì)算機(jī)系統(tǒng)評(píng)估標(biāo)準(zhǔn)》(TrustedComputerSystemEvaluationCriteria,簡(jiǎn)稱TCSEC,稱桔皮書(shū))和1991年美國(guó)國(guó)家計(jì)算機(jī)平安中心(NCSC)公布的《可信計(jì)算機(jī)系統(tǒng)評(píng)估標(biāo)準(zhǔn)關(guān)于可信數(shù)據(jù)庫(kù)系統(tǒng)的解釋》(TrustedDatabaseInterpretatution,簡(jiǎn)稱TDI,稱紫皮書(shū))。TDI將TCSEC擴(kuò)展到數(shù)據(jù)庫(kù)管理系統(tǒng),定義了數(shù)據(jù)庫(kù)管理系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)中需要滿足和用以進(jìn)行平安性級(jí)別評(píng)估的標(biāo)準(zhǔn)。TCSEC/TDI將系統(tǒng)劃分為DCBA四組,D;C1;C2;B1;B2;B3;A1從低到高七個(gè)等級(jí)。較高平安等級(jí)提供的平安保護(hù)要包含較低等級(jí)的所有保護(hù)要求,同時(shí)提供更多更完善的保護(hù)能力。七個(gè)平安等級(jí)的根本要求如下:D級(jí):提供最小保護(hù)(MinimalProtection)??梢詫⒉环细邩?biāo)準(zhǔn)的系統(tǒng)歸于D級(jí)。如:DOS就是操作系統(tǒng)中平安標(biāo)準(zhǔn)為D的典型例子,它具有操作系統(tǒng)的根本功能,如文件系統(tǒng),進(jìn)程調(diào)度等等,但在平安性方面幾乎沒(méi)有什么專門的機(jī)制來(lái)保障。C1級(jí):提供自主平安保護(hù)(DiscretionarySecurityProtection〕。實(shí)現(xiàn)用戶和數(shù)據(jù)的別離,進(jìn)行自主存取控制(DiscretionaryAccessControl,簡(jiǎn)記為DAC),保護(hù)和限制用戶權(quán)限的傳播。C2級(jí):提供受控的存取保護(hù)(ControlledAccessProtection)。將C1級(jí)的DAC進(jìn)一步細(xì)化,以個(gè)人身份注冊(cè)負(fù)責(zé),并實(shí)施審計(jì)和隔離,是平安產(chǎn)品的最低檔次。B1級(jí):標(biāo)記平安保護(hù)(LabeledSecurityProtection)。對(duì)系統(tǒng)的數(shù)據(jù)加以標(biāo)記,并對(duì)標(biāo)記的主體和客體實(shí)施強(qiáng)制存取控制(MandatoryAccessControl,簡(jiǎn)記為MAC)。B1級(jí)能夠較好地滿足大型企業(yè)或一般政府部門對(duì)于數(shù)據(jù)的平安需求,這一級(jí)別的產(chǎn)品才認(rèn)為是真正意義上的平安產(chǎn)品。滿足此級(jí)別的產(chǎn)品多冠以“平安”(Security)或“可信的”(Trusted)字樣,作為區(qū)別于普通產(chǎn)品的平安產(chǎn)品出售。在數(shù)據(jù)庫(kù)管理系統(tǒng)方面有Oracle公司的TrustedOracle7,Sybase公司的SecureSQLServerversion11.0.6,Informix公司的IncorporatedINFORMIX-OnLine/Secure5.0。B2級(jí):結(jié)構(gòu)化保護(hù)(StructuralProtection)。建立形式化的平安策略模型并對(duì)系統(tǒng)內(nèi)的所有主體和客體實(shí)施DAC和MAC。到達(dá)B2級(jí)的系統(tǒng)非常稀少,在數(shù)據(jù)庫(kù)方面暫時(shí)沒(méi)有此級(jí)別的產(chǎn)品。B3級(jí):平安域保護(hù)(SecurityDomains)。該級(jí)的可信任運(yùn)算根底(TrustedComputingBase,TCB)必須滿足訪問(wèn)監(jiān)控器的要求,審計(jì)跟蹤能力更強(qiáng),并提供系統(tǒng)恢復(fù)過(guò)程。A1級(jí):驗(yàn)證設(shè)計(jì)(VerifiedDesign)。提供B3級(jí)保護(hù)的同時(shí)給出系統(tǒng)的形式化設(shè)計(jì)說(shuō)明和驗(yàn)證以確信各平安保護(hù)真正實(shí)現(xiàn)。從分級(jí)標(biāo)準(zhǔn)可以看出,支持自主存取控制〔DAC〕的DBMS屬于C1級(jí),支持審計(jì)功能的DBMS屬于C2級(jí),支持強(qiáng)制存取控制〔MAC〕的DBMS那么可以到達(dá)B1級(jí)。B2以上的系統(tǒng)標(biāo)準(zhǔn)更多地還處于理論研究階段,產(chǎn)品化以至商品化的程度都不高,其應(yīng)用也多限于一些特殊的部門如軍隊(duì)等。下面以B1級(jí)標(biāo)準(zhǔn)中的用戶標(biāo)識(shí)和鑒別、存取控制〔DAC和MAC〕、審計(jì)等功能進(jìn)行介紹。6.1.2用戶標(biāo)識(shí)和鑒別用戶標(biāo)識(shí)(Identification)和鑒別(Authentication是數(shù)據(jù)庫(kù)系統(tǒng)提供的最外層平安保護(hù)措施。其方法是由系統(tǒng)提供一定的方式讓用戶標(biāo)識(shí)自己的身份,每次用戶要求進(jìn)入系統(tǒng)時(shí),通過(guò)鑒別后才提供系統(tǒng)使用權(quán)。用戶標(biāo)識(shí)的鑒別方法有多種途徑,可以委托操作系統(tǒng)進(jìn)行鑒別,可以委托專門的全局驗(yàn)證效勞器進(jìn)行鑒別。一般數(shù)據(jù)庫(kù)管理系統(tǒng)提供了用戶標(biāo)識(shí)和鑒別機(jī)制。用一個(gè)用戶名或者用戶標(biāo)識(shí)號(hào)來(lái)標(biāo)明用戶身份。系統(tǒng)內(nèi)部記錄著所有合法用戶的標(biāo)識(shí),系統(tǒng)鑒別此用戶是否合法,假設(shè)是,那么進(jìn)入口令的核實(shí);假設(shè)不是,那么不能使用系統(tǒng)。口令(Password),為了進(jìn)一步鑒別用戶,系統(tǒng)常常要求用戶輸入口令。為保密起見(jiàn),用戶在終端上輸入的口令不顯示在屏幕上,系統(tǒng)核對(duì)口令以鑒別用戶身份。通過(guò)用戶名和口令來(lái)鑒定用戶的方法簡(jiǎn)單易行,但用戶名與口令容易被人竊取,因此還可以用更復(fù)雜的方法。例如每個(gè)用戶都預(yù)先約定好一個(gè)計(jì)算過(guò)程或者函數(shù),鑒別用戶身份時(shí),系統(tǒng)提供一個(gè)隨機(jī)數(shù),用戶根據(jù)自己預(yù)先約定的計(jì)算過(guò)程或者函數(shù)進(jìn)行計(jì)算,系統(tǒng)根據(jù)用戶計(jì)算結(jié)果是否正確進(jìn)一步鑒定用戶身份。用戶可以約定比擬簡(jiǎn)單的計(jì)算過(guò)程或函數(shù),以便計(jì)算起來(lái)方便;也可以約定比擬復(fù)雜的計(jì)算過(guò)程或函數(shù),以便平安性更好。6.1.3存儲(chǔ)控制數(shù)據(jù)庫(kù)平安主要是指DBMS的存取控制機(jī)制。數(shù)據(jù)庫(kù)平安最重要的一點(diǎn)就是確保只有授權(quán)用戶訪問(wèn)數(shù)據(jù)庫(kù),同時(shí)令所有未被授權(quán)的人員無(wú)法接近數(shù)據(jù),這主要通過(guò)數(shù)據(jù)庫(kù)系統(tǒng)的存取控制機(jī)制實(shí)現(xiàn)。存取控制機(jī)制主要包括兩局部:(1)用戶權(quán)限定義。用戶權(quán)限是指不同的用戶對(duì)于不同的數(shù)據(jù)對(duì)象允許執(zhí)行的操作權(quán)限。系統(tǒng)必須提供適當(dāng)?shù)恼Z(yǔ)言定義用戶權(quán)限,這些定義經(jīng)過(guò)編譯后存放在數(shù)據(jù)字典中,被稱作平安規(guī)那么。(2)合法權(quán)限檢查。每當(dāng)用戶發(fā)出存取數(shù)據(jù)庫(kù)的操作請(qǐng)求后,DBMS查找數(shù)據(jù)字典,根據(jù)平安規(guī)那么進(jìn)行合法權(quán)限檢查,假設(shè)用戶的操作請(qǐng)求超出了定義的權(quán)限,系統(tǒng)將拒絕執(zhí)行此操作。用戶權(quán)限定義和合法權(quán)限檢查一起組成了DBMS的平安子系統(tǒng),支持自主存取控制(DAC)和強(qiáng)制存取控制(MAC)。這兩類方法的簡(jiǎn)單定義是:(1)自主存取控制DAC方法:用戶對(duì)于不同的數(shù)據(jù)對(duì)象有不同的存取權(quán)限,不同的用戶對(duì)同一對(duì)象也有不同的權(quán)限,而且用戶還可將其擁有的存取權(quán)限轉(zhuǎn)授給其他用戶。因此自主存取控制非常靈活。(2)強(qiáng)制存取控制MAC方法:每一個(gè)數(shù)據(jù)對(duì)象被標(biāo)以一定的密級(jí),每一個(gè)用戶也被授予某一個(gè)級(jí)別的許可證。對(duì)于任意一個(gè)對(duì)象,只有具有合法許可證的用戶才可以存取。強(qiáng)制存取控制因此相比照擬嚴(yán)格。1.自主存取控制自主存取控制DAC是在用戶標(biāo)識(shí)和鑒別的根底上,對(duì)用戶進(jìn)行授權(quán)。大型數(shù)據(jù)庫(kù)管理系統(tǒng)幾乎都支持C1級(jí)的自主存取控制,目前的SQL標(biāo)準(zhǔn)也對(duì)自主存取控制提供支持,這主要通過(guò)SQL的GRANT語(yǔ)句和REVOKE語(yǔ)句來(lái)實(shí)現(xiàn)。用戶權(quán)限是由四個(gè)要素組成:權(quán)限授出用戶(Grantor),權(quán)限接受用戶(grantee)、操作數(shù)據(jù)對(duì)象(Object)、操作類型(Operate)。定義一個(gè)用戶的存取權(quán)限就是要權(quán)限授出用戶定義權(quán)限接受用戶可以在哪些數(shù)據(jù)對(duì)象上進(jìn)行哪些類型的操作。在數(shù)據(jù)庫(kù)管理系統(tǒng)中,定義存取權(quán)限稱為授權(quán)(Authorization)。數(shù)據(jù)對(duì)象的建立者(擁有者)和超級(jí)用戶(DBA)自動(dòng)擁有數(shù)據(jù)對(duì)象的所有操作權(quán)限,包括權(quán)限授出的權(quán)限;接受權(quán)限用戶可以是系統(tǒng)中標(biāo)識(shí)的任何用戶;數(shù)據(jù)對(duì)象不僅有表和屬性列等數(shù)據(jù)本身,還有模式、外模式、內(nèi)模式等數(shù)據(jù)字典中的內(nèi)容,常見(jiàn)的數(shù)據(jù)對(duì)象有根本表(Table)、視圖(View)、過(guò)程(Procedure)等;操作類型有建立(CREATE)、增加(INSERT)、修改(UPDATE/ALTER)、刪除(DELETE/DROP)、檢索(SELECT)等。例如:根本表student的建立者usera使用GRANT將student表的操作權(quán)限授予不同的用戶,使用REVOKE收回權(quán)限。GRANTSELECTONstudentTOuser1;GRANTINSERT,UPDATE,DELETEONstudentTOuser2;GRANTSELECT,INSERT,UPDATE,DELETEONstudentTOuser3;REVOKESELECTONstudentFROMuser1;REVOKEINSERTONstudentFROMuser2;REVOKEALLONstudentFROMuser3;用戶權(quán)限定義中數(shù)據(jù)對(duì)象范圍越小授權(quán)就越靈活。有的系統(tǒng)可精細(xì)到字段級(jí),而有的系統(tǒng)只能對(duì)關(guān)系授權(quán)。授權(quán)粒度越細(xì),系統(tǒng)定義與檢查權(quán)限的開(kāi)銷也會(huì)相應(yīng)地增大。關(guān)系數(shù)據(jù)庫(kù)中授權(quán)的數(shù)據(jù)對(duì)象橫向粒度有:數(shù)據(jù)庫(kù)、表、屬性列等。衡量授權(quán)精巧程度的另一個(gè)尺度是叢向粒度,能否提供與數(shù)據(jù)值有關(guān)的授權(quán)。一般的授權(quán)定義是獨(dú)立于數(shù)據(jù)值的,即用戶能否對(duì)某類數(shù)據(jù)對(duì)象執(zhí)行的操作與數(shù)據(jù)值無(wú)關(guān),完全由數(shù)據(jù)名決定。假設(shè)授權(quán)依賴于數(shù)據(jù)對(duì)象的內(nèi)容,那么稱為是與數(shù)據(jù)值有關(guān)的授權(quán)。實(shí)現(xiàn)與數(shù)據(jù)值有關(guān)的授權(quán)可以使用存取謂詞,定義存取的條件,限制存取的記錄。同時(shí)也可以使用系統(tǒng)變量,限制存取的時(shí)間、存取使用的終端等等。數(shù)據(jù)庫(kù)管理系統(tǒng)一般都支持視圖數(shù)據(jù)對(duì)象,使用視圖機(jī)制實(shí)現(xiàn)屬性列的授權(quán)和與數(shù)據(jù)值有關(guān)的授權(quán)。將屬性列的存取限制和數(shù)據(jù)值的存取限制定義在適宜的視圖中,然后針對(duì)視圖進(jìn)行授權(quán)。例如:student表的建立者usera建立視圖v_student并授權(quán)userb查詢權(quán)限,其中屬性列只選擇sno(學(xué)號(hào)),sname(姓名),sclass(班級(jí)),其它列不能存取;只選取系部編號(hào)為”0001”的記錄,其它記錄不能存取。CREATEVIEWv_studentASSELECTsno,sname,sclassFROMstudentWHEREsdept=”0001”;GRANTSELECTONv_studentTOuserb;自主存取控制能夠通過(guò)授權(quán)機(jī)制有效地控制其他用戶對(duì)敏感數(shù)據(jù)的存取。但是由于用戶對(duì)數(shù)據(jù)的存取權(quán)限是“自主”的,用戶可以自由地決定將數(shù)據(jù)的存取權(quán)限授予其它用戶。在這種授權(quán)機(jī)制下,仍可能存在數(shù)據(jù)的“無(wú)意泄露”。如:用戶usera將數(shù)據(jù)對(duì)象權(quán)限授予用戶userb,usera的意圖是只允許userb操縱其這些數(shù)據(jù),但是userb可以在usera不知情的情況下進(jìn)行數(shù)據(jù)備份并進(jìn)行傳播。出現(xiàn)這種問(wèn)題的原因是,這種機(jī)制僅僅通過(guò)限制存取權(quán)限進(jìn)行平安控制,而沒(méi)有對(duì)數(shù)據(jù)本身進(jìn)行平安標(biāo)識(shí)。解決這一問(wèn)題需要對(duì)所有數(shù)據(jù)進(jìn)行強(qiáng)制存取控制。2.強(qiáng)制存取控制強(qiáng)制存取控制MAC是指系統(tǒng)為保證更高程度的平安性,按照TDI/TCSEC標(biāo)準(zhǔn)中平安策略的要求,所采取的強(qiáng)制存取檢查手段。它不是用戶能直接感知或進(jìn)行控制的。MAC適用于那些對(duì)數(shù)據(jù)有嚴(yán)格而固定密級(jí)分類的部門,例如軍事部門或政府部門。在MAC中,DBMS所管理的全部實(shí)體被分為主體和客體兩大類。主體是系統(tǒng)中的活動(dòng)實(shí)體,既包括DBMS所管理的實(shí)際用戶,也包括代表用戶的各進(jìn)程??腕w是系統(tǒng)中的被動(dòng)實(shí)體,是受主體操縱的,包括文件、根本表、索引、視圖等等。對(duì)于主體和客體,DBMS為它們指派一個(gè)敏感度標(biāo)記(Label)。敏感度標(biāo)記被分成假設(shè)干級(jí)別,例如絕密(TopSecret)、機(jī)密(Secret)、可信(Confidential)、公開(kāi)(Public)等。主體的敏感度標(biāo)記稱為許可證級(jí)別(ClearanceLevel),客體的敏感度標(biāo)記稱為密級(jí)〔ClassificationLevel〕。MAC機(jī)制就是通過(guò)比照主體的Label和客體的Label,最終確定主體是否能夠存取客體。當(dāng)某一用戶或某一主體以標(biāo)記label注冊(cè)進(jìn)入系統(tǒng)時(shí),系統(tǒng)要求他對(duì)任何客體的存取必須遵循如下規(guī)那么:(1)僅當(dāng)主體的許可證級(jí)別大于或等于客體的密級(jí)時(shí),該主體才能讀取相應(yīng)的客體;(2)僅當(dāng)主體的許可證級(jí)別等于客體的密級(jí)時(shí),該主體才能寫(xiě)相應(yīng)的客體。在某些系統(tǒng)中,與第2條規(guī)那么有些差異:僅當(dāng)主體的許可證級(jí)別小于或等于客體的密級(jí)時(shí),該主體才能寫(xiě)相應(yīng)的客體,即用戶可以為寫(xiě)入的數(shù)據(jù)對(duì)象賦予高于自己的許可證級(jí)別的密級(jí)。這樣一旦數(shù)據(jù)被寫(xiě)入,該用戶自己也不能再讀該數(shù)據(jù)對(duì)象了。這兩種規(guī)那么的共同點(diǎn)在于它們均禁止了擁有高許可證級(jí)別的主體更新低密級(jí)的數(shù)據(jù)對(duì)象,從而防止了敏感數(shù)據(jù)的泄漏。強(qiáng)制存取控制(MAC)是對(duì)數(shù)據(jù)本身進(jìn)行密級(jí)標(biāo)記,無(wú)論數(shù)據(jù)如何復(fù)制,標(biāo)記與數(shù)據(jù)是一個(gè)不可分的整體,只有符合密級(jí)標(biāo)記要求的用戶才可以操縱數(shù)據(jù),從而提供了更高級(jí)別的平安性。在實(shí)現(xiàn)MAC時(shí)要首先實(shí)現(xiàn)DAC,即DAC與MAC共同構(gòu)成DBMS的平安機(jī)制。系統(tǒng)首先進(jìn)行DAC檢查,對(duì)通過(guò)DAC檢查的允許存取的數(shù)據(jù)對(duì)象再由系統(tǒng)自動(dòng)進(jìn)行MAC檢查,只有通過(guò)MAC檢查的數(shù)據(jù)對(duì)象方可存取。在有些系統(tǒng)中,為了保護(hù)數(shù)據(jù)本身的平安性,采用了數(shù)據(jù)加密技術(shù),對(duì)高度敏感數(shù)據(jù)進(jìn)行保護(hù)。數(shù)據(jù)加密是防止數(shù)據(jù)庫(kù)中數(shù)據(jù)在存儲(chǔ)和傳輸中失密的有效手段。加密的根本思想是根據(jù)一定的算法將原始數(shù)據(jù)(明文,Plaintext)變換為不可直接識(shí)別的格式(密文,Ciphertext),從而使得不知道解密算法的人即使獲取了密文無(wú)法獲知原文。數(shù)據(jù)加密與解密是比擬費(fèi)時(shí),占用較多的系統(tǒng)資源,DBMS往往都將其作為可選特征,允許DBA根據(jù)應(yīng)用對(duì)平安性的要求,自由選擇,只對(duì)高度機(jī)密的數(shù)據(jù)如:財(cái)務(wù)數(shù)據(jù)、軍事數(shù)據(jù)、國(guó)家機(jī)密等數(shù)據(jù)進(jìn)行加密。6.1.5審計(jì)管理按照TDI/TCSEC標(biāo)準(zhǔn)中平安策略的要求,“審計(jì)”功能就是DBMS到達(dá)C2以上平安級(jí)別必不可少的一項(xiàng)指標(biāo)。因?yàn)槿魏蜗到y(tǒng)的平安保護(hù)措施都不是完美無(wú)缺的,蓄意盜竊、破壞數(shù)據(jù)的人總是想方設(shè)法打破控制。審計(jì)功能把用戶對(duì)數(shù)據(jù)庫(kù)的所有操作自動(dòng)記錄下來(lái)放入審計(jì)日志〔AuditLog〕中。DBA可以利用審計(jì)跟蹤的信息,重現(xiàn)導(dǎo)致數(shù)據(jù)庫(kù)現(xiàn)有狀況的一系列事件,找出非法存取數(shù)據(jù)的人、時(shí)間和內(nèi)容等。審計(jì)通常是很費(fèi)時(shí)間和空間的,所以DBMS往往都將其作為可選特征,允許DBA根據(jù)應(yīng)用對(duì)平安性的要求,靈活地翻開(kāi)或關(guān)閉審計(jì)功能。審計(jì)功能一般主要用于平安性要求較高的部門。6.1.6SQLServer平安管理SQLServer平安性建立在認(rèn)證和訪問(wèn)許可的機(jī)制上。如果一個(gè)用戶訪問(wèn)SQLServer數(shù)據(jù)庫(kù)中的數(shù)據(jù),必須經(jīng)過(guò)三個(gè)認(rèn)證過(guò)程。第一個(gè)過(guò)程是登錄認(rèn)證,發(fā)生在用戶連接數(shù)據(jù)庫(kù)效勞器時(shí),決定用戶是否有連接到數(shù)據(jù)庫(kù)效勞器的資格,驗(yàn)證用戶連接數(shù)據(jù)庫(kù)效勞器的連接權(quán)。第二個(gè)認(rèn)證過(guò)程是用戶認(rèn)證,發(fā)生在用戶訪問(wèn)數(shù)據(jù)庫(kù)時(shí),決定用戶是否為數(shù)據(jù)庫(kù)的合法用戶,驗(yàn)證用戶對(duì)數(shù)據(jù)庫(kù)的訪問(wèn)權(quán)。第三個(gè)認(rèn)證過(guò)程是權(quán)限認(rèn)證,發(fā)生在用戶操作數(shù)據(jù)庫(kù)對(duì)象時(shí),決定用戶是否有對(duì)象操作許可,驗(yàn)證用戶操作權(quán)。所以SQLServer的平安級(jí)別有三級(jí):第一級(jí):數(shù)據(jù)庫(kù)效勞器,使用登錄認(rèn)證。屬于數(shù)據(jù)庫(kù)效勞器級(jí)別的用戶標(biāo)識(shí)和鑒別。第二級(jí):數(shù)據(jù)庫(kù),使用用戶認(rèn)證。屬于數(shù)據(jù)庫(kù)級(jí)別的用戶標(biāo)識(shí)和鑒別第三級(jí):數(shù)據(jù)庫(kù)對(duì)象,使用權(quán)限認(rèn)證。屬于DAC方法。1.SQLServer登錄管理(1)登錄認(rèn)證模式SQLServer提供了兩種登錄認(rèn)證模式:Windows認(rèn)證:由Windows操作系統(tǒng)負(fù)責(zé)登錄認(rèn)證。Windows創(chuàng)立、管理Windows帳戶,由Windows授權(quán)連接SQLServer,并將Windows帳戶映射為SQLServer登錄。運(yùn)行在Windows95/98的SQLServer不能采用Windows驗(yàn)證。SQLServer認(rèn)證:由SQLServer本身負(fù)責(zé)登錄認(rèn)證。SQLServer負(fù)責(zé)創(chuàng)立、管理登錄,并將登錄保存在數(shù)據(jù)庫(kù)中。這時(shí)SQLServer的登錄與Windows帳戶無(wú)關(guān)。(2)登錄屬性效勞器登錄屬性有登錄名稱、密碼、默認(rèn)數(shù)據(jù)庫(kù)、訪問(wèn)數(shù)據(jù)庫(kù)、效勞器角色、語(yǔ)言、平安標(biāo)識(shí)號(hào)、加密選項(xiàng)。登錄名稱和密碼:如果是Windows認(rèn)證,登錄名稱必須是Windows帳號(hào),其帳號(hào)、密碼由Windows操作系統(tǒng)保存,但在SQLServer中需要指明Windows帳號(hào)(包括域名或組名或主機(jī)名,由Windows主機(jī)隸屬于域或組決定,該處統(tǒng)一用域名表示),不需要設(shè)置密碼。如果是SQLServer認(rèn)證,由SQLServer創(chuàng)立登錄名稱,同時(shí)設(shè)置其密碼,其名稱和密碼保存在SQLServer數(shù)據(jù)庫(kù)中。默認(rèn)數(shù)據(jù)庫(kù):是指該登錄連接數(shù)據(jù)庫(kù)效勞器后,其所屬用戶默認(rèn)訪問(wèn)的數(shù)據(jù)庫(kù),缺省為主數(shù)據(jù)庫(kù)master。訪問(wèn)數(shù)據(jù)庫(kù):是指該登錄連接數(shù)據(jù)庫(kù)效勞器后,其所屬用戶可以訪問(wèn)的數(shù)據(jù)庫(kù),默認(rèn)數(shù)據(jù)庫(kù)必須為訪問(wèn)數(shù)據(jù)庫(kù)。效勞器角色:是指該登錄所屬的效勞器角色,指明登錄的效勞器權(quán)限。一般只有管理登錄才賦予效勞器角色。有關(guān)“效勞器角色”,參考后面“角色管理”。語(yǔ)言:是指該登錄使用的語(yǔ)言,缺省為SQLServer語(yǔ)言設(shè)置。平安標(biāo)識(shí)號(hào)SID:是指該登錄在SQLServer效勞器內(nèi)部使用的唯一標(biāo)識(shí)號(hào)。管理員使用平安標(biāo)識(shí)號(hào)確定登錄,操作員一般不使用。平安標(biāo)識(shí)號(hào)一般由SQLServer在創(chuàng)立登錄或?qū)indows帳戶映射為SQLServer登錄時(shí)自動(dòng)指定,很少人工指定。加密選項(xiàng):是指該登錄密碼的是否加密,只對(duì)SQLServer認(rèn)證有效。NULL表示加密密碼;Skip_Encryption表示不對(duì)密碼加密,Skip_Encryption_Old表示在以前版本中加密的密碼不再加密。(3)創(chuàng)立登錄SQLServer提供了企業(yè)管理器(EnterpriseManager)圖形界面工具建立和維護(hù)各種對(duì)象及屬性的方法,操作簡(jiǎn)單方便,這也是其優(yōu)勢(shì)。同時(shí)還有T-SQL方法、有些稍微復(fù)雜的對(duì)象還提供了建立或維護(hù)向?qū)?Wizard)。本書(shū)只介紹T-SQL方法。SQLServer提供了sp_addlogin和sp_grantlogin存儲(chǔ)過(guò)程用來(lái)創(chuàng)立登錄(login)。其中sp_addlogin創(chuàng)立SQLServer認(rèn)證登錄,sp_grantlogin映射Windows認(rèn)證的Windows帳號(hào)為登錄。sp_addlogin語(yǔ)法如下:sp_addlogin[@loginname=]‘login’[@passwd=]‘password’[,[@defdb=]‘database’][,[@deflanguage=]‘language’][,[@sid=]‘sid’][,[@encryptopt=]‘encryption’]其中l(wèi)ogin:登錄名稱password:登錄密碼,其中登錄名稱和密碼不能省略。database:默認(rèn)數(shù)據(jù)庫(kù),缺省為masterlanguage:登錄語(yǔ)言,缺省為SQLServer設(shè)置語(yǔ)言sid:平安標(biāo)識(shí)符,一般省略,由SQLServer自動(dòng)生成encryption:密碼加密選項(xiàng),可設(shè)置NULL|Skip_Encryption|Skip_Encryption_Old。sp_grantlogin語(yǔ)法如下:sp_grantlogin[@loginame=]‘login’其中l(wèi)ogin是要添加的Windows用戶名稱。Windows用戶必須用Windows域名限定,格式為"域\用戶"。語(yǔ)法中,[]標(biāo)識(shí)可選項(xiàng)。(4)維護(hù)登錄sp_helplogins:查詢登錄名LoginName、SID平安標(biāo)識(shí)號(hào)、默認(rèn)數(shù)據(jù)庫(kù)DefDBName、登錄語(yǔ)言DefLangName、訪問(wèn)的數(shù)據(jù)庫(kù)DBName、映射的用戶名UserName。sp_droplogin:刪除SQLServer認(rèn)證和Windows認(rèn)證的登錄,但不能刪除系統(tǒng)管理員sa登錄,不能刪除正在連接效勞器的登錄。Windows認(rèn)證的登錄刪除不影響其在Windows中的帳戶信息和行為。sp_denylogin:阻止Windows認(rèn)證的帳戶連接到SQLServer效勞器。只能用于Windows認(rèn)證登錄,但不影響其在Windows中的帳戶信息和行為。sp_password:更改登錄口令。sp_addsrvrolemember:增加登錄的效勞器角色。(5)默認(rèn)登錄在安裝SQLServer數(shù)據(jù)庫(kù)效勞器時(shí),SQLServer自動(dòng)創(chuàng)立了默認(rèn)的登錄:BUILTIN\Administrators:Windows認(rèn)證的Administrator組的所有帳戶。默認(rèn)效勞器角色為SystemAdministrators。域名\Administrator:Windows認(rèn)證的Administrator登錄。只有在安裝效勞器時(shí)指明為Windows認(rèn)證時(shí)才創(chuàng)立,默認(rèn)效勞器角色為SystemAdministrators。sa:SQLServer認(rèn)證的系統(tǒng)管理員登錄,不一定要求是Windows管理員。默認(rèn)效勞器角色為SystemAdministrators。2.SQLServer用戶管理創(chuàng)立了效勞器登錄后,只能連接到SQLServer數(shù)據(jù)庫(kù)效勞器,不能訪問(wèn)任何數(shù)據(jù)庫(kù),只有創(chuàng)立了數(shù)據(jù)庫(kù)的用戶(user),成為數(shù)據(jù)庫(kù)的合法用戶后,才能訪問(wèn)數(shù)據(jù)庫(kù)。數(shù)據(jù)庫(kù)的用戶只能來(lái)自于效勞器的登錄,而且是可以訪問(wèn)該數(shù)據(jù)庫(kù)的登錄(在登錄中設(shè)置訪問(wèn)數(shù)據(jù)庫(kù))。一個(gè)效勞器登錄可以映射為多個(gè)數(shù)據(jù)庫(kù)中的用戶,但在一個(gè)數(shù)據(jù)庫(kù)中只能映射為一個(gè)用戶。(1)用戶屬性用戶屬性包括用戶所屬的登錄、用戶名、數(shù)據(jù)庫(kù)角色。所屬的登錄:是指該數(shù)據(jù)庫(kù)用戶所屬的效勞器登錄。一個(gè)數(shù)據(jù)庫(kù)用戶必須隸屬于一個(gè)效勞器登錄,一個(gè)登錄在一個(gè)數(shù)據(jù)庫(kù)中只能有一個(gè)用戶。用戶名:是指該數(shù)據(jù)庫(kù)用戶的名稱用戶ID:是指該用戶對(duì)應(yīng)的內(nèi)部標(biāo)識(shí)符,SQLServer自動(dòng)產(chǎn)生。數(shù)據(jù)庫(kù)角色:是指該用戶擁有的數(shù)據(jù)庫(kù)角色,決定該用戶操作數(shù)據(jù)庫(kù)對(duì)象的權(quán)限。(2)增加用戶SQLServer提供了sp_adduser存儲(chǔ)過(guò)程用來(lái)創(chuàng)立用戶(user)。語(yǔ)法如下:sp_adduser[@loginame=]'login'[,[@name_in_db=]'user'][,[@grpname=]'group']其中:login:用戶所屬于的登錄,不能省略。user:指定的用戶名,如果缺省,與登錄同名。group:指定用戶所屬的數(shù)據(jù)庫(kù)角色。如果缺省,默認(rèn)為public數(shù)據(jù)庫(kù)角色。(3)維護(hù)用戶sp_helpuser:查詢數(shù)據(jù)庫(kù)用戶名UserName、數(shù)據(jù)庫(kù)用戶的數(shù)據(jù)庫(kù)角色名GroupName、所屬登錄LoginName、用戶平安標(biāo)識(shí)號(hào)SID(UserID)等信息。sp_dropuser:刪除數(shù)據(jù)庫(kù)用戶,不能刪除數(shù)據(jù)庫(kù)的dbo用戶,不能刪除master和tempdb的guest用戶,不能刪除擁有對(duì)象的用戶。(4)默認(rèn)用戶在建立數(shù)據(jù)庫(kù)時(shí),SQLServer自動(dòng)建立了兩個(gè)用戶:dbo:數(shù)據(jù)庫(kù)的擁有者用戶,隸屬于sa登錄,擁有public和db_owner數(shù)據(jù)庫(kù)角色,具有該數(shù)據(jù)庫(kù)的所有特權(quán)。guest:客戶訪問(wèn)用戶,沒(méi)有隸屬的登錄。擁有public數(shù)據(jù)庫(kù)角色。除了master和tempdb兩個(gè)數(shù)據(jù)庫(kù)的guest用戶不能刪除外,其它數(shù)據(jù)庫(kù)的guest用戶可以刪除。3.SQLServer權(quán)限管理(1)權(quán)限分類SQLServer使用權(quán)限許可來(lái)實(shí)現(xiàn)存儲(chǔ)控制,SQLServer權(quán)限按等級(jí)分為:系統(tǒng)權(quán)限:是指在數(shù)據(jù)庫(kù)效勞器級(jí)別上對(duì)整個(gè)效勞器和數(shù)據(jù)庫(kù)進(jìn)行管理的權(quán)限,如shutdown、createdatabase、backupdatabase等等,效勞器權(quán)限以效勞器角色的方式授予管理登錄,一般不授予其它登錄。效勞器角色sysadmin具有全部的系統(tǒng)權(quán)限。對(duì)象權(quán)限:是指在特定數(shù)據(jù)庫(kù)級(jí)別上對(duì)數(shù)據(jù)庫(kù)對(duì)象的操作權(quán)限,如對(duì)某數(shù)據(jù)庫(kù)中表的SELECT、INSERT、UPDATE、DELETE、DRI(DeclarativeReferentialIntegrity:公布的引用完整性);對(duì)存儲(chǔ)過(guò)程和函數(shù)的EXECUTE權(quán)限等。語(yǔ)句權(quán)限:用戶在數(shù)據(jù)庫(kù)中創(chuàng)立表、視圖、用戶等一類特殊活動(dòng)的權(quán)限為語(yǔ)句權(quán)限,語(yǔ)句權(quán)限有BACKUPDATABASE、BACKUPLOG、CREATEDATABASE、CREATEDEFAULT、CREATEFUNCTION、CREATEPROCEDURE、CREATERULE、CREATETABLE、CREATEVIEW。(2)權(quán)限的授出和收回及拒絕不同權(quán)限的管理方式略有差異:系統(tǒng)權(quán)限只能通過(guò)效勞器角色整體地進(jìn)行授出和收回,不能對(duì)具體權(quán)限進(jìn)行授出和收回。對(duì)象權(quán)限和語(yǔ)句權(quán)限可以單獨(dú)授出、收回、拒絕。授出是授予權(quán)限給指定用戶;收回是從用戶權(quán)限中刪除權(quán)限;拒絕是顯式地拒絕用戶使用某種權(quán)限,以防止用戶通過(guò)數(shù)據(jù)庫(kù)角色繼承某些權(quán)限。語(yǔ)句權(quán)限的授出:GRANT{ALL|statement[,...]}TOuser[,...]其中ALL為所有語(yǔ)句權(quán)限,statement為語(yǔ)句權(quán)限,可以是多個(gè)語(yǔ)句權(quán)限,用逗號(hào)分隔;user為數(shù)據(jù)庫(kù)用戶,可以一次授予多個(gè)用戶,用逗號(hào)分隔。語(yǔ)法中,{}標(biāo)識(shí)多項(xiàng)選擇一。例如:GRANTCREATEDATABASE,CREATETABLETOMary,John語(yǔ)句權(quán)限的收回:REVOKE{ALL|statement[,...]}FROMuser[,...]語(yǔ)句權(quán)限的拒絕:DENY{ALL|statement[,...]}FROMuser[,...]對(duì)象權(quán)限的授出:GRANT
{ALL[PRIVILEGES]|permission[,...]}{(column[,...])ON{table|view}|ON{table|view}|ON{stored_procedure|extended_procedure}|ONuser_defined_function}TOuser[,...][WITHGRANTOPTION]其中:ALL:對(duì)象的全部權(quán)限,PRIVILEGES為SQL-92的標(biāo)準(zhǔn)關(guān)鍵字。permission:對(duì)象的具體權(quán)限,可以指定多個(gè)。(column[,...])ON{table|view}:指定表或視圖的列權(quán)限,有SELECT和UPDATE。ON{table|view}:表或視圖的權(quán)限,有SELECT、INSERT、UPDATE、DELETE、DRI。ON{stored_procedure|extended_procedure}:存儲(chǔ)過(guò)程的權(quán)限,只有EXECUTE。ON{user_defined_function}}:用戶定義的函數(shù)權(quán)限,只有SELECT。TOuser[,...]:接受權(quán)限的用戶,可以指定多個(gè)。WITHGRANTOPTION:接收權(quán)限的用戶可以將該權(quán)限授予其它用戶。例如:GRANTINSERT,UPDATE,DELETEONauthorsTOMary,John,Tom對(duì)象權(quán)限的收回:REVOKE[GRANTOPTIONFOR]{ALL[PRIVILEGES]|permission[,...]}{(column[,...])ON{table|view}|ON{table|view}|ON{stored_procedure|extended_procedure}|ONuser_defined_function
}FROM
user[,...][CASCADE]其中:GRANTOPTIONFOR:收回授出時(shí)賦予的WITHGRANTOPTION選項(xiàng)作用。CASCADE:收回通過(guò)WITHGRANTOPTION權(quán)限授出的其它用戶權(quán)限。對(duì)象權(quán)限的拒絕:DENY{ALL[PRIVILEGES]|permission[,...]}{(column[,...])ON{table|view}|ON{table|view}|ON{stored_procedure|extended_procedure}|ONuser_defined_function
}FROM
user[,...][CASCADE]其中:CASCADE:拒絕通過(guò)WITHGRANTOPTION權(quán)限授出的其它用戶權(quán)限。另外,SQLServer提供了查詢對(duì)象權(quán)限的存儲(chǔ)過(guò)程sp_helprotect。4.SQLServer角色管理(1)角色分類角色是權(quán)限的集合。SQLServer將局部權(quán)限賦予角色,然后將角色賦予用戶,簡(jiǎn)化了權(quán)限管理,也便于用戶分組。SQLServer角色分為效勞器角色和數(shù)據(jù)庫(kù)角色。效勞器角色:系統(tǒng)權(quán)限的集合。在效勞器級(jí)別上可以將效勞器角色賦予登錄。效勞器角色是系統(tǒng)創(chuàng)立的,不允許增加和刪除,效勞器角色的權(quán)限也不允許修改。效勞器角色列表如下:效勞器角色名說(shuō)明sysadmin在SQLServer中進(jìn)行任何活動(dòng)。serveradmin配置效勞器范圍的設(shè)置。setupadmin添加和刪除鏈接效勞器。securityadmin管理效勞器登錄。processadmin管理在SQLServer實(shí)例中運(yùn)行的進(jìn)程。dbcreator創(chuàng)立和改變數(shù)據(jù)庫(kù)。diskadmin管理磁盤文件。bulkadmin執(zhí)行BULKINSERT語(yǔ)句。數(shù)據(jù)庫(kù)角色:對(duì)象權(quán)限的集合,在數(shù)據(jù)庫(kù)級(jí)別上可以將數(shù)據(jù)庫(kù)角色賦予用戶。數(shù)據(jù)庫(kù)建立時(shí),創(chuàng)立了標(biāo)準(zhǔn)的數(shù)據(jù)庫(kù)角色。標(biāo)準(zhǔn)數(shù)據(jù)庫(kù)角色列表如下:數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)角色說(shuō)明db_owner進(jìn)行所有數(shù)據(jù)庫(kù)角色的活動(dòng)。db_accessadmin在數(shù)據(jù)庫(kù)中添加或刪除數(shù)據(jù)庫(kù)用戶。db_datareader查看數(shù)據(jù)庫(kù)中所有用戶表的全部數(shù)據(jù)。db_datawriter添加、更改或刪除數(shù)據(jù)庫(kù)中所有用戶表的數(shù)據(jù)。db_ddladmin添加、修改或刪除數(shù)據(jù)庫(kù)中的對(duì)象。db_securityadmin管理數(shù)據(jù)庫(kù)角色和成員及語(yǔ)句權(quán)限。db_backupoperator有備份數(shù)據(jù)庫(kù)的權(quán)限。db_denydatareader拒絕選擇數(shù)據(jù)庫(kù)數(shù)據(jù)的權(quán)限。db_denydatawriter拒絕更改數(shù)據(jù)庫(kù)數(shù)據(jù)的權(quán)限。public特殊的數(shù)據(jù)庫(kù)角色,默認(rèn)權(quán)限。標(biāo)準(zhǔn)數(shù)據(jù)庫(kù)角色不能刪除;除public角色外,不能修改標(biāo)準(zhǔn)角色的對(duì)象權(quán)限??梢栽黾臃菢?biāo)準(zhǔn)角色(自定義角色),并修改自定義角色的權(quán)限。public角色是所有用戶都必須屬于的角色。(2)角色維護(hù)SQLServer角色的增加、刪除等維護(hù)以及將角色授予用戶或從用戶中收回角色,SQLServer有以下存儲(chǔ)過(guò)程進(jìn)行角色維護(hù)增加角色:sp_addrole[@rolename=]‘role’刪除角色:sp_addrole[@rolename=]‘role’查看角色:sp_helprole另外對(duì)于自定義角色和public角色權(quán)限的增加和減少,與給用戶對(duì)象權(quán)限的授予與收回相同,使用grant、revoke命令,在此不在贅述。建立好數(shù)據(jù)庫(kù)的角色后,可以將用戶添加到角色中,也就是授予用戶該角色所擁有的權(quán)限。同理,可以將角色中的用戶刪除,也就是收回用戶該角色所擁有的權(quán)限。增加角色的用戶:sp_addrolemember[@rolename=]'role',[@membername=]'user'刪除角色的用戶:sp_droprolemember[@rolename=]'role',[@membername=]'user'但是不能從public角色中刪除用戶,也不能將角色中的dbo用戶。6.2數(shù)據(jù)庫(kù)的完整性6.2.1數(shù)據(jù)庫(kù)完整性概述數(shù)據(jù)庫(kù)的完整性是指數(shù)據(jù)的正確性和相容性。與數(shù)據(jù)庫(kù)的平安性不同,數(shù)據(jù)庫(kù)的完整性是為了防止錯(cuò)誤數(shù)據(jù)的輸入,其防范對(duì)象是不合語(yǔ)義的數(shù)據(jù),而平安性防范對(duì)象是非法用戶和非法操作。維護(hù)數(shù)據(jù)庫(kù)的完整性是數(shù)據(jù)庫(kù)管理系統(tǒng)的根本要求。為了維護(hù)數(shù)據(jù)庫(kù)的完整性,數(shù)據(jù)庫(kù)管理系統(tǒng)(DBMS)必須提供一種機(jī)制來(lái)檢查數(shù)據(jù)庫(kù)中的數(shù)據(jù)是否滿足語(yǔ)義約束條件。這些加在數(shù)據(jù)庫(kù)數(shù)據(jù)之上的語(yǔ)義約束條件稱為數(shù)據(jù)庫(kù)的完整性約束條件。DBMS檢查數(shù)據(jù)是否滿足完整性約束條件的機(jī)制稱為完整性檢查。6.2.2完整性約束條件完整性約束條件作用對(duì)象可以是關(guān)系、元組、列。其中列約束主要是列的數(shù)據(jù)類型、取值范圍、精度、是否為空等等;元組約束是元組之間列的約束關(guān)系;關(guān)系約束是指關(guān)系中元組之間以及關(guān)系和關(guān)系之間的約束。完整性約束條件涉及的這三類對(duì)象,其狀態(tài)可以是靜態(tài)的,也可以是動(dòng)態(tài)的。所謂靜態(tài)約束是指數(shù)據(jù)庫(kù)每一確定狀態(tài)時(shí)的數(shù)據(jù)對(duì)象所應(yīng)滿足的約束條件,它是反映數(shù)據(jù)庫(kù)狀態(tài)合理性的約束,這是最重要的一類完整性約束。動(dòng)態(tài)約束是指數(shù)據(jù)庫(kù)從一種狀態(tài)轉(zhuǎn)變?yōu)榱硪环N狀態(tài)時(shí)新、舊值之間所應(yīng)滿足的約束條件,它是反映數(shù)據(jù)庫(kù)狀態(tài)變遷的約束。綜合上述兩個(gè)方面,可以將完整性約束條件分為六類。1.靜態(tài)列約束靜態(tài)列約束是對(duì)一個(gè)列的取值域的說(shuō)明,這是最常用也最容易實(shí)現(xiàn)的一類完整性約束,主要有以下幾個(gè)方面:(1)對(duì)數(shù)據(jù)類型的約束,包括數(shù)據(jù)的類型、長(zhǎng)度、單位、精度等例:name類型為字符型,長(zhǎng)度為8。貨物重量單位為公斤(kg),類型為數(shù)值型,長(zhǎng)度為24位,精度為小數(shù)點(diǎn)后4位。(2)對(duì)數(shù)據(jù)格式的約束例:出生日期的格式為‘YYYY-MM-DD’。學(xué)生編號(hào)的格式共八位,前兩位為入學(xué)年份,中間兩位是院系編號(hào),后面四位是順序編號(hào)。(3)對(duì)取值范圍或取值集合的約束例:學(xué)生成績(jī)的取值范圍位0~100,性別的取值集合為[男,女]。(4)對(duì)空值的約束空值表示未定義或未知的值,與零值和空格不同,可以設(shè)置列不能為空值,例:學(xué)生學(xué)號(hào)不能為空值,而學(xué)生成績(jī)可以為空值。2.靜態(tài)元組約束一個(gè)元組是由假設(shè)干個(gè)列值組成的,靜態(tài)元組約束就是規(guī)定元組的各個(gè)列之間的約束關(guān)系。例如,定貨關(guān)系中包含發(fā)貨量、定貨量,規(guī)定發(fā)貨量不得大于定貨量。3.靜態(tài)關(guān)系約束在一個(gè)關(guān)系的各個(gè)元組之間或者假設(shè)干關(guān)系之間常常存在各種聯(lián)系或約束。常見(jiàn)的靜態(tài)關(guān)系約束有:(1)實(shí)體完整性約束(2)參照完整性約束。(3)函數(shù)依賴約束。大局部函數(shù)依賴約束都在關(guān)系模式中定義。(4)統(tǒng)計(jì)約束。即字段值與關(guān)系中多個(gè)元組的統(tǒng)計(jì)值之間的約束關(guān)系。其中,實(shí)體完整性約束和參照完整性約束是關(guān)系模型的兩個(gè)極其重要的約束,稱為關(guān)系的兩個(gè)不變性。4.動(dòng)態(tài)列約束動(dòng)態(tài)列約束是修改列定義或列值時(shí)應(yīng)滿足的約束條件,包括以下兩方面:(1)修改列定義時(shí)的約束。例如,將允許空值的列改為不允許空值時(shí),如果該列目前已存在空值,那么拒絕這種修改。(2)修改列值時(shí)的約束。修改列值有時(shí)需要參照其舊值,并且新舊值之間需要滿足某種約束條件。例如,職工工資調(diào)整不得低于其原來(lái)工資,學(xué)生年齡只能增長(zhǎng)等等。5.動(dòng)態(tài)元組約束動(dòng)態(tài)元組約束是指修改元組的值時(shí),元組中各個(gè)字段間需要滿足某種約束條件。例如職工工資調(diào)整時(shí)新工資不得低于原工資+工齡*1.5,等等。6.動(dòng)態(tài)關(guān)系約束動(dòng)態(tài)關(guān)系約束是加在關(guān)系變化前后狀態(tài)上的限制條件,例如事務(wù)一致性、原子性等約束條件。6.2.3完整性控制DBMS的完整性控制機(jī)制應(yīng)具有三個(gè)方面的功能:=1\*GB2⑴定義功能,提供定義完整性約束條件的機(jī)制。=2\*GB2⑵檢查功能,檢查用戶發(fā)出的操作請(qǐng)求是否違背了完整性約束條件。=3\*GB2⑶保護(hù)功能,如果發(fā)現(xiàn)用戶的操作請(qǐng)求使數(shù)據(jù)違背了完整性約束條件,那么采取一定的動(dòng)作來(lái)保證數(shù)據(jù)的完整性。完整性約束條件包括有六大類,約束條件可能非常簡(jiǎn)單,也可能極為復(fù)雜。一個(gè)完善的完整性控制機(jī)制應(yīng)該允許用戶定義所有這六類完整性約束條件。檢查是否違背完整性約束的時(shí)機(jī)通常是在一條語(yǔ)句執(zhí)行完后立即檢查,我們稱這類約束為立即執(zhí)行約束〔ImmediateConstraints〕。有時(shí)完整性檢查需要延遲到整個(gè)事務(wù)執(zhí)行結(jié)束后再進(jìn)行,檢查正確方可提交,我們稱這類約束為延遲執(zhí)行約束〔DeferredConstraints〕。如銀行數(shù)據(jù)庫(kù)中“借貸總金額平衡”就是延時(shí)執(zhí)行約束。從帳號(hào)A轉(zhuǎn)帳到帳號(hào)B是一個(gè)事務(wù),從帳號(hào)A轉(zhuǎn)出后帳不平衡,必須等到轉(zhuǎn)入帳號(hào)B后才能平衡,這時(shí)才能進(jìn)行完整性檢查。如果違背了完整性約束條件,系統(tǒng)將拒絕操作,對(duì)于延遲執(zhí)行約束,系統(tǒng)將拒絕整個(gè)事務(wù),把數(shù)據(jù)庫(kù)恢復(fù)到事務(wù)前的狀態(tài)。關(guān)系系統(tǒng)中,最重要的完整性約束是實(shí)體完整性和參照完整性,其他完整性約束條件那么可以歸入用戶定義的完整性。實(shí)體完整性:根本關(guān)系的所有主屬性都不能取空值,以便唯一地標(biāo)識(shí)實(shí)體。參照完整性:假設(shè)屬性或?qū)傩越MF是根本關(guān)系R的外碼,它與根本關(guān)系S的主碼K相對(duì)應(yīng),那么對(duì)于R中的每個(gè)元組在F上的值必須為空值或等于S中某個(gè)元組的主碼值。其中S和R可以是同一關(guān)系。參照完整性定義了外碼和主碼之間的引用規(guī)那么。用戶定義完整性:除了實(shí)體完整性和參照完整性外,針對(duì)某一具體的關(guān)系數(shù)據(jù)庫(kù),如果需要一些特殊的約束條件,用戶可以自行定義其約束條件。目前DBMS系統(tǒng)中,提供了定義和檢查實(shí)體完整性、參照完整性和用戶定義完整性的功能。對(duì)于違反實(shí)體完整性和用戶定義完整性的操作,一般拒絕執(zhí)行,而對(duì)于違反參照完整性的操作,不是簡(jiǎn)單的拒絕,而是根據(jù)語(yǔ)義執(zhí)行一些附加操作,以保證數(shù)據(jù)庫(kù)的正確性。下面詳細(xì)討論實(shí)現(xiàn)參照完整性要考慮的幾個(gè)問(wèn)題。1.外碼能否為空值問(wèn)題例如:學(xué)生-班級(jí)關(guān)系中,學(xué)生關(guān)系student和班級(jí)關(guān)系class,其中class關(guān)系的主碼為班級(jí)號(hào)cno,student關(guān)系的主碼為學(xué)生號(hào)sno,外碼為班級(jí)號(hào)cno,稱class為被參照關(guān)系,student為參照關(guān)系。student關(guān)系中某一元組的cno列值假設(shè)為空值,表示這個(gè)學(xué)生還沒(méi)有分配到任何班級(jí)。這個(gè)和應(yīng)用環(huán)境的語(yǔ)意是相符的,因此student的cno列可以取空值。在客戶-訂單關(guān)系中,包含客戶關(guān)系client和訂單關(guān)系order,client關(guān)系為被參照關(guān)系,其主碼為客戶編號(hào)cno。order為參照關(guān)系,主碼為訂單編號(hào)ono,外碼為訂單客戶編號(hào)cno。假設(shè)order中元組的cno為空值的話,那么說(shuō)明存在沒(méi)有客戶的訂單。這與實(shí)際的應(yīng)用環(huán)境是不相符合的,因此order的cno列不能取空值。因此在實(shí)現(xiàn)參照完整性時(shí),系統(tǒng)除了提供定義外碼的機(jī)制外,還應(yīng)提供定義外碼是否允許空值的機(jī)制。2.在被參照關(guān)系中刪除元組的問(wèn)題當(dāng)刪除被參照關(guān)系的某個(gè)元組時(shí),而參照關(guān)系存在假設(shè)干元組,且其外碼值與被參照關(guān)系中刪除元組的主碼值相同。如:?jiǎn)T工和部門關(guān)系,部門dept關(guān)系中,部門編號(hào)dno是主碼;員工employ關(guān)系中,員工編號(hào)eno是主碼,員工所在部門dno是外碼,對(duì)應(yīng)dept中的主鍵。刪除dept部門編號(hào)dno=9999的部門,而employ中存在dno=9999的8名員工。這時(shí)可有三種不同的刪除策略:(1)級(jí)聯(lián)刪除(CASCADES)將參照關(guān)系外碼值與被參照關(guān)系中要?jiǎng)h除元組主碼值相同的元組一起刪除。如上例中,刪除關(guān)系dept中dno=9999的部門,同時(shí)刪除employ中8名dno=9999的員工。(2)受限刪除〔RESTRICTED〕僅當(dāng)參照關(guān)系中沒(méi)有任何元組的外碼值與被參照關(guān)系中要?jiǎng)h除元組的主碼值相同時(shí),系統(tǒng)才執(zhí)行刪除操作,否那么拒絕此刪除操作。如上例中,刪除關(guān)系dept中dno=9999的部門時(shí),檢查employ中是否有dno=9999的員工,如果有那么不能刪除,只有先刪除employ中dno=9999的8名員工,然后才能刪除關(guān)系dept中dno=9999的部門。(3)置空值刪除〔NULLIFIES〕刪除被參照關(guān)系的元組,并將參照關(guān)系中相應(yīng)元組的外碼值置空值。如上例中,刪除關(guān)系dept中dno=9999的部門時(shí),檢查employ中是否有dno=9999的員工,如果有將employ中dno=9999員工的dno設(shè)置為NULL。3.在參照關(guān)系中插入元組時(shí)的問(wèn)題當(dāng)參照關(guān)系插入某個(gè)元組,而被參照關(guān)系不存在相應(yīng)的元組。如向關(guān)系employ中插入部門編號(hào)dno=9999,員工編號(hào)eno=1968的元組(1968,9999),而關(guān)系dept中沒(méi)有dno=9999的部門。這時(shí)可有以下兩種插入策略:(1)受限插入僅當(dāng)被參照關(guān)系中存在相應(yīng)的元組,其主碼值與參照關(guān)系插入元組的外碼值相同時(shí),系統(tǒng)才允許插入,否那么拒絕插入。在上例中,系統(tǒng)拒絕插入employ元組(1968,9999),因?yàn)楸粎⒄贞P(guān)系dept中沒(méi)有dno=9999的元組。(2)遞歸插入首先向被參照關(guān)系中插入相應(yīng)的元組,其主碼值等于參照關(guān)系插入元組的外碼值,然后向參照關(guān)系插入元組。在上例中,系統(tǒng)先在dept中插入dno=9999的元組,然后在關(guān)系employ中插入元組(1968,9999)。4.修改關(guān)系中主碼的問(wèn)題(1)不允許修改主碼在有些RDBMS中,不允許修改關(guān)系主碼。如上例中不能修改dept關(guān)系中的部門編號(hào)dno。如果要修改,只能先刪除,然后再增加。(2)允許修改主碼在有些RDBMS中,允許修改關(guān)系主碼,但必須保證主碼的唯一性和非空,否那么拒絕修改。當(dāng)修改的關(guān)系是被參照關(guān)系時(shí),還必須檢查參照關(guān)系。如上例中修改dept中的dno=9999為dno=8888,檢查employ關(guān)系中是否有dno=9999的元組,如果存在,那么與刪除策略相同。當(dāng)修改的關(guān)系是參照關(guān)系時(shí),要檢查被參照關(guān)系。如學(xué)生-選課關(guān)系中,選課關(guān)系elective中的學(xué)生號(hào)sno和課程號(hào)cno聯(lián)合為主碼,sno也是外碼,對(duì)應(yīng)student中的學(xué)生編號(hào)sno。如果選課elective關(guān)系中的(90211111,20,90)改為〔90212222,20,90〕,檢查student關(guān)系中是否存在sno=90212222的主碼值,否那么與插入策略相同。從上面的討論我們看到DBMS在實(shí)現(xiàn)參照完整性時(shí),除了要提供定義主碼、外碼的機(jī)制外,還需要提供不同的策略供用戶選擇。選擇哪種策略,都要根據(jù)應(yīng)用環(huán)境的要求確定。6.2.4SQLServer的完整性SQLServer提供了比擬完善的完整性約束機(jī)制,不僅有實(shí)體完整性和參照完整性,還提供了多種自定義完整性的方法。1.SQLServer的實(shí)體完整性實(shí)體完整性約束就是定義主鍵,并設(shè)置主鍵不為空(NOTNULL)。定義主鍵可以使用CREATETABLE語(yǔ)句,在建立表時(shí)定義;如果創(chuàng)立表時(shí)沒(méi)有設(shè)置主鍵,可以使用ALTERTABLE語(yǔ)句增加主鍵,在增加主鍵時(shí),如果原有數(shù)據(jù)中設(shè)置主鍵的列不符合主鍵約束條件(NOTNULL和唯一性),拒絕執(zhí)行,要先對(duì)數(shù)據(jù)進(jìn)行處理。創(chuàng)立表時(shí)定義主鍵例如:CREATETABLEstudent(snoCHAR(8)NOTNULL,snameVARCHAR2(10),sexCHAR(2),birthdayDATE,CONSTRAINTsno_pkPRIMARYKEY〔sno〕〕;首先定義sno不為空NOTNULL,使用關(guān)鍵字PRIMARYKEY定義sno為主鍵,其約束名為sno_pk,SQLServer根據(jù)主鍵自動(dòng)建立索引,索引名為sno_pk。當(dāng)主鍵由一個(gè)字段組成時(shí),可以直接在字段后面定義主鍵,稱為列約束,如:snoCHAR(8)NOTNULLPRIMARYKEY,使用ALTERTABLE增加主鍵定義例如:在創(chuàng)立課程關(guān)系中course中已經(jīng)定義了課程編號(hào)cnoCHAR(4)NOTNULL和課程名稱cnameVARCHAR(20),沒(méi)有定義主碼,下面操作增加主鍵,約束名為cno_pk:ALTERTABLEcourseADDCONSTRAINTcno_pkPRIMARYKEY(cno);2.SQLServer的參照完整性參照完整性就是定義好被參照關(guān)系及其主碼后,在參照關(guān)系中定義外鍵。定義語(yǔ)法:CONSTRAINTconstraint_nameFOREINKEY
(column[,...])REFERENCESref_table(ref_column[,...])[ONDELETE{CASCADE|NOACTION}][ONUPDATE{CASCADE|NOACTION}]其中:constraint_name:限制名。FOREINKEY(column[,...]):外鍵,如果是單個(gè)字段,可作為列約束,省略限制名。REFERENCESref_table(ref_column[,...]):被參照關(guān)系及字段。ONDELETE{CASCADE|NOACTION}:定義刪除行為,CASCADE為級(jí)聯(lián)刪除,NOACTION為不允許刪除。ONUPDATE{CASCADE|NOACTION}:定義更新行為,CASCADE為級(jí)聯(lián)更新,NOACTION為不允許更新。例如,以student、course為參照關(guān)系,建立elective關(guān)系,同時(shí)定義elective關(guān)系的外碼(sno,cno),分別對(duì)應(yīng)student中的主碼sno和course中的主碼cno。使用CREATETABLE語(yǔ)句,在表建立時(shí)定義外鍵,如果表已經(jīng)創(chuàng)立了,可以使用ALTERTABLE語(yǔ)句增加或修改。創(chuàng)立表時(shí)定義外鍵例如:CREATETABLEsourse(snoCHAR(8)NOTNULL,cnoCHAR(4)NOTNULL,gradeNUMBER(6),CONSTRAINTsno_cno_pkPRIMARYKEY(sno,cno),CONSTRAINTsno_fkFOREINKEY(sno)REFERENCESstudent(sno) ONDELETECASCADEONUPDATECASCADE,CONSTRAINTcno_fkFOREINKEY(cno)REFERENCEScourse(cno)ONDELETENOACTIONONUPDATENOACTION);首先定義了sourse表的實(shí)體完整性,sno和cno聯(lián)合作為主鍵。然后定義了sno為外碼,約束名為sno_pk,參照student表中的sno屬性,刪除策略和更新策略是CASCADE級(jí)聯(lián)刪除。定義了cno為外碼,約束名為cno_pk,參照course表中的cno屬性,刪除策略和更新策略是NOACTION禁止刪除和更新。3.SQLServer的用戶定義完整性(1)NOTNULL約束NOTNULL約束應(yīng)用在單一的數(shù)據(jù)列上,保護(hù)該列必須要有數(shù)據(jù)值。缺省狀況下,SQLServer允許任何列都可以有NULL值。主鍵必須有NOTNULL約束。設(shè)置NOTNULL約束可以使用CREATETABLE語(yǔ)句,在表建立時(shí)一起設(shè)置,如:CREATETABLEstudent(snoCHAR(8)NOTNULL,snameVARCHAR(20));如果創(chuàng)立表時(shí)沒(méi)有NOTNULL約束,可以使用ALTERTABLE語(yǔ)句修改。在修改時(shí),如果原有數(shù)據(jù)中有NULL值,將拒絕執(zhí)行,要先對(duì)數(shù)據(jù)進(jìn)行處理。如增加student表中name列的NOTNULL約束。ALTERTABLEstudentMODIFY(nameVARCHAR2(10)NOTNULL);(2)CHECK約束CHECK約束設(shè)置一個(gè)特殊的布爾條件,只有使布爾條件為TRUE的數(shù)據(jù)才接受。CHECK約束用于增強(qiáng)表中數(shù)據(jù)的簡(jiǎn)單商業(yè)規(guī)那么。用戶使用CHECK約束保證數(shù)據(jù)規(guī)那么的一致性。如果用戶的商業(yè)規(guī)那么需要復(fù)雜的數(shù)據(jù)檢查,那么可以使用觸發(fā)器(TRIGGER)。CHECK約束不保護(hù)LOB類型的數(shù)據(jù)列。單一數(shù)據(jù)列可以有多個(gè)CHECK約束保護(hù),一個(gè)CHECK約束可以保護(hù)多個(gè)數(shù)據(jù)列。當(dāng)CHECK約束保護(hù)多個(gè)數(shù)據(jù)列時(shí),必須使用表約束語(yǔ)法。可用CREATETABLE語(yǔ)句在定義表時(shí)設(shè)置CHECK約束,如:CREATETABLEstudent(snoCHAR(8)NOTNULL,sexCHAR(2),ageint,CONSTRAINTage_ckCHECK(age>20));如果CHECK只對(duì)一列進(jìn)行約束,可以作為列約束直接寫(xiě)在列后面:ageintCHECK(age>20),ALTERTABLE語(yǔ)句可以增加或修改CHECK約束。如在student表中增加性別sex約束:ALTERTABLEstudentADDCONSTRAINTsex_ckCHECK(sexin(‘男’,’女’));(3)UNIQUE約束唯一性UNIQUE約束使數(shù)據(jù)列中任何兩行的數(shù)據(jù)都不相同或?yàn)镹ULL。唯一性約束與主碼不同的是,唯一性約束可以為NULL(是指沒(méi)有NOTNULL約束的情況下),一個(gè)表可以有多個(gè)唯一性約束,而主碼只能有一個(gè)??梢允褂肅REATETABLE語(yǔ)句,在創(chuàng)立表時(shí)設(shè)置UNIQUE約束。如將學(xué)生表中身份證sid設(shè)置為UNIQUE約束:CREATETABLEstudent(snoCHAR(8)NOTNULL,sidCHAR(20),cnameVARCHAR(20),CONSTRAINTsid_uniqueUNIQUE(sid));UNIQUE由單列組成,可以作為列約束直接寫(xiě)在列的后面:sidCHAR(20)UNIQUE,ALTERTABLE語(yǔ)句可以增加或修改UNIQUE約束。在修改時(shí),如果原有數(shù)據(jù)中不符合唯一性,那么拒絕執(zhí)行,要先對(duì)數(shù)據(jù)進(jìn)行處理。如在課程表course中增加課程名cname的UNIQUE約束:ALTERTABLEcourseADDCONSTRAINTcname_uniqueUNIQUE(cname);約束名為cname_unique。由于定義UNIQUE唯一性約束后,自動(dòng)建立索引,所以一般指定約束名。6.3數(shù)據(jù)庫(kù)的并發(fā)控制數(shù)據(jù)庫(kù)的并發(fā)控制和恢復(fù)技術(shù)與事務(wù)密切相關(guān),事務(wù)是并發(fā)控制和恢復(fù)的根本單位。先介紹事務(wù)的根本概念,然后介紹并發(fā)控制,在下一節(jié)介紹恢復(fù)技術(shù)。6.3.1事務(wù)的根本概念1.事務(wù)定義事務(wù)(Transaction)是用戶定義的一個(gè)數(shù)據(jù)庫(kù)操作序列,這些操作要么全做,要么全不做,是一個(gè)不可分割的工作單位。一個(gè)事務(wù)可以是一條SQL語(yǔ)句,也可以是一組SQL語(yǔ)句。如銀行轉(zhuǎn)帳操作,從A帳號(hào)轉(zhuǎn)入1000元資金到B帳號(hào),包括從A帳號(hào)取出1000元和將1000元存入B帳號(hào)兩個(gè)操作,如果從A帳號(hào)取出1000元成功而B(niǎo)帳號(hào)存入1000元失敗,或者從A帳號(hào)取出1000元失敗而B(niǎo)帳號(hào)存入1000成功,只要其中一個(gè)操作失敗,轉(zhuǎn)帳操作失敗。事務(wù)是這樣一種機(jī)制,它確保多個(gè)SQL語(yǔ)句被當(dāng)作單個(gè)工作單元來(lái)處理。在SQL語(yǔ)言中,事務(wù)控制的語(yǔ)句有:BEGINTRANSACTION、COMMIT、ROLLBACK。如果用戶沒(méi)有指明事務(wù)的開(kāi)始和結(jié)束,DBMS按缺省規(guī)定自動(dòng)劃分事務(wù)。用戶以BEGINTRANSACTION開(kāi)始事務(wù),以COMMIT或ROLLBACK結(jié)束事務(wù)。COMMIT表示提交事務(wù),用于正常結(jié)束事務(wù)。ROLLBACK表示回滾,在事務(wù)執(zhí)行過(guò)程中發(fā)生故障,事務(wù)不能繼續(xù),撤消事務(wù)中所有已完成的操作,回到事務(wù)開(kāi)始的狀態(tài)。2.事務(wù)性質(zhì)事務(wù)具有四個(gè)特性:原子性〔Atomicity〕、一致性〔Consistency〕、隔離性〔Isolation〕和持續(xù)性〔Durability〕。簡(jiǎn)稱為ACID特性。(1)原子性事務(wù)是數(shù)據(jù)庫(kù)的邏輯工作單位,被看做一個(gè)單一的、不可分割的操作單元。事務(wù)中包括的所有操作要么都做,要么都不做。(2)一致性事務(wù)執(zhí)行的結(jié)果必須是使數(shù)據(jù)庫(kù)從一個(gè)一致?tīng)顟B(tài)變到另一個(gè)一致?tīng)顟B(tài)。因此當(dāng)數(shù)據(jù)庫(kù)只包含成功事務(wù)提交的結(jié)果時(shí),就說(shuō)數(shù)據(jù)庫(kù)處于一致?tīng)顟B(tài)。如果數(shù)據(jù)庫(kù)系統(tǒng)運(yùn)行中發(fā)生故障,有些事務(wù)尚未完成就被迫中斷,系統(tǒng)將事務(wù)中對(duì)數(shù)據(jù)庫(kù)的所有已完成的操作全部撤消,回滾到事務(wù)開(kāi)始時(shí)的一致?tīng)顟B(tài)。(3)隔離性一個(gè)事務(wù)的執(zhí)行不能被其他事務(wù)干擾。即一個(gè)事務(wù)內(nèi)部的操作及使用的數(shù)據(jù)對(duì)其他并發(fā)事務(wù)是隔離的,并發(fā)執(zhí)行的各個(gè)事務(wù)之間不能互相干擾。(4)持續(xù)性指一個(gè)事務(wù)一旦提交,它對(duì)數(shù)據(jù)庫(kù)中數(shù)據(jù)的改變就應(yīng)該是永久性的。接下來(lái)的其他操作或故障不應(yīng)該對(duì)其執(zhí)行結(jié)果有任何影響。保證事務(wù)ACID特性是事務(wù)處理的重要任務(wù)。事務(wù)ACID特性可能遭到破壞的因素有:(1)多個(gè)事務(wù)并行運(yùn)行時(shí),不同事務(wù)的操作交叉執(zhí)行。(2)事務(wù)在運(yùn)行過(guò)程中被強(qiáng)行停止。在第一種情況下,數(shù)據(jù)庫(kù)管理系統(tǒng)必須保證多個(gè)事務(wù)的交叉運(yùn)行不影響這些事務(wù)的原子性;在第二種情況下,數(shù)據(jù)庫(kù)管理系統(tǒng)必須保證被強(qiáng)行終止的事務(wù)對(duì)數(shù)據(jù)庫(kù)和其它事務(wù)沒(méi)有任何影響。這些就是數(shù)據(jù)庫(kù)管理系統(tǒng)中并發(fā)控制和恢復(fù)機(jī)制的任務(wù)。6.3.2并發(fā)控制概述多用戶數(shù)據(jù)庫(kù)系統(tǒng)中,運(yùn)行的事務(wù)很多。事務(wù)可以一個(gè)一個(gè)地串行執(zhí)行,即每個(gè)時(shí)刻只有一個(gè)事務(wù)運(yùn)行,其它事務(wù)必須等待這個(gè)事務(wù)結(jié)束后才能運(yùn)行,這樣可以有效保證數(shù)據(jù)的一致性,但是串行執(zhí)行使許多資源處于空閑狀態(tài),為了充分利用系統(tǒng)資源,發(fā)揮數(shù)據(jù)庫(kù)共享資源的特點(diǎn),應(yīng)該允許多個(gè)事務(wù)并行執(zhí)行。在單處理機(jī)系統(tǒng)中,事務(wù)并行執(zhí)行實(shí)際上是這些事務(wù)交替輪流執(zhí)行,這種并行執(zhí)行方式稱為交叉并行方式(InterleavedConcurrency)。在多處理機(jī)系統(tǒng)中,每個(gè)處理機(jī)可以運(yùn)行一個(gè)事務(wù),多個(gè)處理機(jī)可以運(yùn)行多個(gè)事務(wù),真正實(shí)現(xiàn)多個(gè)事務(wù)的并行運(yùn)行,這種并行執(zhí)行方式稱為同時(shí)并行方式(SimultaneousConcurrency)。當(dāng)多個(gè)事務(wù)被并行執(zhí)行時(shí),稱這些事務(wù)為并發(fā)事務(wù)。并發(fā)事務(wù)可能產(chǎn)生多個(gè)事務(wù)存取同一數(shù)據(jù)的情況,如果不對(duì)并發(fā)事務(wù)進(jìn)行控制,就可能出現(xiàn)存取不正確的數(shù)據(jù),破壞數(shù)據(jù)的一致性。對(duì)并發(fā)事務(wù)進(jìn)行調(diào)度,使并發(fā)事務(wù)所操作的數(shù)據(jù)保持一致性的整個(gè)過(guò)程稱為并發(fā)控制。并發(fā)控制是數(shù)據(jù)庫(kù)管理系統(tǒng)的重要功能之一。下面以具體實(shí)例說(shuō)明事務(wù)的并行執(zhí)行可能產(chǎn)生數(shù)據(jù)不一致性的情形。1.喪失修改(LostUpdate)①甲售票員(執(zhí)行事務(wù)T1)讀出某次火車的車票余額A,設(shè)A=10;②乙售票員(執(zhí)行事務(wù)T2)讀出同次火車的車票余額A,也是A=10;③甲售票員賣出一張,修改余額A=A-1=10-1=9,修改余額,把9寫(xiě)回?cái)?shù)據(jù)庫(kù)。④乙售票員賣出一張,修改余額A=A-1=10-1=9,修改余額,把9寫(xiě)回?cái)?shù)據(jù)庫(kù)。結(jié)果明明賣出2張車票,但數(shù)據(jù)庫(kù)中車票余額只減少了一張為9張。事務(wù)T1和T2同時(shí)讀入一個(gè)數(shù)據(jù)并修改,結(jié)果T2提交的結(jié)果覆蓋了T1的結(jié)果,導(dǎo)致T1修改的喪失。這種情況為喪失修改。操作過(guò)程例如如下:順序事務(wù)T1事務(wù)T2①讀A=10②讀A=10③寫(xiě)A=9④寫(xiě)A=92.讀“臟”數(shù)據(jù)(DirtyRead)事務(wù)T1修改數(shù)據(jù)后,并將其寫(xiě)回磁盤,事務(wù)T2讀同一數(shù)據(jù),T1由于某種原因被撤消,T1修改的值恢復(fù)原值,T2讀到的數(shù)據(jù)與數(shù)據(jù)庫(kù)中的數(shù)據(jù)不一致,是“臟”數(shù)據(jù),稱為讀“臟”數(shù)據(jù),讀“臟”數(shù)據(jù)的原因是讀取了未提交事務(wù)的數(shù)據(jù),所以又稱為未提交數(shù)據(jù)。①事務(wù)T1讀A=10;②事務(wù)T1寫(xiě)A=5;③事務(wù)T2讀A=5;④事務(wù)T1撤消,使A恢復(fù)原值A(chǔ)=10;順序事務(wù)T1事務(wù)T2①讀A=10②寫(xiě)A=5③讀A=5④撤消,A=103.不可重復(fù)讀(Non-RepeatableRead)事務(wù)T1讀取數(shù)據(jù)A后,事務(wù)T2更新A,如果T1中再一次讀A,兩次讀的結(jié)果不同,讀數(shù)據(jù)稱為檢索,所以又稱為檢索不一致。①事務(wù)T1讀A=10;②事務(wù)T2讀A=10;③事務(wù)T2寫(xiě)A=5;④事務(wù)T1驗(yàn)證原來(lái)的A=10,再讀,此時(shí)A=5;如果事務(wù)T1開(kāi)始讀A=10,而后面讀A=5,重新讀A結(jié)果與前次結(jié)果不同。稱為不可重復(fù)讀。除了修改外,不可重復(fù)讀包括事務(wù)T2增加記錄和刪除記錄的情況。如果事務(wù)T1按一定條件從數(shù)據(jù)庫(kù)中檢索讀取了某些記錄,事務(wù)T2刪除了其中局部記錄,T1再次按相同條件讀取數(shù)據(jù)時(shí),發(fā)現(xiàn)某些記錄消失。如果事務(wù)T1按一定條件從數(shù)據(jù)庫(kù)中檢索讀取了某些記錄,事務(wù)T2增加了一些記錄,T1再次按相同條件讀取數(shù)據(jù)時(shí),發(fā)現(xiàn)多了一些記錄。順序事務(wù)T1事務(wù)T2①讀A=10②讀A=10③寫(xiě)A=5④驗(yàn)證A=10?讀A=5產(chǎn)生上述三種數(shù)據(jù)不一致的主要原因是并行操作破壞了事務(wù)的隔離性。并發(fā)控制就是采用一定調(diào)度策略控制并發(fā)事務(wù),使事務(wù)的執(zhí)行不受其它事務(wù)的干擾,從而防止數(shù)據(jù)的不一致性。多個(gè)事務(wù)的并行執(zhí)行是正確的,當(dāng)且僅當(dāng)其結(jié)果與按某一次序串行地執(zhí)行他們時(shí)的結(jié)果相同,這種調(diào)度策略稱為可串行化(Serializable)的調(diào)度。可串行性是并發(fā)事務(wù)正確性的準(zhǔn)那么。按這個(gè)準(zhǔn)那么規(guī)定,一個(gè)給定的并發(fā)調(diào)度,當(dāng)且僅當(dāng)它是可串行化的,才認(rèn)為是正確調(diào)度。并發(fā)控制方法主要有封鎖(Locking)方法、時(shí)間戳(TimeStamp)方法、樂(lè)觀(Optimistic)方法等,主要介紹在DBMS中使用較多的封鎖方法。6.3.3封鎖封鎖就是事務(wù)T在對(duì)某個(gè)數(shù)據(jù)對(duì)象操作之前,先向系統(tǒng)發(fā)出請(qǐng)求,對(duì)其加鎖。加鎖后事務(wù)T就對(duì)該數(shù)據(jù)對(duì)象有了一定的控制,在事務(wù)T釋放它的鎖之前,其它的事務(wù)不能更新此數(shù)據(jù)對(duì)象。1.封鎖類型根本的封鎖類型有兩種:排它鎖(ExclusiveLocks,簡(jiǎn)記為X鎖)和共享鎖(ShareLocks,簡(jiǎn)記為S鎖)。排它鎖又稱為寫(xiě)鎖。假設(shè)事務(wù)T對(duì)數(shù)據(jù)對(duì)象A加上X鎖,那么只允許T讀取和修改A,其它任何事務(wù)都不能再對(duì)A加任何類型的鎖,直到T釋放A上的鎖。這就保證了其它事務(wù)在T釋放A上的鎖之前不能再讀取和修改A。共享鎖又稱為讀鎖。假設(shè)事務(wù)T對(duì)數(shù)據(jù)對(duì)象A加上S鎖,那么事務(wù)T可以讀A,但不能修改A,其它事務(wù)只能再對(duì)A加S鎖,而不能加X(jué)鎖,直到T釋放A上的S鎖。這就保證了其它事務(wù)可以讀A,但在T釋放A上的S鎖之前其它事務(wù)不能對(duì)A做任何修改。排它鎖與共享鎖的相容矩陣如下:T1T2XS-XNNYSNYY-YYY2.封鎖協(xié)議在運(yùn)用X鎖和S鎖這兩種根本封鎖,對(duì)數(shù)據(jù)對(duì)象加鎖時(shí),還需要約定一些規(guī)那么,例如應(yīng)何時(shí)申請(qǐng)X鎖或S鎖、持鎖時(shí)間、何時(shí)釋放等,我們稱這些規(guī)那么為封鎖協(xié)議(LockingProtocol)。對(duì)封鎖方式規(guī)定不同的規(guī)那么,就形成了各種不同的封鎖協(xié)議。下面介紹三級(jí)封鎖協(xié)議。對(duì)并發(fā)事物的不正確調(diào)度可能會(huì)帶來(lái)喪失修改、不可重復(fù)讀和讀“臟”數(shù)據(jù)等不一致性問(wèn)題,三級(jí)封鎖協(xié)議分別在不同程度上解決了這些問(wèn)題,為并發(fā)事物的正確調(diào)度提供一定的保證。不同級(jí)別的封鎖協(xié)議使系統(tǒng)一致性到達(dá)的級(jí)別是不同的,而兩段鎖協(xié)議是為了保證并發(fā)事務(wù)的可串行性(Serializability)。(1)一級(jí)封鎖協(xié)議一級(jí)封鎖協(xié)議是:事務(wù)T在修改數(shù)據(jù)R之前必須先對(duì)其加X(jué)鎖,直到事務(wù)結(jié)束才釋放。事務(wù)結(jié)束包括正常結(jié)束〔COMMIT〕和非正常結(jié)束〔ROLLBACK〕。一級(jí)封鎖協(xié)議可防止喪失修改,并保證事務(wù)T是可恢復(fù)的。順序事務(wù)T1事務(wù)T2①XlockA②讀A=20XlockA③寫(xiě)A=19等待④COMMIT等待⑤UnXlockA獲取XlockA⑥讀A=19⑦寫(xiě)A=18⑧UnXlockA⑨其它操作⑩COMMIT在一級(jí)封鎖協(xié)議中,如果僅僅是讀數(shù)據(jù)不對(duì)其進(jìn)行修改,是不需要加鎖的,所以它不能保證不讀“臟”數(shù)據(jù)和可重復(fù)讀。(2)二級(jí)封鎖協(xié)議二級(jí)封鎖協(xié)議是:一級(jí)封鎖協(xié)議加上事務(wù)T在讀取數(shù)據(jù)R之前必須先對(duì)其加S鎖,讀完后即可釋放S鎖。二級(jí)封鎖協(xié)議除防止了喪失修改,還可進(jìn)一步防止讀“臟”數(shù)據(jù)。由于讀完后即可釋放S鎖,所以不能保證可重復(fù)讀。順序事務(wù)T1事務(wù)T2①XlockA②讀A=10SlockA③寫(xiě)A=5等待S④ROLLBACK(A=10)等待⑤UnXlockA獲取SlockA⑥讀A=10⑦UnSLockA⑧COMMIT(3)三級(jí)封鎖協(xié)議三級(jí)封鎖協(xié)議是:一級(jí)封鎖協(xié)議加上事務(wù)T在讀取數(shù)據(jù)R之前必須先對(duì)其加S鎖,直到事務(wù)結(jié)束才釋放。三級(jí)封鎖協(xié)議除防止了喪失修改和不讀‘臟’數(shù)據(jù)外,還進(jìn)一步防止了不可重復(fù)讀。順序事務(wù)T1事務(wù)T2①SlockA②讀A=10XlockA③讀A=10(驗(yàn)證)等待④COMMIT等待⑤UnSlockA獲取XlockA⑥讀A=10⑦寫(xiě)A=5⑧COMMIT⑨UnXlockA(4)兩段鎖協(xié)議兩段鎖協(xié)議(Two-PhaseLocking,簡(jiǎn)稱2PL),是指所有事務(wù)必須分兩個(gè)階段對(duì)數(shù)據(jù)項(xiàng)加鎖和解鎖。在對(duì)任何數(shù)據(jù)進(jìn)行讀、寫(xiě)操作之前,首先要申請(qǐng)并獲得對(duì)該數(shù)據(jù)的封鎖,在釋放一個(gè)封鎖之后,事務(wù)不再申請(qǐng)和獲得任何其他封鎖。所謂“兩段”鎖的含義是,事務(wù)分為兩個(gè)階段,第一階段是獲得封鎖,也稱為擴(kuò)展階段。在這階段,事務(wù)可以申請(qǐng)獲得任何數(shù)據(jù)項(xiàng)上的任何類型的鎖,但是不能釋放任何鎖。第二階段是釋放封鎖,也稱為收縮階段。在這階段,事務(wù)可以釋放任何數(shù)據(jù)項(xiàng)上的任何類型的鎖,但不能再申請(qǐng)任何鎖。SlockASlockBXlockCUnSlockAUnSlockBUnXlockCSlockASlockBXlockCUnSlockAUnSlockBUnXlockC擴(kuò)展階段收縮階段例如事務(wù)T2不遵守兩段鎖協(xié)議,其封鎖、解鎖序列:SlockAUnSlockASlockBXlockCUnXlockCUnSlockB;可以證明,假設(shè)并發(fā)執(zhí)行的所有事務(wù)均遵守兩段鎖協(xié)議,那么對(duì)這些事務(wù)的任何并發(fā)調(diào)度策略都是可串行化的。兩階段鎖定義了事務(wù)如何獲取和釋放鎖。兩階段鎖定保證了可串行化,兩個(gè)階段分別是:增長(zhǎng)階段:在增長(zhǎng)階段事務(wù)獲得所需要的鎖,但不釋放任何數(shù)據(jù)上的鎖。一旦所有的鎖都已被獲得了,事務(wù)就到達(dá)了它的鎖定點(diǎn)。縮減階段:在縮減階段事務(wù)釋放所有的鎖,但不能獲得新鎖。3.死鎖(1)產(chǎn)生死鎖的原因如果事務(wù)T1封鎖了數(shù)據(jù)R1,T2封鎖了數(shù)據(jù)R2,然后T1又請(qǐng)求封鎖R2,因T2已封鎖了R2,于是T1等待T2釋放R2上的鎖。接著T2又申請(qǐng)封鎖R1,因T1已封鎖了R1,T2也只能等待T1釋放R1上的鎖。這樣就出現(xiàn)了T1在等待T2,而T2又在等待T1的局面,T1和T2兩個(gè)事務(wù)永遠(yuǎn)不能結(jié)束,形成死鎖。順序事務(wù)T1事務(wù)T2①LockR1②LockR2③請(qǐng)求LockR2④等待請(qǐng)求LockR1⑤等待等待⑥永遠(yuǎn)等待永遠(yuǎn)等待(2)死鎖的預(yù)防在數(shù)據(jù)庫(kù)中,產(chǎn)生死鎖的原因是兩個(gè)或多個(gè)事務(wù)都已封鎖了一些數(shù)據(jù)對(duì)象,然后又都請(qǐng)求對(duì)已被其他事務(wù)封鎖的數(shù)據(jù)對(duì)象加鎖,從而出現(xiàn)死等待。防止死鎖的發(fā)生其實(shí)就是要破壞產(chǎn)生死鎖的條件。預(yù)防死鎖通常有兩種方法:=1\*GB3①一次封鎖法一次封鎖法要求每個(gè)事務(wù)必須一次將所有要使用的數(shù)據(jù)全部加鎖,否那么就不能繼續(xù)執(zhí)行。一次封鎖法雖然可以有效地防止死鎖的發(fā)生,但也存在問(wèn)題,一次就將以后要用到的全部數(shù)據(jù)加鎖,勢(shì)必?cái)U(kuò)大了封鎖的范圍,從而降低了系統(tǒng)的并發(fā)度。=2\*GB3②順序封鎖法順序封鎖法是預(yù)先對(duì)數(shù)據(jù)對(duì)象規(guī)定一個(gè)封鎖順序,所有事務(wù)都按這個(gè)順序?qū)嵭蟹怄i。順序封鎖法可以有效地防止死鎖,但也同樣存在問(wèn)題。事務(wù)的封鎖請(qǐng)求可以隨著事務(wù)的執(zhí)行而動(dòng)態(tài)地決定,很難事先確定每一個(gè)事務(wù)要封鎖哪些對(duì)象,因此也就很難按規(guī)定的順序去施加封鎖??梢?jiàn),可用一次封鎖法和順序封鎖法預(yù)防死鎖,但是不能根本消除死鎖,因此DBMS在解決死鎖的問(wèn)題上還要有診斷并解除死鎖的方法。(3)死鎖的診斷與解除=1\*GB3①超時(shí)法如果一個(gè)事務(wù)的等待時(shí)間超過(guò)了規(guī)定的時(shí)限,就認(rèn)為發(fā)生了死
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025借款合同版(單位住房)
- 2025勞動(dòng)合同的有效要件范本
- 2025代工生產(chǎn)合同
- Unit 3 Amazing animals PartA (說(shuō)課稿)-2024-2025學(xué)年人教PEP版(2024)英語(yǔ)三年級(jí)上冊(cè)
- 11《白樺》說(shuō)課稿(說(shuō)課稿)2023-2024學(xué)年-統(tǒng)編版語(yǔ)文四年級(jí)下冊(cè)
- 2《太陽(yáng)的位置與方向》說(shuō)課稿-2023-2024學(xué)年科學(xué)二年級(jí)下冊(cè)青島版
- 2024年秋九年級(jí)化學(xué)上冊(cè) 第6單元 碳和碳的氧化物 課題1 金剛石、石墨和C60 第2課時(shí) 單質(zhì)碳的化學(xué)性質(zhì)說(shuō)課稿 (新版)新人教版
- 《5 走進(jìn)紙的世界》(說(shuō)課稿)-2023-2024學(xué)年三年級(jí)上冊(cè)綜合實(shí)踐活動(dòng)吉美版
- 任務(wù)完成合同范本
- 勞動(dòng)合同范例 計(jì)時(shí)
- 五年級(jí)數(shù)學(xué)(小數(shù)乘除法)計(jì)算題專項(xiàng)練習(xí)及答案匯編
- 2024年蘇州農(nóng)業(yè)職業(yè)技術(shù)學(xué)院高職單招語(yǔ)文歷年參考題庫(kù)含答案解析
- 2025年北京生命科技研究院招聘筆試參考題庫(kù)含答案解析
- 銀行金融機(jī)構(gòu)銀行金融服務(wù)協(xié)議
- GB/T 27697-2024立式油壓千斤頂
- 《消防機(jī)器人相關(guān)技術(shù)研究》
- 游泳館安全隱患排查
- 《媒介社會(huì)學(xué)》課件
- 成人手術(shù)后疼痛評(píng)估與護(hù)理團(tuán)體標(biāo)準(zhǔn)
- zemax-優(yōu)化函數(shù)說(shuō)明書(shū)
- 2021年《民法典擔(dān)保制度司法解釋》適用解讀之擔(dān)保解釋的歷程
評(píng)論
0/150
提交評(píng)論