數(shù)據(jù)庫的管理_第1頁
數(shù)據(jù)庫的管理_第2頁
數(shù)據(jù)庫的管理_第3頁
數(shù)據(jù)庫的管理_第4頁
數(shù)據(jù)庫的管理_第5頁
已閱讀5頁,還剩29頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

第6章數(shù)據(jù)庫的管理數(shù)據(jù)庫管理的主要目的是,防止不合法用戶對數(shù)據(jù)庫進(jìn)行非法操作,實(shí)現(xiàn)數(shù)據(jù)庫的平安性;防止不合法數(shù)據(jù)進(jìn)入數(shù)據(jù)庫,實(shí)現(xiàn)數(shù)據(jù)庫的完整性;防止并發(fā)操作產(chǎn)生的事務(wù)不一致性,進(jìn)行并發(fā)控制;防止計算機(jī)系統(tǒng)硬件故障、軟件錯誤、操作操作等所造成的數(shù)據(jù)喪失,采取必要的數(shù)據(jù)備份措施,并能從錯誤狀態(tài)恢復(fù)到正確狀態(tài)。本章從數(shù)據(jù)庫管理系統(tǒng)的角度講述數(shù)據(jù)庫管理的原理和方法,主要介紹數(shù)據(jù)庫的平安性、完整性、并發(fā)控制和恢復(fù)技術(shù),并以SQLServer為例進(jìn)行具體說明。6.1數(shù)據(jù)庫的平安性6.1.1數(shù)據(jù)庫平安性概述數(shù)據(jù)庫的平安性是指保護(hù)數(shù)據(jù)庫以防止非法用戶訪問數(shù)據(jù)庫,造成數(shù)據(jù)泄露、更改或破壞。在數(shù)據(jù)庫系統(tǒng)中大量數(shù)據(jù)集中存放,并為許多用戶直接共享,數(shù)據(jù)庫的平安性相對于其它系統(tǒng)尤其重要。實(shí)現(xiàn)數(shù)據(jù)庫的平安性是數(shù)據(jù)庫管理系統(tǒng)的重要指標(biāo)之一。數(shù)據(jù)庫的平安性不是孤立的。在網(wǎng)絡(luò)環(huán)境下,數(shù)據(jù)庫的平安性與三個層次相關(guān):網(wǎng)絡(luò)系統(tǒng)層、操作系統(tǒng)層、數(shù)據(jù)庫管理系統(tǒng)層。這三層共同構(gòu)筑起數(shù)據(jù)庫的平安體系,它們與數(shù)據(jù)庫的平安性逐步緊密,重要性逐層加強(qiáng),從外到內(nèi)保證數(shù)據(jù)庫的平安性。在規(guī)劃和設(shè)計數(shù)據(jù)庫的平安性時,要綜合每一層的平安性,使三層之間相互支持和配合,提高整個系統(tǒng)的平安性。在此只討論數(shù)據(jù)庫管理系統(tǒng)對數(shù)據(jù)庫進(jìn)行平安管理的問題,網(wǎng)絡(luò)系統(tǒng)層的平安性、操作系統(tǒng)層的平安性不做介紹。影響數(shù)據(jù)庫平安性的因素很多,不僅有軟硬件因素,還有環(huán)境和人的因素;不僅涉及技術(shù)問題,還涉及管理問題、政策法律問題等等。其內(nèi)容包括計算機(jī)平安理論、策略、技術(shù),計算機(jī)平安管理、評價、監(jiān)督,計算機(jī)平安犯罪、偵察、法律等等。概括起來,計算機(jī)系統(tǒng)的平安性問題可分為三大類,即:技術(shù)平安類、管理平安類和政策法律類。此處只在技術(shù)層面介紹數(shù)據(jù)庫的平安性。為了準(zhǔn)確地測定和評估計算機(jī)系統(tǒng)的平安性能指標(biāo),標(biāo)準(zhǔn)和指導(dǎo)計算機(jī)系統(tǒng)的生產(chǎn),逐步建立和開展了一套“可信計算機(jī)系統(tǒng)評測標(biāo)準(zhǔn)”。其中最重要的是1985年美國國防部(DoD)公布的《DoD可信計算機(jī)系統(tǒng)評估標(biāo)準(zhǔn)》(TrustedComputerSystemEvaluationCriteria,簡稱TCSEC,稱桔皮書)和1991年美國國家計算機(jī)平安中心(NCSC)公布的《可信計算機(jī)系統(tǒng)評估標(biāo)準(zhǔn)關(guān)于可信數(shù)據(jù)庫系統(tǒng)的解釋》(TrustedDatabaseInterpretatution,簡稱TDI,稱紫皮書)。TDI將TCSEC擴(kuò)展到數(shù)據(jù)庫管理系統(tǒng),定義了數(shù)據(jù)庫管理系統(tǒng)的設(shè)計與實(shí)現(xiàn)中需要滿足和用以進(jìn)行平安性級別評估的標(biāo)準(zhǔn)。TCSEC/TDI將系統(tǒng)劃分為DCBA四組,D;C1;C2;B1;B2;B3;A1從低到高七個等級。較高平安等級提供的平安保護(hù)要包含較低等級的所有保護(hù)要求,同時提供更多更完善的保護(hù)能力。七個平安等級的根本要求如下:D級:提供最小保護(hù)(MinimalProtection)。可以將不符合更高標(biāo)準(zhǔn)的系統(tǒng)歸于D級。如:DOS就是操作系統(tǒng)中平安標(biāo)準(zhǔn)為D的典型例子,它具有操作系統(tǒng)的根本功能,如文件系統(tǒng),進(jìn)程調(diào)度等等,但在平安性方面幾乎沒有什么專門的機(jī)制來保障。C1級:提供自主平安保護(hù)(DiscretionarySecurityProtection〕。實(shí)現(xiàn)用戶和數(shù)據(jù)的別離,進(jìn)行自主存取控制(DiscretionaryAccessControl,簡記為DAC),保護(hù)和限制用戶權(quán)限的傳播。C2級:提供受控的存取保護(hù)(ControlledAccessProtection)。將C1級的DAC進(jìn)一步細(xì)化,以個人身份注冊負(fù)責(zé),并實(shí)施審計和隔離,是平安產(chǎn)品的最低檔次。B1級:標(biāo)記平安保護(hù)(LabeledSecurityProtection)。對系統(tǒng)的數(shù)據(jù)加以標(biāo)記,并對標(biāo)記的主體和客體實(shí)施強(qiáng)制存取控制(MandatoryAccessControl,簡記為MAC)。B1級能夠較好地滿足大型企業(yè)或一般政府部門對于數(shù)據(jù)的平安需求,這一級別的產(chǎn)品才認(rèn)為是真正意義上的平安產(chǎn)品。滿足此級別的產(chǎn)品多冠以“平安”(Security)或“可信的”(Trusted)字樣,作為區(qū)別于普通產(chǎn)品的平安產(chǎn)品出售。在數(shù)據(jù)庫管理系統(tǒng)方面有Oracle公司的TrustedOracle7,Sybase公司的SecureSQLServerversion11.0.6,Informix公司的IncorporatedINFORMIX-OnLine/Secure5.0。B2級:結(jié)構(gòu)化保護(hù)(StructuralProtection)。建立形式化的平安策略模型并對系統(tǒng)內(nèi)的所有主體和客體實(shí)施DAC和MAC。到達(dá)B2級的系統(tǒng)非常稀少,在數(shù)據(jù)庫方面暫時沒有此級別的產(chǎn)品。B3級:平安域保護(hù)(SecurityDomains)。該級的可信任運(yùn)算根底(TrustedComputingBase,TCB)必須滿足訪問監(jiān)控器的要求,審計跟蹤能力更強(qiáng),并提供系統(tǒng)恢復(fù)過程。A1級:驗(yàn)證設(shè)計(VerifiedDesign)。提供B3級保護(hù)的同時給出系統(tǒng)的形式化設(shè)計說明和驗(yàn)證以確信各平安保護(hù)真正實(shí)現(xiàn)。從分級標(biāo)準(zhǔn)可以看出,支持自主存取控制〔DAC〕的DBMS屬于C1級,支持審計功能的DBMS屬于C2級,支持強(qiáng)制存取控制〔MAC〕的DBMS那么可以到達(dá)B1級。B2以上的系統(tǒng)標(biāo)準(zhǔn)更多地還處于理論研究階段,產(chǎn)品化以至商品化的程度都不高,其應(yīng)用也多限于一些特殊的部門如軍隊(duì)等。下面以B1級標(biāo)準(zhǔn)中的用戶標(biāo)識和鑒別、存取控制〔DAC和MAC〕、審計等功能進(jìn)行介紹。6.1.2用戶標(biāo)識和鑒別用戶標(biāo)識(Identification)和鑒別(Authentication是數(shù)據(jù)庫系統(tǒng)提供的最外層平安保護(hù)措施。其方法是由系統(tǒng)提供一定的方式讓用戶標(biāo)識自己的身份,每次用戶要求進(jìn)入系統(tǒng)時,通過鑒別后才提供系統(tǒng)使用權(quán)。用戶標(biāo)識的鑒別方法有多種途徑,可以委托操作系統(tǒng)進(jìn)行鑒別,可以委托專門的全局驗(yàn)證效勞器進(jìn)行鑒別。一般數(shù)據(jù)庫管理系統(tǒng)提供了用戶標(biāo)識和鑒別機(jī)制。用一個用戶名或者用戶標(biāo)識號來標(biāo)明用戶身份。系統(tǒng)內(nèi)部記錄著所有合法用戶的標(biāo)識,系統(tǒng)鑒別此用戶是否合法,假設(shè)是,那么進(jìn)入口令的核實(shí);假設(shè)不是,那么不能使用系統(tǒng)。口令(Password),為了進(jìn)一步鑒別用戶,系統(tǒng)常常要求用戶輸入口令。為保密起見,用戶在終端上輸入的口令不顯示在屏幕上,系統(tǒng)核對口令以鑒別用戶身份。通過用戶名和口令來鑒定用戶的方法簡單易行,但用戶名與口令容易被人竊取,因此還可以用更復(fù)雜的方法。例如每個用戶都預(yù)先約定好一個計算過程或者函數(shù),鑒別用戶身份時,系統(tǒng)提供一個隨機(jī)數(shù),用戶根據(jù)自己預(yù)先約定的計算過程或者函數(shù)進(jìn)行計算,系統(tǒng)根據(jù)用戶計算結(jié)果是否正確進(jìn)一步鑒定用戶身份。用戶可以約定比擬簡單的計算過程或函數(shù),以便計算起來方便;也可以約定比擬復(fù)雜的計算過程或函數(shù),以便平安性更好。6.1.3存儲控制數(shù)據(jù)庫平安主要是指DBMS的存取控制機(jī)制。數(shù)據(jù)庫平安最重要的一點(diǎn)就是確保只有授權(quán)用戶訪問數(shù)據(jù)庫,同時令所有未被授權(quán)的人員無法接近數(shù)據(jù),這主要通過數(shù)據(jù)庫系統(tǒng)的存取控制機(jī)制實(shí)現(xiàn)。存取控制機(jī)制主要包括兩局部:(1)用戶權(quán)限定義。用戶權(quán)限是指不同的用戶對于不同的數(shù)據(jù)對象允許執(zhí)行的操作權(quán)限。系統(tǒng)必須提供適當(dāng)?shù)恼Z言定義用戶權(quán)限,這些定義經(jīng)過編譯后存放在數(shù)據(jù)字典中,被稱作平安規(guī)那么。(2)合法權(quán)限檢查。每當(dāng)用戶發(fā)出存取數(shù)據(jù)庫的操作請求后,DBMS查找數(shù)據(jù)字典,根據(jù)平安規(guī)那么進(jìn)行合法權(quán)限檢查,假設(shè)用戶的操作請求超出了定義的權(quán)限,系統(tǒng)將拒絕執(zhí)行此操作。用戶權(quán)限定義和合法權(quán)限檢查一起組成了DBMS的平安子系統(tǒng),支持自主存取控制(DAC)和強(qiáng)制存取控制(MAC)。這兩類方法的簡單定義是:(1)自主存取控制DAC方法:用戶對于不同的數(shù)據(jù)對象有不同的存取權(quán)限,不同的用戶對同一對象也有不同的權(quán)限,而且用戶還可將其擁有的存取權(quán)限轉(zhuǎn)授給其他用戶。因此自主存取控制非常靈活。(2)強(qiáng)制存取控制MAC方法:每一個數(shù)據(jù)對象被標(biāo)以一定的密級,每一個用戶也被授予某一個級別的許可證。對于任意一個對象,只有具有合法許可證的用戶才可以存取。強(qiáng)制存取控制因此相比照擬嚴(yán)格。1.自主存取控制自主存取控制DAC是在用戶標(biāo)識和鑒別的根底上,對用戶進(jìn)行授權(quán)。大型數(shù)據(jù)庫管理系統(tǒng)幾乎都支持C1級的自主存取控制,目前的SQL標(biāo)準(zhǔn)也對自主存取控制提供支持,這主要通過SQL的GRANT語句和REVOKE語句來實(shí)現(xiàn)。用戶權(quán)限是由四個要素組成:權(quán)限授出用戶(Grantor),權(quán)限接受用戶(grantee)、操作數(shù)據(jù)對象(Object)、操作類型(Operate)。定義一個用戶的存取權(quán)限就是要權(quán)限授出用戶定義權(quán)限接受用戶可以在哪些數(shù)據(jù)對象上進(jìn)行哪些類型的操作。在數(shù)據(jù)庫管理系統(tǒng)中,定義存取權(quán)限稱為授權(quán)(Authorization)。數(shù)據(jù)對象的建立者(擁有者)和超級用戶(DBA)自動擁有數(shù)據(jù)對象的所有操作權(quán)限,包括權(quán)限授出的權(quán)限;接受權(quán)限用戶可以是系統(tǒng)中標(biāo)識的任何用戶;數(shù)據(jù)對象不僅有表和屬性列等數(shù)據(jù)本身,還有模式、外模式、內(nèi)模式等數(shù)據(jù)字典中的內(nèi)容,常見的數(shù)據(jù)對象有根本表(Table)、視圖(View)、過程(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ù)對象范圍越小授權(quán)就越靈活。有的系統(tǒng)可精細(xì)到字段級,而有的系統(tǒng)只能對關(guān)系授權(quán)。授權(quán)粒度越細(xì),系統(tǒng)定義與檢查權(quán)限的開銷也會相應(yīng)地增大。關(guān)系數(shù)據(jù)庫中授權(quán)的數(shù)據(jù)對象橫向粒度有:數(shù)據(jù)庫、表、屬性列等。衡量授權(quán)精巧程度的另一個尺度是叢向粒度,能否提供與數(shù)據(jù)值有關(guān)的授權(quán)。一般的授權(quán)定義是獨(dú)立于數(shù)據(jù)值的,即用戶能否對某類數(shù)據(jù)對象執(zhí)行的操作與數(shù)據(jù)值無關(guān),完全由數(shù)據(jù)名決定。假設(shè)授權(quán)依賴于數(shù)據(jù)對象的內(nèi)容,那么稱為是與數(shù)據(jù)值有關(guān)的授權(quán)。實(shí)現(xiàn)與數(shù)據(jù)值有關(guān)的授權(quán)可以使用存取謂詞,定義存取的條件,限制存取的記錄。同時也可以使用系統(tǒng)變量,限制存取的時間、存取使用的終端等等。數(shù)據(jù)庫管理系統(tǒng)一般都支持視圖數(shù)據(jù)對象,使用視圖機(jī)制實(shí)現(xiàn)屬性列的授權(quán)和與數(shù)據(jù)值有關(guān)的授權(quán)。將屬性列的存取限制和數(shù)據(jù)值的存取限制定義在適宜的視圖中,然后針對視圖進(jìn)行授權(quán)。例如:student表的建立者usera建立視圖v_student并授權(quán)userb查詢權(quán)限,其中屬性列只選擇sno(學(xué)號),sname(姓名),sclass(班級),其它列不能存?。恢贿x取系部編號為”0001”的記錄,其它記錄不能存取。CREATEVIEWv_studentASSELECTsno,sname,sclassFROMstudentWHEREsdept=”0001”;GRANTSELECTONv_studentTOuserb;自主存取控制能夠通過授權(quán)機(jī)制有效地控制其他用戶對敏感數(shù)據(jù)的存取。但是由于用戶對數(shù)據(jù)的存取權(quán)限是“自主”的,用戶可以自由地決定將數(shù)據(jù)的存取權(quán)限授予其它用戶。在這種授權(quán)機(jī)制下,仍可能存在數(shù)據(jù)的“無意泄露”。如:用戶usera將數(shù)據(jù)對象權(quán)限授予用戶userb,usera的意圖是只允許userb操縱其這些數(shù)據(jù),但是userb可以在usera不知情的情況下進(jìn)行數(shù)據(jù)備份并進(jìn)行傳播。出現(xiàn)這種問題的原因是,這種機(jī)制僅僅通過限制存取權(quán)限進(jìn)行平安控制,而沒有對數(shù)據(jù)本身進(jìn)行平安標(biāo)識。解決這一問題需要對所有數(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適用于那些對數(shù)據(jù)有嚴(yán)格而固定密級分類的部門,例如軍事部門或政府部門。在MAC中,DBMS所管理的全部實(shí)體被分為主體和客體兩大類。主體是系統(tǒng)中的活動實(shí)體,既包括DBMS所管理的實(shí)際用戶,也包括代表用戶的各進(jìn)程??腕w是系統(tǒng)中的被動實(shí)體,是受主體操縱的,包括文件、根本表、索引、視圖等等。對于主體和客體,DBMS為它們指派一個敏感度標(biāo)記(Label)。敏感度標(biāo)記被分成假設(shè)干級別,例如絕密(TopSecret)、機(jī)密(Secret)、可信(Confidential)、公開(Public)等。主體的敏感度標(biāo)記稱為許可證級別(ClearanceLevel),客體的敏感度標(biāo)記稱為密級〔ClassificationLevel〕。MAC機(jī)制就是通過比照主體的Label和客體的Label,最終確定主體是否能夠存取客體。當(dāng)某一用戶或某一主體以標(biāo)記label注冊進(jìn)入系統(tǒng)時,系統(tǒng)要求他對任何客體的存取必須遵循如下規(guī)那么:(1)僅當(dāng)主體的許可證級別大于或等于客體的密級時,該主體才能讀取相應(yīng)的客體;(2)僅當(dāng)主體的許可證級別等于客體的密級時,該主體才能寫相應(yīng)的客體。在某些系統(tǒng)中,與第2條規(guī)那么有些差異:僅當(dāng)主體的許可證級別小于或等于客體的密級時,該主體才能寫相應(yīng)的客體,即用戶可以為寫入的數(shù)據(jù)對象賦予高于自己的許可證級別的密級。這樣一旦數(shù)據(jù)被寫入,該用戶自己也不能再讀該數(shù)據(jù)對象了。這兩種規(guī)那么的共同點(diǎn)在于它們均禁止了擁有高許可證級別的主體更新低密級的數(shù)據(jù)對象,從而防止了敏感數(shù)據(jù)的泄漏。強(qiáng)制存取控制(MAC)是對數(shù)據(jù)本身進(jìn)行密級標(biāo)記,無論數(shù)據(jù)如何復(fù)制,標(biāo)記與數(shù)據(jù)是一個不可分的整體,只有符合密級標(biāo)記要求的用戶才可以操縱數(shù)據(jù),從而提供了更高級別的平安性。在實(shí)現(xiàn)MAC時要首先實(shí)現(xiàn)DAC,即DAC與MAC共同構(gòu)成DBMS的平安機(jī)制。系統(tǒng)首先進(jìn)行DAC檢查,對通過DAC檢查的允許存取的數(shù)據(jù)對象再由系統(tǒng)自動進(jìn)行MAC檢查,只有通過MAC檢查的數(shù)據(jù)對象方可存取。在有些系統(tǒng)中,為了保護(hù)數(shù)據(jù)本身的平安性,采用了數(shù)據(jù)加密技術(shù),對高度敏感數(shù)據(jù)進(jìn)行保護(hù)。數(shù)據(jù)加密是防止數(shù)據(jù)庫中數(shù)據(jù)在存儲和傳輸中失密的有效手段。加密的根本思想是根據(jù)一定的算法將原始數(shù)據(jù)(明文,Plaintext)變換為不可直接識別的格式(密文,Ciphertext),從而使得不知道解密算法的人即使獲取了密文無法獲知原文。數(shù)據(jù)加密與解密是比擬費(fèi)時,占用較多的系統(tǒng)資源,DBMS往往都將其作為可選特征,允許DBA根據(jù)應(yīng)用對平安性的要求,自由選擇,只對高度機(jī)密的數(shù)據(jù)如:財務(wù)數(shù)據(jù)、軍事數(shù)據(jù)、國家機(jī)密等數(shù)據(jù)進(jìn)行加密。6.1.5審計管理按照TDI/TCSEC標(biāo)準(zhǔn)中平安策略的要求,“審計”功能就是DBMS到達(dá)C2以上平安級別必不可少的一項(xiàng)指標(biāo)。因?yàn)槿魏蜗到y(tǒng)的平安保護(hù)措施都不是完美無缺的,蓄意盜竊、破壞數(shù)據(jù)的人總是想方設(shè)法打破控制。審計功能把用戶對數(shù)據(jù)庫的所有操作自動記錄下來放入審計日志〔AuditLog〕中。DBA可以利用審計跟蹤的信息,重現(xiàn)導(dǎo)致數(shù)據(jù)庫現(xiàn)有狀況的一系列事件,找出非法存取數(shù)據(jù)的人、時間和內(nèi)容等。審計通常是很費(fèi)時間和空間的,所以DBMS往往都將其作為可選特征,允許DBA根據(jù)應(yīng)用對平安性的要求,靈活地翻開或關(guān)閉審計功能。審計功能一般主要用于平安性要求較高的部門。6.1.6SQLServer平安管理SQLServer平安性建立在認(rèn)證和訪問許可的機(jī)制上。如果一個用戶訪問SQLServer數(shù)據(jù)庫中的數(shù)據(jù),必須經(jīng)過三個認(rèn)證過程。第一個過程是登錄認(rèn)證,發(fā)生在用戶連接數(shù)據(jù)庫效勞器時,決定用戶是否有連接到數(shù)據(jù)庫效勞器的資格,驗(yàn)證用戶連接數(shù)據(jù)庫效勞器的連接權(quán)。第二個認(rèn)證過程是用戶認(rèn)證,發(fā)生在用戶訪問數(shù)據(jù)庫時,決定用戶是否為數(shù)據(jù)庫的合法用戶,驗(yàn)證用戶對數(shù)據(jù)庫的訪問權(quán)。第三個認(rèn)證過程是權(quán)限認(rèn)證,發(fā)生在用戶操作數(shù)據(jù)庫對象時,決定用戶是否有對象操作許可,驗(yàn)證用戶操作權(quán)。所以SQLServer的平安級別有三級:第一級:數(shù)據(jù)庫效勞器,使用登錄認(rèn)證。屬于數(shù)據(jù)庫效勞器級別的用戶標(biāo)識和鑒別。第二級:數(shù)據(jù)庫,使用用戶認(rèn)證。屬于數(shù)據(jù)庫級別的用戶標(biāo)識和鑒別第三級:數(shù)據(jù)庫對象,使用權(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ù)庫中。這時SQLServer的登錄與Windows帳戶無關(guān)。(2)登錄屬性效勞器登錄屬性有登錄名稱、密碼、默認(rèn)數(shù)據(jù)庫、訪問數(shù)據(jù)庫、效勞器角色、語言、平安標(biāo)識號、加密選項(xiàng)。登錄名稱和密碼:如果是Windows認(rèn)證,登錄名稱必須是Windows帳號,其帳號、密碼由Windows操作系統(tǒng)保存,但在SQLServer中需要指明Windows帳號(包括域名或組名或主機(jī)名,由Windows主機(jī)隸屬于域或組決定,該處統(tǒng)一用域名表示),不需要設(shè)置密碼。如果是SQLServer認(rèn)證,由SQLServer創(chuàng)立登錄名稱,同時設(shè)置其密碼,其名稱和密碼保存在SQLServer數(shù)據(jù)庫中。默認(rèn)數(shù)據(jù)庫:是指該登錄連接數(shù)據(jù)庫效勞器后,其所屬用戶默認(rèn)訪問的數(shù)據(jù)庫,缺省為主數(shù)據(jù)庫master。訪問數(shù)據(jù)庫:是指該登錄連接數(shù)據(jù)庫效勞器后,其所屬用戶可以訪問的數(shù)據(jù)庫,默認(rèn)數(shù)據(jù)庫必須為訪問數(shù)據(jù)庫。效勞器角色:是指該登錄所屬的效勞器角色,指明登錄的效勞器權(quán)限。一般只有管理登錄才賦予效勞器角色。有關(guān)“效勞器角色”,參考后面“角色管理”。語言:是指該登錄使用的語言,缺省為SQLServer語言設(shè)置。平安標(biāo)識號SID:是指該登錄在SQLServer效勞器內(nèi)部使用的唯一標(biāo)識號。管理員使用平安標(biāo)識號確定登錄,操作員一般不使用。平安標(biāo)識號一般由SQLServer在創(chuàng)立登錄或?qū)indows帳戶映射為SQLServer登錄時自動指定,很少人工指定。加密選項(xiàng):是指該登錄密碼的是否加密,只對SQLServer認(rèn)證有效。NULL表示加密密碼;Skip_Encryption表示不對密碼加密,Skip_Encryption_Old表示在以前版本中加密的密碼不再加密。(3)創(chuàng)立登錄SQLServer提供了企業(yè)管理器(EnterpriseManager)圖形界面工具建立和維護(hù)各種對象及屬性的方法,操作簡單方便,這也是其優(yōu)勢。同時還有T-SQL方法、有些稍微復(fù)雜的對象還提供了建立或維護(hù)向?qū)?Wizard)。本書只介紹T-SQL方法。SQLServer提供了sp_addlogin和sp_grantlogin存儲過程用來創(chuàng)立登錄(login)。其中sp_addlogin創(chuàng)立SQLServer認(rèn)證登錄,sp_grantlogin映射Windows認(rèn)證的Windows帳號為登錄。sp_addlogin語法如下:sp_addlogin[@loginname=]‘login’[@passwd=]‘password’[,[@defdb=]‘database’][,[@deflanguage=]‘language’][,[@sid=]‘sid’][,[@encryptopt=]‘encryption’]其中l(wèi)ogin:登錄名稱password:登錄密碼,其中登錄名稱和密碼不能省略。database:默認(rèn)數(shù)據(jù)庫,缺省為masterlanguage:登錄語言,缺省為SQLServer設(shè)置語言sid:平安標(biāo)識符,一般省略,由SQLServer自動生成encryption:密碼加密選項(xiàng),可設(shè)置NULL|Skip_Encryption|Skip_Encryption_Old。sp_grantlogin語法如下:sp_grantlogin[@loginame=]‘login’其中l(wèi)ogin是要添加的Windows用戶名稱。Windows用戶必須用Windows域名限定,格式為"域\用戶"。語法中,[]標(biāo)識可選項(xiàng)。(4)維護(hù)登錄sp_helplogins:查詢登錄名LoginName、SID平安標(biāo)識號、默認(rèn)數(shù)據(jù)庫DefDBName、登錄語言DefLangName、訪問的數(shù)據(jù)庫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ù)庫效勞器時,SQLServer自動創(chuàng)立了默認(rèn)的登錄:BUILTIN\Administrators:Windows認(rèn)證的Administrator組的所有帳戶。默認(rèn)效勞器角色為SystemAdministrators。域名\Administrator:Windows認(rèn)證的Administrator登錄。只有在安裝效勞器時指明為Windows認(rèn)證時才創(chuàng)立,默認(rèn)效勞器角色為SystemAdministrators。sa:SQLServer認(rèn)證的系統(tǒng)管理員登錄,不一定要求是Windows管理員。默認(rèn)效勞器角色為SystemAdministrators。2.SQLServer用戶管理創(chuàng)立了效勞器登錄后,只能連接到SQLServer數(shù)據(jù)庫效勞器,不能訪問任何數(shù)據(jù)庫,只有創(chuàng)立了數(shù)據(jù)庫的用戶(user),成為數(shù)據(jù)庫的合法用戶后,才能訪問數(shù)據(jù)庫。數(shù)據(jù)庫的用戶只能來自于效勞器的登錄,而且是可以訪問該數(shù)據(jù)庫的登錄(在登錄中設(shè)置訪問數(shù)據(jù)庫)。一個效勞器登錄可以映射為多個數(shù)據(jù)庫中的用戶,但在一個數(shù)據(jù)庫中只能映射為一個用戶。(1)用戶屬性用戶屬性包括用戶所屬的登錄、用戶名、數(shù)據(jù)庫角色。所屬的登錄:是指該數(shù)據(jù)庫用戶所屬的效勞器登錄。一個數(shù)據(jù)庫用戶必須隸屬于一個效勞器登錄,一個登錄在一個數(shù)據(jù)庫中只能有一個用戶。用戶名:是指該數(shù)據(jù)庫用戶的名稱用戶ID:是指該用戶對應(yīng)的內(nèi)部標(biāo)識符,SQLServer自動產(chǎn)生。數(shù)據(jù)庫角色:是指該用戶擁有的數(shù)據(jù)庫角色,決定該用戶操作數(shù)據(jù)庫對象的權(quán)限。(2)增加用戶SQLServer提供了sp_adduser存儲過程用來創(chuàng)立用戶(user)。語法如下:sp_adduser[@loginame=]'login'[,[@name_in_db=]'user'][,[@grpname=]'group']其中:login:用戶所屬于的登錄,不能省略。user:指定的用戶名,如果缺省,與登錄同名。group:指定用戶所屬的數(shù)據(jù)庫角色。如果缺省,默認(rèn)為public數(shù)據(jù)庫角色。(3)維護(hù)用戶sp_helpuser:查詢數(shù)據(jù)庫用戶名UserName、數(shù)據(jù)庫用戶的數(shù)據(jù)庫角色名GroupName、所屬登錄LoginName、用戶平安標(biāo)識號SID(UserID)等信息。sp_dropuser:刪除數(shù)據(jù)庫用戶,不能刪除數(shù)據(jù)庫的dbo用戶,不能刪除master和tempdb的guest用戶,不能刪除擁有對象的用戶。(4)默認(rèn)用戶在建立數(shù)據(jù)庫時,SQLServer自動建立了兩個用戶:dbo:數(shù)據(jù)庫的擁有者用戶,隸屬于sa登錄,擁有public和db_owner數(shù)據(jù)庫角色,具有該數(shù)據(jù)庫的所有特權(quán)。guest:客戶訪問用戶,沒有隸屬的登錄。擁有public數(shù)據(jù)庫角色。除了master和tempdb兩個數(shù)據(jù)庫的guest用戶不能刪除外,其它數(shù)據(jù)庫的guest用戶可以刪除。3.SQLServer權(quán)限管理(1)權(quán)限分類SQLServer使用權(quán)限許可來實(shí)現(xiàn)存儲控制,SQLServer權(quán)限按等級分為:系統(tǒng)權(quán)限:是指在數(shù)據(jù)庫效勞器級別上對整個效勞器和數(shù)據(jù)庫進(jìn)行管理的權(quán)限,如shutdown、createdatabase、backupdatabase等等,效勞器權(quán)限以效勞器角色的方式授予管理登錄,一般不授予其它登錄。效勞器角色sysadmin具有全部的系統(tǒng)權(quán)限。對象權(quán)限:是指在特定數(shù)據(jù)庫級別上對數(shù)據(jù)庫對象的操作權(quán)限,如對某數(shù)據(jù)庫中表的SELECT、INSERT、UPDATE、DELETE、DRI(DeclarativeReferentialIntegrity:公布的引用完整性);對存儲過程和函數(shù)的EXECUTE權(quán)限等。語句權(quán)限:用戶在數(shù)據(jù)庫中創(chuàng)立表、視圖、用戶等一類特殊活動的權(quán)限為語句權(quán)限,語句權(quán)限有BACKUPDATABASE、BACKUPLOG、CREATEDATABASE、CREATEDEFAULT、CREATEFUNCTION、CREATEPROCEDURE、CREATERULE、CREATETABLE、CREATEVIEW。(2)權(quán)限的授出和收回及拒絕不同權(quán)限的管理方式略有差異:系統(tǒng)權(quán)限只能通過效勞器角色整體地進(jìn)行授出和收回,不能對具體權(quán)限進(jìn)行授出和收回。對象權(quán)限和語句權(quán)限可以單獨(dú)授出、收回、拒絕。授出是授予權(quán)限給指定用戶;收回是從用戶權(quán)限中刪除權(quán)限;拒絕是顯式地拒絕用戶使用某種權(quán)限,以防止用戶通過數(shù)據(jù)庫角色繼承某些權(quán)限。語句權(quán)限的授出:GRANT{ALL|statement[,...]}TOuser[,...]其中ALL為所有語句權(quán)限,statement為語句權(quán)限,可以是多個語句權(quán)限,用逗號分隔;user為數(shù)據(jù)庫用戶,可以一次授予多個用戶,用逗號分隔。語法中,{}標(biāo)識多項(xiàng)選擇一。例如:GRANTCREATEDATABASE,CREATETABLETOMary,John語句權(quán)限的收回:REVOKE{ALL|statement[,...]}FROMuser[,...]語句權(quán)限的拒絕:DENY{ALL|statement[,...]}FROMuser[,...]對象權(quán)限的授出:GRANT

{ALL[PRIVILEGES]|permission[,...]}{(column[,...])ON{table|view}|ON{table|view}|ON{stored_procedure|extended_procedure}|ONuser_defined_function}TOuser[,...][WITHGRANTOPTION]其中:ALL:對象的全部權(quán)限,PRIVILEGES為SQL-92的標(biāo)準(zhǔn)關(guān)鍵字。permission:對象的具體權(quán)限,可以指定多個。(column[,...])ON{table|view}:指定表或視圖的列權(quán)限,有SELECT和UPDATE。ON{table|view}:表或視圖的權(quán)限,有SELECT、INSERT、UPDATE、DELETE、DRI。ON{stored_procedure|extended_procedure}:存儲過程的權(quán)限,只有EXECUTE。ON{user_defined_function}}:用戶定義的函數(shù)權(quán)限,只有SELECT。TOuser[,...]:接受權(quán)限的用戶,可以指定多個。WITHGRANTOPTION:接收權(quán)限的用戶可以將該權(quán)限授予其它用戶。例如:GRANTINSERT,UPDATE,DELETEONauthorsTOMary,John,Tom對象權(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:收回授出時賦予的WITHGRANTOPTION選項(xiàng)作用。CASCADE:收回通過WITHGRANTOPTION權(quán)限授出的其它用戶權(quán)限。對象權(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:拒絕通過WITHGRANTOPTION權(quán)限授出的其它用戶權(quán)限。另外,SQLServer提供了查詢對象權(quán)限的存儲過程sp_helprotect。4.SQLServer角色管理(1)角色分類角色是權(quán)限的集合。SQLServer將局部權(quán)限賦予角色,然后將角色賦予用戶,簡化了權(quán)限管理,也便于用戶分組。SQLServer角色分為效勞器角色和數(shù)據(jù)庫角色。效勞器角色:系統(tǒng)權(quán)限的集合。在效勞器級別上可以將效勞器角色賦予登錄。效勞器角色是系統(tǒng)創(chuàng)立的,不允許增加和刪除,效勞器角色的權(quán)限也不允許修改。效勞器角色列表如下:效勞器角色名說明sysadmin在SQLServer中進(jìn)行任何活動。serveradmin配置效勞器范圍的設(shè)置。setupadmin添加和刪除鏈接效勞器。securityadmin管理效勞器登錄。processadmin管理在SQLServer實(shí)例中運(yùn)行的進(jìn)程。dbcreator創(chuàng)立和改變數(shù)據(jù)庫。diskadmin管理磁盤文件。bulkadmin執(zhí)行BULKINSERT語句。數(shù)據(jù)庫角色:對象權(quán)限的集合,在數(shù)據(jù)庫級別上可以將數(shù)據(jù)庫角色賦予用戶。數(shù)據(jù)庫建立時,創(chuàng)立了標(biāo)準(zhǔn)的數(shù)據(jù)庫角色。標(biāo)準(zhǔn)數(shù)據(jù)庫角色列表如下:數(shù)據(jù)庫標(biāo)準(zhǔn)角色說明db_owner進(jìn)行所有數(shù)據(jù)庫角色的活動。db_accessadmin在數(shù)據(jù)庫中添加或刪除數(shù)據(jù)庫用戶。db_datareader查看數(shù)據(jù)庫中所有用戶表的全部數(shù)據(jù)。db_datawriter添加、更改或刪除數(shù)據(jù)庫中所有用戶表的數(shù)據(jù)。db_ddladmin添加、修改或刪除數(shù)據(jù)庫中的對象。db_securityadmin管理數(shù)據(jù)庫角色和成員及語句權(quán)限。db_backupoperator有備份數(shù)據(jù)庫的權(quán)限。db_denydatareader拒絕選擇數(shù)據(jù)庫數(shù)據(jù)的權(quán)限。db_denydatawriter拒絕更改數(shù)據(jù)庫數(shù)據(jù)的權(quán)限。public特殊的數(shù)據(jù)庫角色,默認(rèn)權(quán)限。標(biāo)準(zhǔn)數(shù)據(jù)庫角色不能刪除;除public角色外,不能修改標(biāo)準(zhǔn)角色的對象權(quán)限??梢栽黾臃菢?biāo)準(zhǔn)角色(自定義角色),并修改自定義角色的權(quán)限。public角色是所有用戶都必須屬于的角色。(2)角色維護(hù)SQLServer角色的增加、刪除等維護(hù)以及將角色授予用戶或從用戶中收回角色,SQLServer有以下存儲過程進(jìn)行角色維護(hù)增加角色:sp_addrole[@rolename=]‘role’刪除角色:sp_addrole[@rolename=]‘role’查看角色:sp_helprole另外對于自定義角色和public角色權(quán)限的增加和減少,與給用戶對象權(quán)限的授予與收回相同,使用grant、revoke命令,在此不在贅述。建立好數(shù)據(jù)庫的角色后,可以將用戶添加到角色中,也就是授予用戶該角色所擁有的權(quán)限。同理,可以將角色中的用戶刪除,也就是收回用戶該角色所擁有的權(quán)限。增加角色的用戶:sp_addrolemember[@rolename=]'role',[@membername=]'user'刪除角色的用戶:sp_droprolemember[@rolename=]'role',[@membername=]'user'但是不能從public角色中刪除用戶,也不能將角色中的dbo用戶。6.2數(shù)據(jù)庫的完整性6.2.1數(shù)據(jù)庫完整性概述數(shù)據(jù)庫的完整性是指數(shù)據(jù)的正確性和相容性。與數(shù)據(jù)庫的平安性不同,數(shù)據(jù)庫的完整性是為了防止錯誤數(shù)據(jù)的輸入,其防范對象是不合語義的數(shù)據(jù),而平安性防范對象是非法用戶和非法操作。維護(hù)數(shù)據(jù)庫的完整性是數(shù)據(jù)庫管理系統(tǒng)的根本要求。為了維護(hù)數(shù)據(jù)庫的完整性,數(shù)據(jù)庫管理系統(tǒng)(DBMS)必須提供一種機(jī)制來檢查數(shù)據(jù)庫中的數(shù)據(jù)是否滿足語義約束條件。這些加在數(shù)據(jù)庫數(shù)據(jù)之上的語義約束條件稱為數(shù)據(jù)庫的完整性約束條件。DBMS檢查數(shù)據(jù)是否滿足完整性約束條件的機(jī)制稱為完整性檢查。6.2.2完整性約束條件完整性約束條件作用對象可以是關(guān)系、元組、列。其中列約束主要是列的數(shù)據(jù)類型、取值范圍、精度、是否為空等等;元組約束是元組之間列的約束關(guān)系;關(guān)系約束是指關(guān)系中元組之間以及關(guān)系和關(guān)系之間的約束。完整性約束條件涉及的這三類對象,其狀態(tài)可以是靜態(tài)的,也可以是動態(tài)的。所謂靜態(tài)約束是指數(shù)據(jù)庫每一確定狀態(tài)時的數(shù)據(jù)對象所應(yīng)滿足的約束條件,它是反映數(shù)據(jù)庫狀態(tài)合理性的約束,這是最重要的一類完整性約束。動態(tài)約束是指數(shù)據(jù)庫從一種狀態(tài)轉(zhuǎn)變?yōu)榱硪环N狀態(tài)時新、舊值之間所應(yīng)滿足的約束條件,它是反映數(shù)據(jù)庫狀態(tài)變遷的約束。綜合上述兩個方面,可以將完整性約束條件分為六類。1.靜態(tài)列約束靜態(tài)列約束是對一個列的取值域的說明,這是最常用也最容易實(shí)現(xiàn)的一類完整性約束,主要有以下幾個方面:(1)對數(shù)據(jù)類型的約束,包括數(shù)據(jù)的類型、長度、單位、精度等例:name類型為字符型,長度為8。貨物重量單位為公斤(kg),類型為數(shù)值型,長度為24位,精度為小數(shù)點(diǎn)后4位。(2)對數(shù)據(jù)格式的約束例:出生日期的格式為‘YYYY-MM-DD’。學(xué)生編號的格式共八位,前兩位為入學(xué)年份,中間兩位是院系編號,后面四位是順序編號。(3)對取值范圍或取值集合的約束例:學(xué)生成績的取值范圍位0~100,性別的取值集合為[男,女]。(4)對空值的約束空值表示未定義或未知的值,與零值和空格不同,可以設(shè)置列不能為空值,例:學(xué)生學(xué)號不能為空值,而學(xué)生成績可以為空值。2.靜態(tài)元組約束一個元組是由假設(shè)干個列值組成的,靜態(tài)元組約束就是規(guī)定元組的各個列之間的約束關(guān)系。例如,定貨關(guān)系中包含發(fā)貨量、定貨量,規(guī)定發(fā)貨量不得大于定貨量。3.靜態(tài)關(guān)系約束在一個關(guān)系的各個元組之間或者假設(shè)干關(guān)系之間常常存在各種聯(lián)系或約束。常見的靜態(tài)關(guān)系約束有:(1)實(shí)體完整性約束(2)參照完整性約束。(3)函數(shù)依賴約束。大局部函數(shù)依賴約束都在關(guān)系模式中定義。(4)統(tǒng)計約束。即字段值與關(guān)系中多個元組的統(tǒng)計值之間的約束關(guān)系。其中,實(shí)體完整性約束和參照完整性約束是關(guān)系模型的兩個極其重要的約束,稱為關(guān)系的兩個不變性。4.動態(tài)列約束動態(tài)列約束是修改列定義或列值時應(yīng)滿足的約束條件,包括以下兩方面:(1)修改列定義時的約束。例如,將允許空值的列改為不允許空值時,如果該列目前已存在空值,那么拒絕這種修改。(2)修改列值時的約束。修改列值有時需要參照其舊值,并且新舊值之間需要滿足某種約束條件。例如,職工工資調(diào)整不得低于其原來工資,學(xué)生年齡只能增長等等。5.動態(tài)元組約束動態(tài)元組約束是指修改元組的值時,元組中各個字段間需要滿足某種約束條件。例如職工工資調(diào)整時新工資不得低于原工資+工齡*1.5,等等。6.動態(tài)關(guān)系約束動態(tài)關(guān)系約束是加在關(guān)系變化前后狀態(tài)上的限制條件,例如事務(wù)一致性、原子性等約束條件。6.2.3完整性控制DBMS的完整性控制機(jī)制應(yīng)具有三個方面的功能:=1\*GB2⑴定義功能,提供定義完整性約束條件的機(jī)制。=2\*GB2⑵檢查功能,檢查用戶發(fā)出的操作請求是否違背了完整性約束條件。=3\*GB2⑶保護(hù)功能,如果發(fā)現(xiàn)用戶的操作請求使數(shù)據(jù)違背了完整性約束條件,那么采取一定的動作來保證數(shù)據(jù)的完整性。完整性約束條件包括有六大類,約束條件可能非常簡單,也可能極為復(fù)雜。一個完善的完整性控制機(jī)制應(yīng)該允許用戶定義所有這六類完整性約束條件。檢查是否違背完整性約束的時機(jī)通常是在一條語句執(zhí)行完后立即檢查,我們稱這類約束為立即執(zhí)行約束〔ImmediateConstraints〕。有時完整性檢查需要延遲到整個事務(wù)執(zhí)行結(jié)束后再進(jìn)行,檢查正確方可提交,我們稱這類約束為延遲執(zhí)行約束〔DeferredConstraints〕。如銀行數(shù)據(jù)庫中“借貸總金額平衡”就是延時執(zhí)行約束。從帳號A轉(zhuǎn)帳到帳號B是一個事務(wù),從帳號A轉(zhuǎn)出后帳不平衡,必須等到轉(zhuǎn)入帳號B后才能平衡,這時才能進(jìn)行完整性檢查。如果違背了完整性約束條件,系統(tǒng)將拒絕操作,對于延遲執(zhí)行約束,系統(tǒng)將拒絕整個事務(wù),把數(shù)據(jù)庫恢復(fù)到事務(wù)前的狀態(tài)。關(guān)系系統(tǒng)中,最重要的完整性約束是實(shí)體完整性和參照完整性,其他完整性約束條件那么可以歸入用戶定義的完整性。實(shí)體完整性:根本關(guān)系的所有主屬性都不能取空值,以便唯一地標(biāo)識實(shí)體。參照完整性:假設(shè)屬性或?qū)傩越MF是根本關(guān)系R的外碼,它與根本關(guān)系S的主碼K相對應(yīng),那么對于R中的每個元組在F上的值必須為空值或等于S中某個元組的主碼值。其中S和R可以是同一關(guān)系。參照完整性定義了外碼和主碼之間的引用規(guī)那么。用戶定義完整性:除了實(shí)體完整性和參照完整性外,針對某一具體的關(guān)系數(shù)據(jù)庫,如果需要一些特殊的約束條件,用戶可以自行定義其約束條件。目前DBMS系統(tǒng)中,提供了定義和檢查實(shí)體完整性、參照完整性和用戶定義完整性的功能。對于違反實(shí)體完整性和用戶定義完整性的操作,一般拒絕執(zhí)行,而對于違反參照完整性的操作,不是簡單的拒絕,而是根據(jù)語義執(zhí)行一些附加操作,以保證數(shù)據(jù)庫的正確性。下面詳細(xì)討論實(shí)現(xiàn)參照完整性要考慮的幾個問題。1.外碼能否為空值問題例如:學(xué)生-班級關(guān)系中,學(xué)生關(guān)系student和班級關(guān)系class,其中class關(guān)系的主碼為班級號cno,student關(guān)系的主碼為學(xué)生號sno,外碼為班級號cno,稱class為被參照關(guān)系,student為參照關(guān)系。student關(guān)系中某一元組的cno列值假設(shè)為空值,表示這個學(xué)生還沒有分配到任何班級。這個和應(yīng)用環(huán)境的語意是相符的,因此student的cno列可以取空值。在客戶-訂單關(guān)系中,包含客戶關(guān)系client和訂單關(guān)系order,client關(guān)系為被參照關(guān)系,其主碼為客戶編號cno。order為參照關(guān)系,主碼為訂單編號ono,外碼為訂單客戶編號cno。假設(shè)order中元組的cno為空值的話,那么說明存在沒有客戶的訂單。這與實(shí)際的應(yīng)用環(huán)境是不相符合的,因此order的cno列不能取空值。因此在實(shí)現(xiàn)參照完整性時,系統(tǒng)除了提供定義外碼的機(jī)制外,還應(yīng)提供定義外碼是否允許空值的機(jī)制。2.在被參照關(guān)系中刪除元組的問題當(dāng)刪除被參照關(guān)系的某個元組時,而參照關(guān)系存在假設(shè)干元組,且其外碼值與被參照關(guān)系中刪除元組的主碼值相同。如:員工和部門關(guān)系,部門dept關(guān)系中,部門編號dno是主碼;員工employ關(guān)系中,員工編號eno是主碼,員工所在部門dno是外碼,對應(yīng)dept中的主鍵。刪除dept部門編號dno=9999的部門,而employ中存在dno=9999的8名員工。這時可有三種不同的刪除策略:(1)級聯(lián)刪除(CASCADES)將參照關(guān)系外碼值與被參照關(guān)系中要刪除元組主碼值相同的元組一起刪除。如上例中,刪除關(guān)系dept中dno=9999的部門,同時刪除employ中8名dno=9999的員工。(2)受限刪除〔RESTRICTED〕僅當(dāng)參照關(guān)系中沒有任何元組的外碼值與被參照關(guān)系中要刪除元組的主碼值相同時,系統(tǒng)才執(zhí)行刪除操作,否那么拒絕此刪除操作。如上例中,刪除關(guān)系dept中dno=9999的部門時,檢查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的部門時,檢查employ中是否有dno=9999的員工,如果有將employ中dno=9999員工的dno設(shè)置為NULL。3.在參照關(guān)系中插入元組時的問題當(dāng)參照關(guān)系插入某個元組,而被參照關(guān)系不存在相應(yīng)的元組。如向關(guān)系employ中插入部門編號dno=9999,員工編號eno=1968的元組(1968,9999),而關(guān)系dept中沒有dno=9999的部門。這時可有以下兩種插入策略:(1)受限插入僅當(dāng)被參照關(guān)系中存在相應(yīng)的元組,其主碼值與參照關(guān)系插入元組的外碼值相同時,系統(tǒng)才允許插入,否那么拒絕插入。在上例中,系統(tǒng)拒絕插入employ元組(1968,9999),因?yàn)楸粎⒄贞P(guān)系dept中沒有dno=9999的元組。(2)遞歸插入首先向被參照關(guān)系中插入相應(yīng)的元組,其主碼值等于參照關(guān)系插入元組的外碼值,然后向參照關(guān)系插入元組。在上例中,系統(tǒng)先在dept中插入dno=9999的元組,然后在關(guān)系employ中插入元組(1968,9999)。4.修改關(guān)系中主碼的問題(1)不允許修改主碼在有些RDBMS中,不允許修改關(guān)系主碼。如上例中不能修改dept關(guān)系中的部門編號dno。如果要修改,只能先刪除,然后再增加。(2)允許修改主碼在有些RDBMS中,允許修改關(guān)系主碼,但必須保證主碼的唯一性和非空,否那么拒絕修改。當(dāng)修改的關(guān)系是被參照關(guān)系時,還必須檢查參照關(guān)系。如上例中修改dept中的dno=9999為dno=8888,檢查employ關(guān)系中是否有dno=9999的元組,如果存在,那么與刪除策略相同。當(dāng)修改的關(guān)系是參照關(guān)系時,要檢查被參照關(guān)系。如學(xué)生-選課關(guān)系中,選課關(guān)系elective中的學(xué)生號sno和課程號cno聯(lián)合為主碼,sno也是外碼,對應(yīng)student中的學(xué)生編號sno。如果選課elective關(guān)系中的(90211111,20,90)改為〔90212222,20,90〕,檢查student關(guān)系中是否存在sno=90212222的主碼值,否那么與插入策略相同。從上面的討論我們看到DBMS在實(shí)現(xiàn)參照完整性時,除了要提供定義主碼、外碼的機(jī)制外,還需要提供不同的策略供用戶選擇。選擇哪種策略,都要根據(jù)應(yīng)用環(huán)境的要求確定。6.2.4SQLServer的完整性SQLServer提供了比擬完善的完整性約束機(jī)制,不僅有實(shí)體完整性和參照完整性,還提供了多種自定義完整性的方法。1.SQLServer的實(shí)體完整性實(shí)體完整性約束就是定義主鍵,并設(shè)置主鍵不為空(NOTNULL)。定義主鍵可以使用CREATETABLE語句,在建立表時定義;如果創(chuàng)立表時沒有設(shè)置主鍵,可以使用ALTERTABLE語句增加主鍵,在增加主鍵時,如果原有數(shù)據(jù)中設(shè)置主鍵的列不符合主鍵約束條件(NOTNULL和唯一性),拒絕執(zhí)行,要先對數(shù)據(jù)進(jìn)行處理。創(chuàng)立表時定義主鍵例如:CREATETABLEstudent(snoCHAR(8)NOTNULL,snameVARCHAR2(10),sexCHAR(2),birthdayDATE,CONSTRAINTsno_pkPRIMARYKEY〔sno〕〕;首先定義sno不為空NOTNULL,使用關(guān)鍵字PRIMARYKEY定義sno為主鍵,其約束名為sno_pk,SQLServer根據(jù)主鍵自動建立索引,索引名為sno_pk。當(dāng)主鍵由一個字段組成時,可以直接在字段后面定義主鍵,稱為列約束,如:snoCHAR(8)NOTNULLPRIMARYKEY,使用ALTERTABLE增加主鍵定義例如:在創(chuàng)立課程關(guān)系中course中已經(jīng)定義了課程編號cnoCHAR(4)NOTNULL和課程名稱cnameVARCHAR(20),沒有定義主碼,下面操作增加主鍵,約束名為cno_pk:ALTERTABLEcourseADDCONSTRAINTcno_pkPRIMARYKEY(cno);2.SQLServer的參照完整性參照完整性就是定義好被參照關(guān)系及其主碼后,在參照關(guān)系中定義外鍵。定義語法:CONSTRAINTconstraint_nameFOREINKEY

(column[,...])REFERENCESref_table(ref_column[,...])[ONDELETE{CASCADE|NOACTION}][ONUPDATE{CASCADE|NOACTION}]其中:constraint_name:限制名。FOREINKEY(column[,...]):外鍵,如果是單個字段,可作為列約束,省略限制名。REFERENCESref_table(ref_column[,...]):被參照關(guān)系及字段。ONDELETE{CASCADE|NOACTION}:定義刪除行為,CASCADE為級聯(lián)刪除,NOACTION為不允許刪除。ONUPDATE{CASCADE|NOACTION}:定義更新行為,CASCADE為級聯(lián)更新,NOACTION為不允許更新。例如,以student、course為參照關(guān)系,建立elective關(guān)系,同時定義elective關(guān)系的外碼(sno,cno),分別對應(yīng)student中的主碼sno和course中的主碼cno。使用CREATETABLE語句,在表建立時定義外鍵,如果表已經(jīng)創(chuàng)立了,可以使用ALTERTABLE語句增加或修改。創(chuàng)立表時定義外鍵例如: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級聯(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語句,在表建立時一起設(shè)置,如:CREATETABLEstudent(snoCHAR(8)NOTNULL,snameVARCHAR(20));如果創(chuàng)立表時沒有NOTNULL約束,可以使用ALTERTABLE語句修改。在修改時,如果原有數(shù)據(jù)中有NULL值,將拒絕執(zhí)行,要先對數(shù)據(jù)進(jìn)行處理。如增加student表中name列的NOTNULL約束。ALTERTABLEstudentMODIFY(nameVARCHAR2(10)NOTNULL);(2)CHECK約束CHECK約束設(shè)置一個特殊的布爾條件,只有使布爾條件為TRUE的數(shù)據(jù)才接受。CHECK約束用于增強(qiáng)表中數(shù)據(jù)的簡單商業(yè)規(guī)那么。用戶使用CHECK約束保證數(shù)據(jù)規(guī)那么的一致性。如果用戶的商業(yè)規(guī)那么需要復(fù)雜的數(shù)據(jù)檢查,那么可以使用觸發(fā)器(TRIGGER)。CHECK約束不保護(hù)LOB類型的數(shù)據(jù)列。單一數(shù)據(jù)列可以有多個CHECK約束保護(hù),一個CHECK約束可以保護(hù)多個數(shù)據(jù)列。當(dāng)CHECK約束保護(hù)多個數(shù)據(jù)列時,必須使用表約束語法??捎肅REATETABLE語句在定義表時設(shè)置CHECK約束,如:CREATETABLEstudent(snoCHAR(8)NOTNULL,sexCHAR(2),ageint,CONSTRAINTage_ckCHECK(age>20));如果CHECK只對一列進(jìn)行約束,可以作為列約束直接寫在列后面:ageintCHECK(age>20),ALTERTABLE語句可以增加或修改CHECK約束。如在student表中增加性別sex約束:ALTERTABLEstudentADDCONSTRAINTsex_ckCHECK(sexin(‘男’,’女’));(3)UNIQUE約束唯一性UNIQUE約束使數(shù)據(jù)列中任何兩行的數(shù)據(jù)都不相同或?yàn)镹ULL。唯一性約束與主碼不同的是,唯一性約束可以為NULL(是指沒有NOTNULL約束的情況下),一個表可以有多個唯一性約束,而主碼只能有一個。可以使用CREATETABLE語句,在創(chuàng)立表時設(shè)置UNIQUE約束。如將學(xué)生表中身份證sid設(shè)置為UNIQUE約束:CREATETABLEstudent(snoCHAR(8)NOTNULL,sidCHAR(20),cnameVARCHAR(20),CONSTRAINTsid_uniqueUNIQUE(sid));UNIQUE由單列組成,可以作為列約束直接寫在列的后面:sidCHAR(20)UNIQUE,ALTERTABLE語句可以增加或修改UNIQUE約束。在修改時,如果原有數(shù)據(jù)中不符合唯一性,那么拒絕執(zhí)行,要先對數(shù)據(jù)進(jìn)行處理。如在課程表course中增加課程名cname的UNIQUE約束:ALTERTABLEcourseADDCONSTRAINTcname_uniqueUNIQUE(cname);約束名為cname_unique。由于定義UNIQUE唯一性約束后,自動建立索引,所以一般指定約束名。6.3數(shù)據(jù)庫的并發(fā)控制數(shù)據(jù)庫的并發(fā)控制和恢復(fù)技術(shù)與事務(wù)密切相關(guān),事務(wù)是并發(fā)控制和恢復(fù)的根本單位。先介紹事務(wù)的根本概念,然后介紹并發(fā)控制,在下一節(jié)介紹恢復(fù)技術(shù)。6.3.1事務(wù)的根本概念1.事務(wù)定義事務(wù)(Transaction)是用戶定義的一個數(shù)據(jù)庫操作序列,這些操作要么全做,要么全不做,是一個不可分割的工作單位。一個事務(wù)可以是一條SQL語句,也可以是一組SQL語句。如銀行轉(zhuǎn)帳操作,從A帳號轉(zhuǎn)入1000元資金到B帳號,包括從A帳號取出1000元和將1000元存入B帳號兩個操作,如果從A帳號取出1000元成功而B帳號存入1000元失敗,或者從A帳號取出1000元失敗而B帳號存入1000成功,只要其中一個操作失敗,轉(zhuǎn)帳操作失敗。事務(wù)是這樣一種機(jī)制,它確保多個SQL語句被當(dāng)作單個工作單元來處理。在SQL語言中,事務(wù)控制的語句有:BEGINTRANSACTION、COMMIT、ROLLBACK。如果用戶沒有指明事務(wù)的開始和結(jié)束,DBMS按缺省規(guī)定自動劃分事務(wù)。用戶以BEGINTRANSACTION開始事務(wù),以COMMIT或ROLLBACK結(jié)束事務(wù)。COMMIT表示提交事務(wù),用于正常結(jié)束事務(wù)。ROLLBACK表示回滾,在事務(wù)執(zhí)行過程中發(fā)生故障,事務(wù)不能繼續(xù),撤消事務(wù)中所有已完成的操作,回到事務(wù)開始的狀態(tài)。2.事務(wù)性質(zhì)事務(wù)具有四個特性:原子性〔Atomicity〕、一致性〔Consistency〕、隔離性〔Isolation〕和持續(xù)性〔Durability〕。簡稱為ACID特性。(1)原子性事務(wù)是數(shù)據(jù)庫的邏輯工作單位,被看做一個單一的、不可分割的操作單元。事務(wù)中包括的所有操作要么都做,要么都不做。(2)一致性事務(wù)執(zhí)行的結(jié)果必須是使數(shù)據(jù)庫從一個一致狀態(tài)變到另一個一致狀態(tài)。因此當(dāng)數(shù)據(jù)庫只包含成功事務(wù)提交的結(jié)果時,就說數(shù)據(jù)庫處于一致狀態(tài)。如果數(shù)據(jù)庫系統(tǒng)運(yùn)行中發(fā)生故障,有些事務(wù)尚未完成就被迫中斷,系統(tǒng)將事務(wù)中對數(shù)據(jù)庫的所有已完成的操作全部撤消,回滾到事務(wù)開始時的一致狀態(tài)。(3)隔離性一個事務(wù)的執(zhí)行不能被其他事務(wù)干擾。即一個事務(wù)內(nèi)部的操作及使用的數(shù)據(jù)對其他并發(fā)事務(wù)是隔離的,并發(fā)執(zhí)行的各個事務(wù)之間不能互相干擾。(4)持續(xù)性指一個事務(wù)一旦提交,它對數(shù)據(jù)庫中數(shù)據(jù)的改變就應(yīng)該是永久性的。接下來的其他操作或故障不應(yīng)該對其執(zhí)行結(jié)果有任何影響。保證事務(wù)ACID特性是事務(wù)處理的重要任務(wù)。事務(wù)ACID特性可能遭到破壞的因素有:(1)多個事務(wù)并行運(yùn)行時,不同事務(wù)的操作交叉執(zhí)行。(2)事務(wù)在運(yùn)行過程中被強(qiáng)行停止。在第一種情況下,數(shù)據(jù)庫管理系統(tǒng)必須保證多個事務(wù)的交叉運(yùn)行不影響這些事務(wù)的原子性;在第二種情況下,數(shù)據(jù)庫管理系統(tǒng)必須保證被強(qiáng)行終止的事務(wù)對數(shù)據(jù)庫和其它事務(wù)沒有任何影響。這些就是數(shù)據(jù)庫管理系統(tǒng)中并發(fā)控制和恢復(fù)機(jī)制的任務(wù)。6.3.2并發(fā)控制概述多用戶數(shù)據(jù)庫系統(tǒng)中,運(yùn)行的事務(wù)很多。事務(wù)可以一個一個地串行執(zhí)行,即每個時刻只有一個事務(wù)運(yùn)行,其它事務(wù)必須等待這個事務(wù)結(jié)束后才能運(yùn)行,這樣可以有效保證數(shù)據(jù)的一致性,但是串行執(zhí)行使許多資源處于空閑狀態(tài),為了充分利用系統(tǒng)資源,發(fā)揮數(shù)據(jù)庫共享資源的特點(diǎn),應(yīng)該允許多個事務(wù)并行執(zhí)行。在單處理機(jī)系統(tǒng)中,事務(wù)并行執(zhí)行實(shí)際上是這些事務(wù)交替輪流執(zhí)行,這種并行執(zhí)行方式稱為交叉并行方式(InterleavedConcurrency)。在多處理機(jī)系統(tǒng)中,每個處理機(jī)可以運(yùn)行一個事務(wù),多個處理機(jī)可以運(yùn)行多個事務(wù),真正實(shí)現(xiàn)多個事務(wù)的并行運(yùn)行,這種并行執(zhí)行方式稱為同時并行方式(SimultaneousConcurrency)。當(dāng)多個事務(wù)被并行執(zhí)行時,稱這些事務(wù)為并發(fā)事務(wù)。并發(fā)事務(wù)可能產(chǎn)生多個事務(wù)存取同一數(shù)據(jù)的情況,如果不對并發(fā)事務(wù)進(jìn)行控制,就可能出現(xiàn)存取不正確的數(shù)據(jù),破壞數(shù)據(jù)的一致性。對并發(fā)事務(wù)進(jìn)行調(diào)度,使并發(fā)事務(wù)所操作的數(shù)據(jù)保持一致性的整個過程稱為并發(fā)控制。并發(fā)控制是數(shù)據(jù)庫管理系統(tǒng)的重要功能之一。下面以具體實(shí)例說明事務(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寫回數(shù)據(jù)庫。④乙售票員賣出一張,修改余額A=A-1=10-1=9,修改余額,把9寫回數(shù)據(jù)庫。結(jié)果明明賣出2張車票,但數(shù)據(jù)庫中車票余額只減少了一張為9張。事務(wù)T1和T2同時讀入一個數(shù)據(jù)并修改,結(jié)果T2提交的結(jié)果覆蓋了T1的結(jié)果,導(dǎo)致T1修改的喪失。這種情況為喪失修改。操作過程例如如下:順序事務(wù)T1事務(wù)T2①讀A=10②讀A=10③寫A=9④寫A=92.讀“臟”數(shù)據(jù)(DirtyRead)事務(wù)T1修改數(shù)據(jù)后,并將其寫回磁盤,事務(wù)T2讀同一數(shù)據(jù),T1由于某種原因被撤消,T1修改的值恢復(fù)原值,T2讀到的數(shù)據(jù)與數(shù)據(jù)庫中的數(shù)據(jù)不一致,是“臟”數(shù)據(jù),稱為讀“臟”數(shù)據(jù),讀“臟”數(shù)據(jù)的原因是讀取了未提交事務(wù)的數(shù)據(jù),所以又稱為未提交數(shù)據(jù)。①事務(wù)T1讀A=10;②事務(wù)T1寫A=5;③事務(wù)T2讀A=5;④事務(wù)T1撤消,使A恢復(fù)原值A(chǔ)=10;順序事務(wù)T1事務(wù)T2①讀A=10②寫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寫A=5;④事務(wù)T1驗(yàn)證原來的A=10,再讀,此時A=5;如果事務(wù)T1開始讀A=10,而后面讀A=5,重新讀A結(jié)果與前次結(jié)果不同。稱為不可重復(fù)讀。除了修改外,不可重復(fù)讀包括事務(wù)T2增加記錄和刪除記錄的情況。如果事務(wù)T1按一定條件從數(shù)據(jù)庫中檢索讀取了某些記錄,事務(wù)T2刪除了其中局部記錄,T1再次按相同條件讀取數(shù)據(jù)時,發(fā)現(xiàn)某些記錄消失。如果事務(wù)T1按一定條件從數(shù)據(jù)庫中檢索讀取了某些記錄,事務(wù)T2增加了一些記錄,T1再次按相同條件讀取數(shù)據(jù)時,發(fā)現(xiàn)多了一些記錄。順序事務(wù)T1事務(wù)T2①讀A=10②讀A=10③寫A=5④驗(yàn)證A=10?讀A=5產(chǎn)生上述三種數(shù)據(jù)不一致的主要原因是并行操作破壞了事務(wù)的隔離性。并發(fā)控制就是采用一定調(diào)度策略控制并發(fā)事務(wù),使事務(wù)的執(zhí)行不受其它事務(wù)的干擾,從而防止數(shù)據(jù)的不一致性。多個事務(wù)的并行執(zhí)行是正確的,當(dāng)且僅當(dāng)其結(jié)果與按某一次序串行地執(zhí)行他們時的結(jié)果相同,這種調(diào)度策略稱為可串行化(Serializable)的調(diào)度??纱行允遣l(fā)事務(wù)正確性的準(zhǔn)那么。按這個準(zhǔn)那么規(guī)定,一個給定的并發(fā)調(diào)度,當(dāng)且僅當(dāng)它是可串行化的,才認(rèn)為是正確調(diào)度。并發(fā)控制方法主要有封鎖(Locking)方法、時間戳(TimeStamp)方法、樂觀(Optimistic)方法等,主要介紹在DBMS中使用較多的封鎖方法。6.3.3封鎖封鎖就是事務(wù)T在對某個數(shù)據(jù)對象操作之前,先向系統(tǒng)發(fā)出請求,對其加鎖。加鎖后事務(wù)T就對該數(shù)據(jù)對象有了一定的控制,在事務(wù)T釋放它的鎖之前,其它的事務(wù)不能更新此數(shù)據(jù)對象。1.封鎖類型根本的封鎖類型有兩種:排它鎖(ExclusiveLocks,簡記為X鎖)和共享鎖(ShareLocks,簡記為S鎖)。排它鎖又稱為寫鎖。假設(shè)事務(wù)T對數(shù)據(jù)對象A加上X鎖,那么只允許T讀取和修改A,其它任何事務(wù)都不能再對A加任何類型的鎖,直到T釋放A上的鎖。這就保證了其它事務(wù)在T釋放A上的鎖之前不能再讀取和修改A。共享鎖又稱為讀鎖。假設(shè)事務(wù)T對數(shù)據(jù)對象A加上S鎖,那么事務(wù)T可以讀A,但不能修改A,其它事務(wù)只能再對A加S鎖,而不能加X鎖,直到T釋放A上的S鎖。這就保證了其它事務(wù)可以讀A,但在T釋放A上的S鎖之前其它事務(wù)不能對A做任何修改。排它鎖與共享鎖的相容矩陣如下:T1T2XS-XNNYSNYY-YYY2.封鎖協(xié)議在運(yùn)用X鎖和S鎖這兩種根本封鎖,對數(shù)據(jù)對象加鎖時,還需要約定一些規(guī)那么,例如應(yīng)何時申請X鎖或S鎖、持鎖時間、何時釋放等,我們稱這些規(guī)那么為封鎖協(xié)議(LockingProtocol)。對封鎖方式規(guī)定不同的規(guī)那么,就形成了各種不同的封鎖協(xié)議。下面介紹三級封鎖協(xié)議。對并發(fā)事物的不正確調(diào)度可能會帶來喪失修改、不可重復(fù)讀和讀“臟”數(shù)據(jù)等不一致性問題,三級封鎖協(xié)議分別在不同程度上解決了這些問題,為并發(fā)事物的正確調(diào)度提供一定的保證。不同級別的封鎖協(xié)議使系統(tǒng)一致性到達(dá)的級別是不同的,而兩段鎖協(xié)議是為了保證并發(fā)事務(wù)的可串行性(Serializability)。(1)一級封鎖協(xié)議一級封鎖協(xié)議是:事務(wù)T在修改數(shù)據(jù)R之前必須先對其加X鎖,直到事務(wù)結(jié)束才釋放。事務(wù)結(jié)束包括正常結(jié)束〔COMMIT〕和非正常結(jié)束〔ROLLBACK〕。一級封鎖協(xié)議可防止喪失修改,并保證事務(wù)T是可恢復(fù)的。順序事務(wù)T1事務(wù)T2①XlockA②讀A=20XlockA③寫A=19等待④COMMIT等待⑤UnXlockA獲取XlockA⑥讀A=19⑦寫A=18⑧UnXlockA⑨其它操作⑩COMMIT在一級封鎖協(xié)議中,如果僅僅是讀數(shù)據(jù)不對其進(jìn)行修改,是不需要加鎖的,所以它不能保證不讀“臟”數(shù)據(jù)和可重復(fù)讀。(2)二級封鎖協(xié)議二級封鎖協(xié)議是:一級封鎖協(xié)議加上事務(wù)T在讀取數(shù)據(jù)R之前必須先對其加S鎖,讀完后即可釋放S鎖。二級封鎖協(xié)議除防止了喪失修改,還可進(jìn)一步防止讀“臟”數(shù)據(jù)。由于讀完后即可釋放S鎖,所以不能保證可重復(fù)讀。順序事務(wù)T1事務(wù)T2①XlockA②讀A=10SlockA③寫A=5等待S④ROLLBACK(A=10)等待⑤UnXlockA獲取SlockA⑥讀A=10⑦UnSLockA⑧COMMIT(3)三級封鎖協(xié)議三級封鎖協(xié)議是:一級封鎖協(xié)議加上事務(wù)T在讀取數(shù)據(jù)R之前必須先對其加S鎖,直到事務(wù)結(jié)束才釋放。三級封鎖協(xié)議除防止了喪失修改和不讀‘臟’數(shù)據(jù)外,還進(jìn)一步防止了不可重復(fù)讀。順序事務(wù)T1事務(wù)T2①SlockA②讀A=10XlockA③讀A=10(驗(yàn)證)等待④COMMIT等待⑤UnSlockA獲取XlockA⑥讀A=10⑦寫A=5⑧COMMIT⑨UnXlockA(4)兩段鎖協(xié)議兩段鎖協(xié)議(Two-PhaseLocking,簡稱2PL),是指所有事務(wù)必須分兩個階段對數(shù)據(jù)項(xiàng)加鎖和解鎖。在對任何數(shù)據(jù)進(jìn)行讀、寫操作之前,首先要申請并獲得對該數(shù)據(jù)的封鎖,在釋放一個封鎖之后,事務(wù)不再申請和獲得任何其他封鎖。所謂“兩段”鎖的含義是,事務(wù)分為兩個階段,第一階段是獲得封鎖,也稱為擴(kuò)展階段。在這階段,事務(wù)可以申請獲得任何數(shù)據(jù)項(xiàng)上的任何類型的鎖,但是不能釋放任何鎖。第二階段是釋放封鎖,也稱為收縮階段。在這階段,事務(wù)可以釋放任何數(shù)據(jù)項(xiàng)上的任何類型的鎖,但不能再申請任何鎖。SlockASlockBXlockCUnSlockAUnSlockBUnXlockCSlockASlockBXlockCUnSlockAUnSlockBUnXlockC擴(kuò)展階段收縮階段例如事務(wù)T2不遵守兩段鎖協(xié)議,其封鎖、解鎖序列:SlockAUnSlockASlockBXlockCUnXlockCUnSlockB;可以證明,假設(shè)并發(fā)執(zhí)行的所有事務(wù)均遵守兩段鎖協(xié)議,那么對這些事務(wù)的任何并發(fā)調(diào)度策略都是可串行化的。兩階段鎖定義了事務(wù)如何獲取和釋放鎖。兩階段鎖定保證了可串行化,兩個階段分別是:增長階段:在增長階段事務(wù)獲得所需要的鎖,但不釋放任何數(shù)據(jù)上的鎖。一旦所有的鎖都已被獲得了,事務(wù)就到達(dá)了它的鎖定點(diǎn)??s減階段:在縮減階段事務(wù)釋放所有的鎖,但不能獲得新鎖。3.死鎖(1)產(chǎn)生死鎖的原因如果事務(wù)T1封鎖了數(shù)據(jù)R1,T2封鎖了數(shù)據(jù)R2,然后T1又請求封鎖R2,因T2已封鎖了R2,于是T1等待T2釋放R2上的鎖。接著T2又申請封鎖R1,因T1已封鎖了R1,T2也只能等待T1釋放R1上的鎖。這樣就出現(xiàn)了T1在等待T2,而T2又在等待T1的局面,T1和T2兩個事務(wù)永遠(yuǎn)不能結(jié)束,形成死鎖。順序事務(wù)T1事務(wù)T2①LockR1②LockR2③請求LockR2④等待請求LockR1⑤等待等待⑥永遠(yuǎn)等待永遠(yuǎn)等待(2)死鎖的預(yù)防在數(shù)據(jù)庫中,產(chǎn)生死鎖的原因是兩個或多個事務(wù)都已封鎖了一些數(shù)據(jù)對象,然后又都請求對已被其他事務(wù)封鎖的數(shù)據(jù)對象加鎖,從而出現(xiàn)死等待。防止死鎖的發(fā)生其實(shí)就是要破壞產(chǎn)生死鎖的條件。預(yù)防死鎖通常有兩種方法:=1\*GB3①一次封鎖法一次封鎖法要求每個事務(wù)必須一次將所有要使用的數(shù)據(jù)全部加鎖,否那么就不能繼續(xù)執(zhí)行。一次封鎖法雖然可以有效地防止死鎖的發(fā)生,但也存在問題,一次就將以后要用到的全部數(shù)據(jù)加鎖,勢必擴(kuò)大了封鎖的范圍,從而降低了系統(tǒng)的并發(fā)度。=2\*GB3②順序封鎖法順序封鎖法是預(yù)先對數(shù)據(jù)對象規(guī)定一個封鎖順序,所有事務(wù)都按這個順序?qū)嵭蟹怄i。順序封鎖法可以有效地防止死鎖,但也同樣存在問題。事務(wù)的封鎖請求可以隨著事務(wù)的執(zhí)行而動態(tài)地決定,很難事先確定每一個事務(wù)要封鎖哪些對象,因此也就很難按規(guī)定的順序去施加封鎖??梢?,可用一次封鎖法和順序封鎖法預(yù)防死鎖,但是不能根本消除死鎖,因此DBMS在解決死鎖的問題上還要有診斷并解除死鎖的方法。(3)死鎖的診斷與解除=1\*GB3①超時法如果一個事務(wù)的等待時間超過了規(guī)定的時限,就認(rèn)為發(fā)生了死

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論