下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
第5章
數(shù)據(jù)庫的完整性和安全性本章學(xué)習(xí)目標(biāo)掌握數(shù)據(jù)庫完整性的基本概念。清楚數(shù)據(jù)庫完整性約束條件的分類。掌握并運用SQL實現(xiàn)實體完整性和參照完整性的定義。運用SQL靈活實現(xiàn)用戶自定義完整性的各種約束。掌握完整性約束的修改方法。理解觸發(fā)器的概念和作用。掌握數(shù)據(jù)庫安全性的基本概念。清楚DBMS中的安全性保護措施。清楚SQL中的安全機制。掌握并運用SQL實現(xiàn)授權(quán)和角色機制。了解其他安全措施。本章概述數(shù)據(jù)庫作為資源共享和存放大量數(shù)據(jù)的場所,如何能更好地保護數(shù)據(jù)庫中的數(shù)據(jù)就顯得尤為重要。數(shù)據(jù)的完整性和安全性是數(shù)據(jù)庫保護的兩個不同方面。安全性是防止非法用戶惡意破壞和越權(quán)存取數(shù)據(jù),確保用戶被限制在其想做的事情范圍之內(nèi)。完整性則是防止合法用戶使用數(shù)據(jù)庫時無意中造成的破壞,確保用戶所做的事情是正確的。即安全性措施的防范對象是非法用戶和非法操作,完整性措施的防范對象是不合語義的數(shù)據(jù)。主要內(nèi)容5.1完整性概述5.3參照完整性5.4用戶自定義完整性5.2實體完整性5.5完整性約束的修改5.6觸發(fā)器5.8DBMS中的安全性保護5.9SQL中的安全性機制5.7安全性概述5.10其它安全機制主要內(nèi)容5.1完整性概述5.3參照完整性5.4用戶自定義完整性5.2實體完整性5.5完整性約束的修改5.6觸發(fā)器5.8DBMS中的安全性保護5.9SQL中的安全性機制5.7安全性概述5.10其它安全機制5.1.1完整性概念數(shù)據(jù)庫的完整性(integrity)的基本含義是指數(shù)據(jù)庫中數(shù)據(jù)的正確性、有效性和相容性,其目的是防止不符合語義、不正確的數(shù)據(jù)進入數(shù)據(jù)庫,從而來保證數(shù)據(jù)庫系統(tǒng)能夠真實的反映客觀現(xiàn)實世界。正確性(correctness)是指數(shù)據(jù)的合法性,例如成績屬于數(shù)值型數(shù)據(jù),只能含有數(shù)字而不能含有字母。有效性(valid)是指數(shù)據(jù)是否屬于所定義域的有效范圍,例如性別只能是男或女。相容性(consistency)是指表示同一事實的兩個數(shù)據(jù)應(yīng)當(dāng)一致,不一致即是不相容。例如一個學(xué)生不能有兩個學(xué)號。DBMS必須提供一種功能來確保數(shù)據(jù)的正確性,避免不合語義的數(shù)據(jù)造成的無效操作和錯誤結(jié)果,還要檢查先后輸入的數(shù)據(jù)是否一致。5.1.2完整性約束條件
數(shù)據(jù)庫中的數(shù)據(jù)要成為有意義的信息,必須滿足一定的語義約束條件。數(shù)據(jù)庫中數(shù)據(jù)應(yīng)當(dāng)滿足的條件稱為“完整性約束條件”,也稱為“完整性規(guī)則”。它是DBMS控制數(shù)據(jù)完整性的依據(jù),是整個完整性控制機制的核心。
完整性約束條件作用的對象是關(guān)系、元組和屬性,這三種對象的狀態(tài)可以是靜態(tài)的,也可以是動態(tài)的。5.1.2完整性約束條件
靜態(tài)約束是關(guān)于數(shù)據(jù)庫狀態(tài)合理性的約束,是指數(shù)據(jù)庫每一確定狀態(tài)時的數(shù)據(jù)對象所應(yīng)滿足的約束條件。分別作用于屬性、元組和關(guān)系就表現(xiàn)為:(1)靜態(tài)屬性級約束:是對一個屬性的取值域的說明,即對數(shù)據(jù)類型、數(shù)據(jù)格式和取值范圍的約束。如,學(xué)生的出生年月日必須為日期型,成績的取值范圍必須在0~100等。(2)靜態(tài)元組級約束:是對元組中各個屬性值之間關(guān)系的約束。如圖書管理表中有總庫存量,借出量,和剩余量三個屬性,其中借出量和剩余量都不得超過總庫存量。(3)靜態(tài)關(guān)系級約束:是一個關(guān)系中各個元組之間或者若干個關(guān)系之間常常存在的各種聯(lián)系的約束。常見的靜態(tài)關(guān)系約束有:①實體完整性;②參照完整性;③函數(shù)依賴約束,大部分函數(shù)依賴約束都在關(guān)系模式中定義;④統(tǒng)計約束,即字段值與關(guān)系中多個元組的統(tǒng)計值之間的約束關(guān)系。5.1.2完整性約束條件
動態(tài)約束是指數(shù)據(jù)庫從一種正確狀態(tài)轉(zhuǎn)移到另一種狀態(tài)時,新、舊值之間所應(yīng)滿足的約束條件。例:學(xué)生的最高學(xué)位,如下動態(tài)轉(zhuǎn)移是正確的:學(xué)士到碩士、碩士到博士。(1)動態(tài)屬性級約束:是修改定義或?qū)傩灾禃r應(yīng)滿足的約束條件,包括兩種情況。修改定義時的約束。例:將允許空值的屬性改為不允許空值時,如果該屬性當(dāng)前已存在空值,則規(guī)定拒絕修改。修改屬性值時的約束。例:修改屬性值時有時需要參照其舊值,或新舊值之間應(yīng)該滿足某種約束條件,如學(xué)生的年齡只能增長。(2)動態(tài)元組級約束:是指修改某個元組的值時需要參照該元組的原有值,或者元組中各個字段之間應(yīng)當(dāng)滿足某種約束條件。例:給職工提升工資時新工資不得低于原工資+現(xiàn)工齡×10。(3)動態(tài)關(guān)系級約束:是加在關(guān)系變化前后狀態(tài)上的限制條件。例:事物一致性、原子性等約束條件。5.1.2完整性約束條件
完整性約束條件從執(zhí)行時間上又可分為立即執(zhí)行約束(immediateCONSTRAINTS)和延遲執(zhí)行約束(deferredCONSTRAINTS)。立即執(zhí)行約束是指在執(zhí)行用戶事物過程中,某一條語句執(zhí)行完后,系統(tǒng)立即對此數(shù)據(jù)進行完整性約束條件檢查。如果發(fā)現(xiàn)用戶操作請求違背了立即執(zhí)行約束,則可以拒絕該操作,以保證數(shù)據(jù)的完整性。延遲執(zhí)行約束是指在整個事物執(zhí)行結(jié)束后再對約束條件進行完整性檢查,結(jié)果正確后才能提交。如果發(fā)現(xiàn)用戶操作請求違背了延遲執(zhí)行約束,而又不知道是哪個事物的操作破壞了完整性,則只能拒絕整個事物,把數(shù)據(jù)庫恢復(fù)到該事物執(zhí)行前的狀態(tài)。完整性約束條件還可以作用在數(shù)據(jù)庫上,說明數(shù)據(jù)庫的合法取值。通常,數(shù)據(jù)庫的約束檢查是可以延遲到事務(wù)提交時進行的,而上述作用于屬性、元組和關(guān)系的約束檢查是立即進行的。所有數(shù)據(jù)庫的更新都不能破壞數(shù)據(jù)庫的完整性。5.1.3完整性控制機制為了維護數(shù)據(jù)庫的完整性,DBMS必須提供以下三種機制:1.完整性約束條件定義
完整性約束條件也稱為完整性規(guī)則,是數(shù)據(jù)庫中的數(shù)據(jù)必須滿足的語義約束條件。SQL標(biāo)準(zhǔn)使用了一系列概念來描述完整性,包括關(guān)系模型的實體完整性、參照完整性和用戶定義完整性。這些完整性一般由SQL的DDL語義來實現(xiàn),它們作為數(shù)據(jù)庫模式的一部分存入數(shù)據(jù)字典中。2.完整性檢查方法
檢查數(shù)據(jù)是否滿足已定義的完整性約束條件稱為完整性檢查。一般在INSERT、UPDATE、DELETE語句執(zhí)行后開始檢查,也可以在事務(wù)提交時檢查。檢查這些操作執(zhí)行后數(shù)據(jù)庫中的數(shù)據(jù)是否違背了完整性約束條件。3.違約處理
若發(fā)現(xiàn)用戶操作違背了完整性約束條件,應(yīng)采取一定的措施,如拒絕(NOACTION)執(zhí)行該操作,或級連(CASCADE)執(zhí)行其它操作,進行違約處理以保證數(shù)據(jù)的完整性。目前商用的數(shù)據(jù)庫管理系統(tǒng)都支持完整性控制。即完整性定義和檢查控制由DBMS實現(xiàn),不必由應(yīng)用程序來完成,從而減輕了應(yīng)用程序員的負(fù)擔(dān)。主要內(nèi)容5.1完整性概述5.3參照完整性5.4用戶自定義完整性5.2實體完整性5.5完整性約束的修改5.6觸發(fā)器5.8DBMS中的安全性保護5.9SQL中的安全性機制5.7安全性概述5.10其它安全機制5.2實體完整性
實體完整性要求基本表的主碼值唯一且不允許為空值。
在SQL中,實體完整性定義是使用CREATETABLE語句中的PRIMARYKEY短語來實現(xiàn),或通過使用ALTERTABLE語句中的ADDPRIMARYKEY短語來實現(xiàn)。
對單屬性構(gòu)成的碼有兩種說明方法:定義為列級約束條件定義為表級約束條件對多個屬性構(gòu)成的碼只有一種說明方法,即定義為表級約束條件。5.2.1實體完整性定義[例5-1]將Student表中的Sno屬性定義為碼。CREATETABLEStudent(SnoCHAR(7),SnameCHAR(8)NOTNULL,SsexCHAR(2),SageSMALLINT,SdeptCHAR(20),
PRIMARYKEY(Sno));/*在表級定義主碼*/其中,Sno為表Student的主碼,它由主碼約束說明PRIMARYKEY實現(xiàn)。對于這種情況,還可以直接在列Sno定義的同一行上定義為表Student的主碼。如:CREATETABLEStudent(SnoCHAR(7)PRIMARYKEY,/*在列級定義主碼*/SnameCHAR(8)NOTNULL,SsexCHAR(2),SageSMALLINT,SdeptCHAR(20));注意,如果主碼包含多列,則只能在表級定義。5.2.1實體完整性定義[例5-2]將SC表中的Sno,Cno屬性組定義為主碼。CREATETABLESC(SnoCHAR(7),CnoCHAR(4),GradeSMALLINT,PRIMARYKEY(Sno,Cno));/*只能在表級定義主碼*/5.2.2實體完整性檢查和違約處理
在用PRIMAYRKEY語句定義了關(guān)系的主碼后,每個用戶程序?qū)颈聿迦胍粭l記錄或者對主碼列進行更新操作時,RDBMS將按實體完整性規(guī)則自動進行檢查。包括:(1)檢查主碼值是否唯一,如果不唯一則拒絕插入或修改。(2)檢查主碼的各個屬性是否為空,只要有一個為空就拒絕插入或修改。檢查主碼值的唯一性,可以采用全表掃描法或B+樹索引掃描法。全表掃描法:從外存依次將表的每個數(shù)據(jù)塊讀入內(nèi)存,判斷塊中的每一條記錄的主碼值與待插入(或修改)記錄的主碼值是否相同,如果相同,則阻止插入(或修改)。全表掃描法如圖5-1所示。待插入或修改的記錄碼值i屬性值i1屬性值i2……碼值11屬性值11屬性值12……碼值21屬性值21屬性值22……碼值31屬性值31屬性這32…………5.2.2實體完整性檢查和違約處理B+樹索引掃描法
全表掃描法是十分耗時的,為了避免對基本表進行全表掃描,DBMS核心一般都在主碼上自動建立一個B+樹索引,通過掃描索引來查找基本表中是否存在相同的主碼值,這將大大提高效率。
例如,如果新插入記錄的主碼值是25,通過主碼索引,從B+樹的根結(jié)點開始查找,只要讀取3個結(jié)點就可以知道該主碼值已經(jīng)存在,所以不能插入這條記錄。這3個結(jié)點是根結(jié)點(51)、中間結(jié)點(1230)、葉節(jié)點(152025)。如果新插入記錄的主碼值是86,也只要查找3個結(jié)點就可以知道該主碼值不存在,所以可以插入該記錄,如圖5-2所示。主要內(nèi)容5.1完整性概述5.3參照完整性5.4用戶自定義完整性5.2實體完整性5.5完整性約束的修改5.6觸發(fā)器5.8DBMS中的安全性保護5.9SQL中的安全性機制5.7安全性概述5.10其它安全機制5.3參照完整性
參照完整性是指基本關(guān)系R的任何一個元組在外碼F上的取值要么是空值,要么是被參照關(guān)系S中一個元組的主碼值。
SQL不僅可以實現(xiàn)實體完整性的定義,還可以通過CREATETABLE語句定義參照完整性規(guī)則。即用戶可以在建表時定義哪些列為外碼列,這個外碼對應(yīng)于哪個表的主碼。
一般來講,參照完整性的定義包括兩個部分:(1)
外碼說明,它由FOREIGNKEY(列名)語句來描述。(2)
被引用的表名和列名,由REFERENCES語句描述。5.3.1參照完整性定義[例5-3]關(guān)系SC中一個元組表示一個學(xué)生選修的某門課程的成績,Sno代表Student中的一個學(xué)生,Cno代表Course中的一門課程。因此Sno,Cno分別是對Student和Course的參照引用。CREATETABLESC(SnoCHAR(7),CnoCHAR(4),GradeSMALLINT,PRIMARYKEY(Sno,Cno),/*在表級定義實體完整性*/FOREIGNKEYSnoREFERENCESStudent(Sno),
/*在表級定義參照完整性*/FOREIGNKEYCnoREFERENCESCourse(Cno)/*在表級定義參照完整性*/);5.3.2參照完整性檢查和違約處理定義了參照完整性,對參照表和被參照表進行修改操作有可能會破壞參照完整性,系統(tǒng)首先會檢查是否違反了參照完整性,如果違反了,則進行違約處理。違約處理的策略如下:(1)拒絕(NOACTION)執(zhí)行。不允許該操作執(zhí)行,該策略一般設(shè)置為默認(rèn)策略。在被參照關(guān)系中刪除元組:僅當(dāng)參照關(guān)系中沒有任何元組的外碼值與被參照關(guān)系中要刪除元組的主碼值相同時,系統(tǒng)才執(zhí)行刪除操作,否則拒絕此操作。參照關(guān)系中可以隨意刪除元組。在參照關(guān)系中修改元組:僅當(dāng)參照關(guān)系中修改后的元組的外碼值依然在被參照關(guān)系中,系統(tǒng)才執(zhí)行修改操作,否則拒絕該操作。在被參照關(guān)系中修改元組:僅當(dāng)被參照關(guān)系中修改前的元組的主碼值沒有出現(xiàn)在參照關(guān)系的外碼中,系統(tǒng)才執(zhí)行修改操作,否則拒絕該操作。在參照關(guān)系中插入元組:僅當(dāng)參照關(guān)系中插入的元組的外碼值等于被參照關(guān)系中某個元組的主碼值時,系統(tǒng)才執(zhí)行插入操作,否則拒絕該操作。被參照關(guān)系可以隨意插入新元組。5.3.2參照完整性檢查和違約處理(2)級聯(lián)(CASCADE)操作。當(dāng)刪除或修改被參照表的一個元組造成了與參照表的不一致,則刪除或修改參照表中的所有造成不一致的元組。級聯(lián)操作必須在定義外碼時給出顯式定義。(3)設(shè)置為空值(SETNULL)。當(dāng)刪除或修改被參照表的一個元組時造成了不一致,則將參照表中的所有造成不一致的元組的對應(yīng)屬性設(shè)置為空值。(4)置空值刪除(NULLIFIES)。刪除被參照關(guān)系的元組,并將參照關(guān)系中相應(yīng)元組的外碼值置空值。主要內(nèi)容5.1完整性概述5.3參照完整性5.4用戶自定義完整性5.2實體完整性5.5完整性約束的修改5.6觸發(fā)器5.8DBMS中的安全性保護5.9SQL中的安全性機制5.7安全性概述5.10其它安全機制5.4用戶自定義完整性
用戶自定義完整性就是針對某一具體應(yīng)用的數(shù)據(jù)必須滿足的語義要求,由RDBMS提供,而不必由應(yīng)用程序承擔(dān)。5.4.1屬性上的約束條件
在CREATETABLE中定義屬性的同時可以根據(jù)應(yīng)用要求,定義屬性上的約束條件,即屬性值限制。當(dāng)往表中插入或修改屬性值時,系統(tǒng)檢查是否滿足約束條件,如果不滿足,則拒絕相應(yīng)的操作。屬性上的約束主要包括:列值非空(NOTNULL短語)列值唯一(UNIQUE短語)設(shè)置默認(rèn)值(DEFAULT短語)檢查列值是否滿足一個布爾表達式(CHECK短語)5.4.1屬性上的約束條件[例5-4]規(guī)定Student表的姓名屬性不能取空值。CREATETABLEStudent(SnoCHAR(7)PRIMARYKEY,SnameCHAR(8)NOTNULL,SsexCHAR(2),SageSMALLINT,SdeptCHAR(20));1.不允許取空值NOTNULL約束指定在某一列上用戶不能輸入空值。5.4.1屬性上的約束條件[例5-5]規(guī)定Student表的姓名和性別兩個屬性的組合不能取重復(fù)值。CREATETABLEStudent(SnoCHAR(7)PRIMARYKEY,SnameCHAR(8),SsexCHAR(2),SageSMALLINT,SdeptCHAR(20),UNIQUE(SnameSsex));2.唯一值約束UNIQUE約束指定一列的值不能于該表另一行數(shù)據(jù)在該列上的值相同。5.4.1屬性上的約束條件[例5-6]規(guī)定Student表的年齡默認(rèn)值是18,不允許為空值。CREATETABLEStudent(SnoCHAR(7)PRIMARYKEY,SnameCHAR(8),SsexCHAR(2),SageSMALLINTDEFAULT18NOTNULL,SdeptCHAR(20),UNIQUE(SnameSsex));3.設(shè)置默認(rèn)值
DEFAULT指定一列的默認(rèn)取值。5.4.1屬性上的約束條件[例5-7]Student表的Ssex只允許取“男”或“女”。CREATETABLEStudent(SnoCHAR(7)PRIMARYKEY,SnameCHAR(8),SsexCHAR(2)CHECK(SsexIN(‘男’,’女’)),
SageSMALLINTDEFAULT18NOTNULL,SdeptCHAR(20),UNIQUE(SnameSsex));當(dāng)往表中插入元組或修改屬性的值時,RDBMS就檢查屬性上的約束條件是否被滿足,如果不滿足則操作被拒絕執(zhí)行。4.檢查列值是否滿足某個表達式CHECK約束可以對一個屬性的值加以限制,只允許滿足條件的值輸入。5.4.2元組上的約束條件
[例5-8]在學(xué)生表Student中定義,當(dāng)學(xué)生的性別是男時,其姓名不能以張開頭。CREATETABLEStudent(SnoCHAR(7)PRIMARYKEY,SnameCHAR(8),SsexCHAR(2)CHECK(SsexIN(‘男’,’女’)),
SageSMALLINT,SdeptCHAR(20),CHECK(Ssex=’男’ANDSnameNOTLIKE‘張%’)
);元組上的約束可以設(shè)置不同屬性之間的取值的相互約束條件,它也是用短語CHECK引出的約束。插入元組或修改屬性的值時,RDBMS檢查元組上的約束條件是否被滿足,如果不滿足則操作被拒絕執(zhí)行。5.4.3域約束
DBMS提供了一些標(biāo)準(zhǔn)的數(shù)據(jù)類型(域),用戶可以使用它們說明屬性類型。域的定義允許用戶定義新的域,聲明一個域包括下面幾個方面:(1)域值類型。包括數(shù)據(jù)的類型、長度、單位、精度等,(2)缺省值。例如,可以規(guī)定Student表中的Sage屬性的缺省值為20。(3)域值的格式。例如,可以規(guī)定日期的格式為:YYYY.MM.DD。(4)對取值范圍或取值集合的約束。例如,可以規(guī)定性別域的取值集合為{男,女},學(xué)生成績域的取值范圍為[0,100]。
域完整性是保證數(shù)據(jù)庫字段取值的合理性。域完整性約束是最簡單、最基本的約束。一個屬性能否取空值由其語義決定。域約束使得新的值插入到數(shù)據(jù)庫中時,系統(tǒng)可根據(jù)約束對新插入的值進行完整性檢查。另外,域約束的恰當(dāng)定義還可以對查詢進行檢測,從而保證比較是有意義的。5.4.3域約束1.創(chuàng)建域CREATEDOMAIN<域名>[AS]<數(shù)據(jù)類型>[DEFAULT<缺省值>][<域約束>,…,<域約束>];
該語句創(chuàng)建了一個名為<域名>的域,它的值類型由“AS<數(shù)據(jù)類型>”說明。可選的DEFAULT子句定義缺省值,“缺省值”必須是域中的一個合法值(滿足域約束)。
注意:每個域都包含一個特殊值NULL(空值),但是可以通過域約束排除空值。
域定義中可以包含零個或多個(域約束),用來約束域值的取值。每個<域約束>具有如下形式:
[CONSTRAINT<約束名>]CHECK(<條件>)[<約束性質(zhì)>];可選短語“CONSTRAINT<約束名>”為約束命名。<條件>的常見形式是涉及域值的布爾表達式,其中域值用VALUE表示??蛇x的“<約束性質(zhì)>”可以是NOTDEFERRABLE(不可延遲的)或DEFERRABLE(可延遲的),缺省時為不可延遲(約束立即檢查)。5.4.3域約束[例5-9]對Student表的屬性Sage創(chuàng)建域約束,設(shè)置其域名為SSage,數(shù)據(jù)類型為INT,默認(rèn)值為20,取值范圍為18~22。CREATEDOMAINSSageASINTCONSTRAINTAgeCHECK(VALUEBETWEEN18AND22);5.4.3域約束2.修改域約束
域約束可以進行修改,包括設(shè)置缺省值、刪除缺省值、添加約束和刪除約束。
ALTERDOMAIN<域名><修改動作>;其中<修改動作>可以是:(1)SETDEFAULT<缺省值>。設(shè)置缺省值。(2)DROPDEFAULT。刪除缺省值。(3)ADD<域約束>。添加域約束,其中<域約束>與CREATEDOMAIN相同。(4)DROPCONSTRAINT<約束名>。刪除<約束名>命名的域約束。[例5-10]
修改上例中的域SSage,取消其缺省值。ALTERDOMAINSSageDROPDEFAULT;5.4.3域約束3.刪除域
當(dāng)不需要某個域約束時,可以使用DROPDOMAIN語句將它刪除。語句格式為DROPBOMAIN<域名>[CASCADE|RESTRICT];其中CASCADE表示級聯(lián)刪除,RESTRICT表示受限刪除。聲明RESTRICT時,如果存在基于該域定義的列,則不能刪除。然而,聲明CASCADE時,與刪除模式和刪除基本表不同,域刪除后并不刪除依賴于該域定義的列,而是將列定義(包括類型、缺省值、約束)用定義域的標(biāo)準(zhǔn)類型取代。[例5-11]級聯(lián)刪除域SSage。DROPBOMAIN
SSageCASCADE;5.4.4斷言約束
斷言約束方法使用一種約束定義語言來定義顯式約束,是一種形式化方法。約束定義語言通常是關(guān)系演算語言的變種。
顯式約束的斷言定義方法是把約束集合和完整性驗證子系統(tǒng)嚴(yán)格分開。約束集合存儲在約束庫中,完整性驗證子系統(tǒng)則存取相應(yīng)約束庫中的約束,然后將其應(yīng)用到相應(yīng)的數(shù)據(jù)庫更新事務(wù)中。
在顯式約束的斷言定義方法中,完整性約束被稱為完整性斷言或斷言,完整性約束定義語言又被稱為斷言定義語言。
斷言定義方法已經(jīng)應(yīng)用于關(guān)系數(shù)據(jù)庫系統(tǒng),其語法格式為:
CREATEASSERTION<斷言名>CHECK<謂詞>;5.4.4斷言約束[例5-12]定義一個斷言ASSER_c,要求每門課程最多50名學(xué)生選修。CREATASSERTIONASSER_c CHECK(50>=ALL(SELECTCOUNT(SC.Sno)FROMS,SC WHERES.sno=SC.snoGROUPBYCno));使用斷言定義方法后,數(shù)據(jù)庫管理系統(tǒng)需要提供一個完整性控制子系統(tǒng)。完整性控制子系統(tǒng)負(fù)責(zé)編譯完整性斷言,并將其存入數(shù)據(jù)庫管理系統(tǒng)的約束庫。當(dāng)一個事務(wù)執(zhí)行更新數(shù)據(jù)庫的操作時,完整性控制子系統(tǒng)自動從約束庫中讀取相應(yīng)的完整性斷言,驗證該事務(wù)是否違背完整性斷言以確保數(shù)據(jù)庫的完整性。這種方法簡化了數(shù)據(jù)庫更新事務(wù)的編寫,程序員不再需要考慮如何在事務(wù)中編寫完整性驗證代碼,而且完整性約束發(fā)生變化時,相應(yīng)的事務(wù)代碼不需任何修改,但是這一技術(shù)實現(xiàn)復(fù)雜,系統(tǒng)開銷也很大。主要內(nèi)容5.1完整性概述5.3參照完整性5.4用戶自定義完整性5.2實體完整性5.5完整性約束的修改5.6觸發(fā)器5.8DBMS中的安全性保護5.9SQL中的安全性機制5.7安全性概述5.10其它安全機制5.5完整性約束的修改
為了可以靈活地增加、刪除一個完整性約束條件,為此SQL還為CREATETABLE語句中提供了完整性約束條件命名子句CONSTRAINT,用來對完整性約束條件命名。5.5.1完整性約束命名
CONSTRAINT<完整性約束條件名>[PRIMARYKEY短語|FOREIGNKEY短語|CHECK短語][例5-13]將Student表的碼約束條件命名為StudentKey。CREATETABLEStudent(SnoCHAR(7),SnameCHAR(8)NOTNULL,SsexCHAR(2),SageSMALLINT,SdeptCHAR(20),CONSTRAINTStudentKeyPRIMARYKEY(Sno));5.5.1完整性約束命名[例5-14]建立教師表Teacher,要求姓名不能取空值,年齡小于55歲,性別只能是“男”或“女”。每個教師的實發(fā)工資不低于3000元,實發(fā)工資實際上就是應(yīng)發(fā)工資列Sal與扣除項Deduct之差。CREATETABLETeacher(TnoNUMERIC(4)PRIMARYKEY,TnameCHAR(10),CONSTRAINTC1NOTNULL,Tage
NUMERIC(3),CONSTRAINTC2CHECK(Tage
<
55),TsexCHAR(2),CONSTRAINTC3CHECK(TsexIN(‘男’,’女’)),JobCHAR(8),SalNUMERIC(7,2),DeductNUMERIC(7,2),CONSTRAINTC4CHECK(Sal-Deduct
>=
3000));5.5.2修改完整性約束
我們可以使用ALTERTABLE語句修改表中的完整性限制,通過關(guān)鍵字ADD來增加一個完整性約束條件,或使用關(guān)鍵字DROP來刪除原有的約束條件。[例5-15]增加表Student中Ssex只能取‘男’和‘女’的約束。ALTERTABLEStudentADDCONSTRAINTGenderCHECK(SsexIN(‘男’,’女’));[例5-16]去掉表Teacher中對性別的限制。
ALTERTABLETeacherDROPCONSTRAINTC3;[例5-17]修改表Teacher中的約束條件,年齡小于55歲改成小于60。ALTERTABLETeacherDROPCONSTRAINTC2;ALTERTABLETeacherADDCONSTRAINTC5CHECK(Tage<60);主要內(nèi)容5.1完整性概述5.3參照完整性5.4用戶自定義完整性5.2實體完整性5.5完整性約束的修改5.6觸發(fā)器5.8DBMS中的安全性保護5.9SQL中的安全性機制5.7安全性概述5.10其它安全機制5.6觸發(fā)器
觸發(fā)器主要有以下優(yōu)點:觸發(fā)器是自動的,在對表的數(shù)據(jù)作了修改之后立即被激活。觸發(fā)器可以實現(xiàn)數(shù)據(jù)庫中相關(guān)表的級聯(lián)修改。觸發(fā)器能實現(xiàn)比CHECK語句更為復(fù)雜的約束。觸發(fā)器能提供數(shù)據(jù)庫修改前后數(shù)據(jù)變化的前后狀態(tài)。觸發(fā)器能維護非規(guī)范化數(shù)據(jù)。非規(guī)范化數(shù)據(jù)是指在表中派生的、冗余的數(shù)據(jù)值。維護非規(guī)范化數(shù)據(jù)保證了數(shù)據(jù)庫中低級數(shù)據(jù)的完整性。觸發(fā)器(Trigger)是用戶定義在關(guān)系表上的一類由事件驅(qū)動的特殊過程,其特殊性在于它不需要由用戶調(diào)用執(zhí)行,而是在用戶對表中的數(shù)據(jù)進行UPDATE、INSERT或DELETE操作時自動觸發(fā)執(zhí)行的。也是一種保證數(shù)據(jù)完整性的方法。5.6.1定義觸發(fā)器SQL使用CREATETRIGGER命令建立觸發(fā)器,其一般格式為CREATETRIGGER<觸發(fā)器名>{BEFORE|AFTER|INSTEADOF}<觸發(fā)事件>ON<表名>
FOREACH{ROW|STATEMENT}[WHEN<觸發(fā)條件>]<觸發(fā)動作體>;
觸發(fā)器名在數(shù)據(jù)庫中必須是唯一的。
ON子句用于指定在其上執(zhí)行觸發(fā)器的表名或者是視圖名。
AFTER:在觸發(fā)事件完成之后,測試WHEN條件是否滿足,若滿足則執(zhí)行動作部分的操作。
BEFORE:在觸發(fā)事件進行以前,測試WHEN條件是否滿足。若滿足則先執(zhí)行動作部分的操作,然后再執(zhí)行觸發(fā)事件的操作。5.6.1定義觸發(fā)器
INSTEADOF:在觸發(fā)事件發(fā)生時,只要滿足WHEN條件,就執(zhí)行動作部分的操作,而觸發(fā)事件的操作不再執(zhí)行。
INSERT、DELETE和UPDATE是觸發(fā)事件,若同時有兩個以上觸發(fā)事件,則各操作之間用逗號分隔。
元組級(行級)觸發(fā)器帶有“FOREACHROW”子句,表示對每一個修改的元組都要檢查一次。語句級觸發(fā)器不帶有“FOREACHROW”子句,只檢查一次SQL語句執(zhí)行的結(jié)果。
觸發(fā)動作體既可以是匿名PL/SQL過程塊,也可以是對已建立存儲過程的調(diào)用。如果是行級觸發(fā)器,在兩種情況下,用戶都可以在過程體中使用NEW和OLD引用UPDATE/INSERT事件之后的新值和UPDATE/DELETE事件之前的舊值。如果是語句級觸發(fā)器,則不能在觸發(fā)動作體中使用NEW和OLD進行引用。如果觸發(fā)動作體執(zhí)行失敗,激活觸發(fā)器的事件就會終止執(zhí)行,觸發(fā)器的目標(biāo)表或觸發(fā)器可能影響的其它對象不發(fā)生任何變化。5.6.1定義觸發(fā)器創(chuàng)建觸發(fā)器時,我們還需要注意以下幾點:(1)在一個表上可以建立多個名稱不同、類型各異的觸發(fā)器,每個觸發(fā)器可由INSERT、DELETE和UPDATE三個操作來引發(fā)。對于AFTER型的觸發(fā)器,可以在同一種操作上建立多個觸發(fā)器;對于INSTEADOF型的觸發(fā)器,在同一種操作上只能建立一個觸發(fā)器。(2)大部分SQL語句都可用在觸發(fā)器中,但也有一些限制。例如,所有的創(chuàng)建和更改數(shù)據(jù)庫以及數(shù)據(jù)庫對象的語句、所有的DROP語句都不允許在觸發(fā)器中使用。(3)在觸發(fā)器中可以使用兩個特殊的臨時表:INSERTED和DELETED表,這兩個表的結(jié)構(gòu)同建立觸發(fā)器的表的結(jié)構(gòu)完全相同,而且這兩個臨時表只能用在觸發(fā)器代碼中。INSERTED表保存了INSERT操作插入的數(shù)據(jù)和UPDATE操作中更新后的數(shù)據(jù)。DELETED保存了DELETE操作中被刪除的數(shù)據(jù)和UPDATE操作中更新前的數(shù)據(jù)。在觸發(fā)器中對這兩個臨時表的使用方法同一般基本表一樣,可以通過這兩個臨時表記錄的數(shù)據(jù)來判斷所進行的操作是否符合約束。5.6.1定義觸發(fā)器[例5-18]定義一個BEFORE行級觸發(fā)器,為教師表Teacher定義完整性規(guī)則“教授的工資不得低于3500元,如果低于3500元,自動改成3500元”。CREATETRIGGERT1/*在教師表Teacher上定義觸發(fā)器*/
BEFOREINSERTORUPDATEONTeacher/*觸發(fā)事件是插入或更新操作*/
FOREACHROW/*這是行級觸發(fā)器*/ASBEGIN/*定義觸發(fā)動作體,這是一個PL/SQL過程塊*/
IF(NEW.Job=’教授’)
AND(NEW.Sal<3500)THENNEW.Sal:=3500
/*因為是行級觸發(fā)器,可在過程體中使用插入或更新操作后的新值*/ENDIF;END;/*觸發(fā)動作體結(jié)束*/5.6.1定義觸發(fā)器[例5-19]定義AFTER行級觸發(fā)器,當(dāng)教師表Teacher的工資發(fā)生變化后就自動在工資變化表Sal_log中增加一條相應(yīng)記錄。首先建立工資變化表Sal_log。CREATETABLESal_log(TnoNUMERIC(4)REFERENCESteacher(Tno),SalNUMERIC(7,2),Usernamechar(10),DateTIMESTAMP);CREATETRIGGERInsert_Sal/*建立了一個觸發(fā)器*/AFTERINSFRTONTeacher/*觸發(fā)事件是INSERT*/FOREACHROWASBEGININSERTINTOSal_logVALUES(NEW.Tno,NEW.Sal,CURRENT_USER,CURRENT_TIMESTAMP);END;CREATETRIGGERUpdate_Sal/*建立了一個觸發(fā)器*/AFTERUPDATEONTeacher/*觸發(fā)事件是UPDATE*/FOREACHROWASBEGINIF
(NEW.Sal
<>
OLD.Sal)THENINSERTINTOSal_logVALUES(NEW.Tno,NEW.Sal,CURRENT_USER,CURRENT_TIMESTAMP);
ENDIF;END;5.6.2激活觸發(fā)器
觸發(fā)事件激活觸發(fā)器,并由數(shù)據(jù)庫服務(wù)器自動執(zhí)行。在一個數(shù)據(jù)表上可以定義多個觸發(fā)器,比如多個BEFORE觸發(fā)器,多個AFTER觸發(fā)器等。同一表上的多個觸發(fā)器激活時遵循以下執(zhí)行順序:(1)執(zhí)行該表上的BERORE觸發(fā)器;(2)激活觸發(fā)器的SQL語句;(3)執(zhí)行該表上的AFTER觸發(fā)器。
此外,對于同一個表上的多個BEFORE(AFTER)觸發(fā)器,遵循“誰先創(chuàng)建誰先執(zhí)行”的原則,即按照觸發(fā)器創(chuàng)建的時間先后順序執(zhí)行。有些RDBMS是按照觸發(fā)器名稱的字母排序順序來執(zhí)行觸發(fā)器的。5.6.2激活觸發(fā)器[例5-20]執(zhí)行修改某個教師工資的SQL語句,激活上述定義的觸發(fā)器。
UPDATETeacherSETSal=800WHRERTname=’陳平’;執(zhí)行順序:(1)執(zhí)行觸發(fā)器T1;(2)執(zhí)行SQL語句“UPDATETeacherSETSal=800WHRERTname=’陳平’;”;(3)執(zhí)行觸發(fā)器Insert_Sal;(4)執(zhí)行觸發(fā)器Update_Sal。5.6.3刪除觸發(fā)器刪除觸發(fā)器的SQL語法如下:
DROPTRIGGER<觸發(fā)器名>ON<表名>;
這里的觸發(fā)器必須是一個已經(jīng)創(chuàng)建的觸發(fā)器,并且只能由具有相應(yīng)權(quán)限的用戶刪除。[例5-21]刪除教師表Teacher上的觸發(fā)器Update_Sal。
DROPTRIGGERUpdate_SalONTeacher;
注意:原則上并不限制一張表上定義的觸發(fā)器的數(shù)量,但由于觸發(fā)器是自動執(zhí)行的,因此,如果為一張表建立了多個觸發(fā)器,必然會加大系統(tǒng)的開銷。另外,如果觸發(fā)器設(shè)計的不好,會帶來不可預(yù)知的后果。所以觸發(fā)器常常用于維護復(fù)雜的完整性約束,一般的約束限制最好是使用檢查約束CHECK來實現(xiàn)。主要內(nèi)容5.1完整性概述5.3參照完整性5.4用戶自定義完整性5.2實體完整性5.5完整性約束的修改5.6觸發(fā)器5.8DBMS中的安全性保護5.9SQL中的安全性機制5.7安全性概述5.10其它安全機制5.7安全性概述安全性問題不是數(shù)據(jù)庫系統(tǒng)所獨有的,所有計算機系統(tǒng)都有這個問題。只是數(shù)據(jù)庫系統(tǒng)作為一種特殊的應(yīng)用系統(tǒng),存放了大量數(shù)據(jù),而且為許多最終用戶直接共享,從而使安全性問題更為突出。數(shù)據(jù)庫的安全性和計算機系統(tǒng)的安全性,包括操作系統(tǒng)、網(wǎng)絡(luò)系統(tǒng)的安全性是緊密聯(lián)系、相互支持的,因此我們結(jié)合計算機系統(tǒng)的安全性問題討論數(shù)據(jù)庫系統(tǒng)的安全性。5.7.1數(shù)據(jù)庫安全性的保護范圍
數(shù)據(jù)庫的安全性不是孤立的,需要在幾個層面上采取安全性措施。數(shù)據(jù)庫的安全性控制整體結(jié)構(gòu)如圖5-3所示。5.7.2數(shù)據(jù)庫安全保護的任務(wù)和措施對數(shù)據(jù)庫不合法的使用,稱為數(shù)據(jù)庫的濫用。數(shù)據(jù)庫的濫用分為無意和惡意兩類。無意的濫用主要指以下情況:(1)在事務(wù)處理時發(fā)生系統(tǒng)故障。(2)并發(fā)訪問數(shù)據(jù)庫時引起的異?,F(xiàn)象。(3)數(shù)據(jù)的分布式處理引起的異?,F(xiàn)象。(4)違反數(shù)據(jù)完整性規(guī)則約束的邏輯錯誤。惡意的濫用主要指以下形式:(1)讀取數(shù)據(jù)(竊取信息)(2)修改數(shù)據(jù)。(3)刪除數(shù)據(jù)。5.7.2數(shù)據(jù)庫安全保護的任務(wù)和措施數(shù)據(jù)庫的安全性旨在保證數(shù)據(jù)庫的任何部分不受惡意侵害或的存取和修改,即主要防止對數(shù)據(jù)庫的惡意濫用。完全杜絕數(shù)據(jù)庫的惡意濫用是不可能的,但是可以使那些企圖在沒有適當(dāng)授權(quán)情況下訪問數(shù)據(jù)庫的代價足夠高,阻止絕大多數(shù)這樣的訪問企圖。數(shù)據(jù)庫管理員(DBA)的重要責(zé)任之一是保證數(shù)據(jù)庫的安全性,保護數(shù)據(jù)庫涉及以下幾個任務(wù)。(1)防止對數(shù)據(jù)的未經(jīng)過授權(quán)的存取,確保敏感信息沒有被不“需要知道”這些信息的人訪問得到。(2)防止未經(jīng)過授權(quán)的人員刪除和修改數(shù)據(jù)。(3)監(jiān)視對數(shù)據(jù)的訪問和更改等使用情況。5.7.2數(shù)據(jù)庫安全保護的任務(wù)和措施
數(shù)據(jù)庫系統(tǒng)的安全保護措施是否有效是數(shù)據(jù)庫系統(tǒng)主要的性能指標(biāo)之一。如圖5-3所示,當(dāng)前數(shù)據(jù)庫系統(tǒng)采用的安全性控制方法主要有以下幾種:用戶標(biāo)識和鑒別、身份認(rèn)證、存取控制策略、視圖機制、數(shù)據(jù)加密和審計跟蹤。數(shù)據(jù)庫系統(tǒng)的安全機制如圖5-4所示。主要內(nèi)容5.1完整性概述5.3參照完整性5.4用戶自定義完整性5.2實體完整性5.5完整性約束的修改5.6觸發(fā)器5.8DBMS中的安全性保護5.9SQL中的安全性機制5.7安全性概述5.10其它安全機制5.8DBMS中的安全性保護數(shù)據(jù)庫安全保護目標(biāo)是確保只有授權(quán)用戶才能訪問數(shù)據(jù)庫,而所有未被授權(quán)的人員則無法接近數(shù)據(jù)。通常,安全措施是指計算機系統(tǒng)中用戶直接或通過應(yīng)用程序訪問數(shù)據(jù)庫所要經(jīng)過的安全認(rèn)證過程。在一般計算系統(tǒng)中,安全措施是一級一級層層設(shè)置的,可以有如圖5-5所示計算機系統(tǒng)的安全模型。與DBMS有關(guān)的安全控制技術(shù):用戶標(biāo)識和鑒別、存取控制和審計跟蹤。5.8.1用戶標(biāo)識和鑒別用戶標(biāo)識與鑒別是系統(tǒng)提供的最外層安全保護措施。其基本方法是:系統(tǒng)提供一定的方式讓用戶標(biāo)識自己的名字或身份,每次用戶要求進入系統(tǒng)(與數(shù)據(jù)庫連接)時,由系統(tǒng)核對用戶提供的身份標(biāo)識,通過鑒別的用戶才擁有機器的使用權(quán)。對于獲得上機權(quán)的用戶若要使用數(shù)據(jù)庫時數(shù)據(jù)庫管理系統(tǒng)還要進一步進行用戶標(biāo)識和鑒別。常用的方法有:(1)用戶標(biāo)識和口令(2)標(biāo)識方式(3)利用用戶的物理特征鑒別用戶5.8.2存取控制
數(shù)據(jù)庫安全性所關(guān)心的主要是DBMS的存取控制機制。數(shù)據(jù)庫安全最重要的一點就是確保只授權(quán)給有資格的用戶訪問數(shù)據(jù)庫的權(quán)限,同時令所有未被授權(quán)的人員無法接近數(shù)據(jù),這主要通過數(shù)據(jù)庫系統(tǒng)的存取控制機制實現(xiàn)。
存取控制有兩種——自主存取控制和強制存取控制。兩者之間的區(qū)別是:在自主存取控制(DiscretionaryAccessControl,DAC)中,同一用戶對于不同的數(shù)據(jù)對象具有不同的權(quán)限,但是哪些用戶對哪些數(shù)據(jù)對象具有哪些存取權(quán)限并無固定限制。在強制存取控制(MandatoryAccessControl,MAC)中,每一個數(shù)據(jù)對象被標(biāo)以一定的密級,每一個用戶也被授予某一許可證級別。只有具有一定許可證級別的用戶才能訪問具有一定密級的數(shù)據(jù)對象。這種授權(quán)狀態(tài)一般情況下不能改變。自主存取控制比較靈活,DBMS提供對它的支持;而強制存取控制比較嚴(yán)格,只有那些“安全的”DBMS才提供對它的支持。5.8.2存取控制(1)自主存取控制
自主存取控制是一種基于存取矩陣的存取控制模型。此模型由3種元素組成,即主體、客體和存取操作,它們構(gòu)成一個矩陣,列表示主體,行表示客體,矩陣中的元素表示存取控制操作,如讀(R)、寫(W)、刪除(D)和修改(U)操作,如圖5-6所示。主體1主體2……主體n客體1RW……R客體2DR/W……D/R…………………………客體mRU……R/W主體是指數(shù)據(jù)庫的訪問者,包括用戶、進程和線程等??腕w是指數(shù)據(jù)庫中的數(shù)據(jù)和載體,如基本表、視圖、存儲過程和數(shù)據(jù)文件等。在自主存取控制中,主體按存取矩陣的要求訪問客體,存取矩陣中的元素可以通過授權(quán)方式進行修改,如UNIX操作系統(tǒng)屬于該方式。由于主體可以自主地變更某些操作權(quán)限,因此有可能會給數(shù)據(jù)庫系統(tǒng)帶來不安全因素。5.8.2存取控制(2)強制存取控制
強制存取控制不是用戶能直接感知或進行控制的。它適用于對數(shù)據(jù)有嚴(yán)格而固定密級分類的部門,如軍事部門或政府部門。對于主體和客體,DBMS為每個實例(值)指派了一個敏感度標(biāo)記(label)。敏感度標(biāo)記被分成若干級別,例如絕密(TopSecret)、機密(Secret)、可信(Confidential)和公開(Public)等。主體的敏感度標(biāo)記稱為許可證級別(ClearanceLevel),客體的敏感度標(biāo)記稱為密級(ClassificationLevel)。MAC機制通過對比主體和客體的敏感度標(biāo)記,最終確定主體是否能夠存取客體。5.8.3審計跟蹤
審計是一種監(jiān)視措施,它把用戶對數(shù)據(jù)的所有操作自動記錄下來,存放在一個特殊文件中,即審計日志。審計日志一般包括下列內(nèi)容:(1)操作類型(如查詢、修改、刪除等)。(2)操作終端標(biāo)識與操作人員標(biāo)識。(3)操作日期和時間。(4)操作的數(shù)據(jù)對象(如表、視圖、記錄、元組、屬性等)。(5)數(shù)據(jù)修改前后的值。
利用審計日志中的信息,可以重現(xiàn)導(dǎo)致數(shù)據(jù)庫現(xiàn)有狀況的一系列事件,以進一步找出非法存取數(shù)據(jù)的人、時間和內(nèi)容等。5.8.3審計跟蹤審計功能也不是十全十美的,也存在以下缺陷:(1)審計通常很耗費時間和空間,在現(xiàn)實應(yīng)用中實際意義不大。所以,很多DBMS只是將其作為一種可選功能。(2)審計能夠探測到的違規(guī)操作類型是有限的,因為它基于假設(shè):違規(guī)操作總是可以通過分析異常行為的審計記錄探測到。因此,審計功能一般用于安全性要求較高的部門。審計一般可以分為用戶級審計和系統(tǒng)級審計。用戶級審計是任何用戶可設(shè)置的審計,主要是用戶針對自己創(chuàng)建的數(shù)據(jù)庫表或視圖進行審計,記錄所有用戶對這些表或視圖的一切成功(或)不成功的訪問要求以及各種類型的SQL操作。5.8.3審計跟蹤
系統(tǒng)級審計只能由DBA設(shè)置,用以檢測成功或失敗的登錄要求、檢測授予權(quán)限和回收權(quán)限的操作。AUDIT語句用來設(shè)置審計功能,NOAUDIT語句取消審計功能。[例5-22]對修改Student表結(jié)構(gòu)或修改Student表數(shù)據(jù)的操作進行審計。
AUDITALTER,UPDATEONStudent;[例5-23]取消對Student表的一切審計。
NOAUDITALTER,UPDATEONStudent;主要內(nèi)容5.1完整性概述5.3參照完整性5.4用戶自定義完整性5.2實體完整性5.5完整性約束的修改5.6觸發(fā)器5.8DBMS中的安全性保護5.9SQL中的安全性機制5.7安全性概述5.10其它安全機制5.9SQL中的安全性機制 SQL中提供了三種安全機制,分別是:授權(quán)(authorization)機制、視圖(view)機制和角色(role)機制。5.9.1授權(quán)機制 SQL支持受控的存取保護,即在自主存取控制中,用戶對于不同的數(shù)據(jù)對象有不同的存取權(quán)限,不同的用戶對同一對象也有不同的權(quán)限,而且用戶還可將其擁有的存取權(quán)限轉(zhuǎn)授給其它用戶。 SQL通過GRANT和REVOKE語句實現(xiàn)自主存取控制。GRANT語句向用戶授予權(quán)限,REVOKE語句收回授予的權(quán)限。5.9.1授權(quán)機制1.GRANTGRANT語句的一般格式為
GRANT<權(quán)限>[,<權(quán)限>]…
ON<對象類型><對象名>[,<對象類型><對象名>]…
TO<用戶>[,<用戶>]…
[WITHGRANTOPTION]其語義為:將指定操作對象的指定操作權(quán)限授予指定的用戶。發(fā)出該GRANT語句的可以是DBA,也可以是該數(shù)據(jù)庫對象創(chuàng)建者(既屬主Owner),也可以是已經(jīng)擁有該權(quán)限的用戶。接受權(quán)限的用戶可以是一個或多個具體用戶,也可以是PUBLIC,即全體用戶。包含可選語句WITHGRANTOPTION時,獲得授權(quán)的用戶還可以把自己擁有的權(quán)限或其子集傳遞授予給其它用戶,但不允許循環(huán)授予,即被授權(quán)者不能把權(quán)限再授回給授權(quán)者或其祖先。5.9.1授權(quán)機制[例5-24]把查詢Course表的權(quán)限授予所有用戶。
GRANTSELECTONCourseTOPUBLIC;[例5-25]把對Student表和Course表的全部操作權(quán)限授予給用戶U1和U2。GRANTALLPRIVILEGESONTABLEStudent,CourseTOU1,U2;上例中U1和U2不能傳播他們獲得的權(quán)限。若允許他們傳播得到的權(quán)限,可以用GRANTALLPRIVILEGESONTABLEStudent,CourseTOU1,U2WITHGRANTOPTION;
執(zhí)行此SQL語句后,U1和U2可以把自己擁有的權(quán)限或其子集傳遞授予給其它用戶。例如U1可以把對Student的插入權(quán)限授予給U3:
GRANTINSERTONTABLEStudentTOU3;[例5-26]把查詢Student表和修改學(xué)生學(xué)號的權(quán)限授給用戶U3。
GRANTUPDATE(Sno),SELECTONTABLEStudentTOU3;
這里實際上要授予U3用戶的是對基本表Student的SELECT權(quán)限和對屬性列Sno的UPDATE權(quán)限。對屬性列的授權(quán)時必須明確指出相應(yīng)的屬性列名。5.9.1授權(quán)機制2.REVOKE
授予的權(quán)限可以由DBA或其它授權(quán)者用REVOKE語句收回,REVOKE語句的一般格式為:
REVOKE<權(quán)限>[,<權(quán)限>]…
ON<對象類型><對象名>[,<對象類型><對象名>]…
FROM<用戶>[,<用戶>]…[CASCADE|RESTRICT];[例5-27]收回所有用戶對Course表的查詢權(quán)限。 REVOKESELECT(Sno) ONTABLEStudent;[例5-28]收回用戶U3修改學(xué)生學(xué)號的查詢權(quán)限。
REVOKEUPDATE(Sno)ONTABLEStudentFROMU3;5.9.1授權(quán)機制[例5-29]收回用戶U1對Student表的所有操作權(quán)限。REVOKEALLPRIVILEGESONTABLEStudentFROMU1CASCADE;
收回用戶U1對Student的操作權(quán)限時必須級聯(lián)(CASCADE)收回,不然系統(tǒng)將拒絕(RESTRICT)執(zhí)行該命令。因為在[例5-25]中,U1把對Student的插入權(quán)限授予給了U3。
注:此處的缺省值為RESTRICT,有的DBMS缺省值為CASCADE,會自動執(zhí)行級聯(lián)操作而不必明顯地寫出CASCADE。如果U3還從其它用戶處獲得對Student表的INSERT權(quán)限,則他仍具有此權(quán)限,系統(tǒng)只收回直接或間接從U1處獲得的權(quán)限。5.9.1授權(quán)機制3.創(chuàng)建數(shù)據(jù)庫模式的權(quán)限
GRANT和REVOKE語句向用戶授予或收回對數(shù)據(jù)的操作權(quán)限。對數(shù)據(jù)庫模式的授權(quán)則由DBA在創(chuàng)建用戶時實現(xiàn)。創(chuàng)建用戶語句CREATEUSER的格式如下。
CREATEUSER<username>[WITH][DBA|RESOURCE|CONNECT];只有系統(tǒng)的超級用戶才有權(quán)創(chuàng)建一個新的數(shù)據(jù)庫用戶。新創(chuàng)建的數(shù)據(jù)庫用戶有3種權(quán)限:CONNECT、RESOURCE和DBA。如果沒有指定創(chuàng)建的新用戶的權(quán)限,默認(rèn)該用戶擁有CONNECT權(quán)限。擁有CONNECT權(quán)限的用戶不能創(chuàng)建新用戶、模式和基本表,只能登錄數(shù)據(jù)庫。然后由DBA或其它用戶給他授予應(yīng)有的權(quán)限。擁有RESOURCE權(quán)限的用戶可以創(chuàng)建基本表和視圖,并成為所創(chuàng)建對象的屬主;但不能創(chuàng)建模式和新用戶。數(shù)據(jù)庫對象的屬主可以使用GRANT語句把該對象上的存取權(quán)限授予給其它用戶。擁有DBA權(quán)限的用戶是系統(tǒng)中的超級用戶,可以創(chuàng)建新用戶、模式、基本表和視圖等;DBA擁有對所有數(shù)據(jù)庫對象的存取權(quán)限,還可以將這些權(quán)限授予給一般用戶。5.9.2視圖機制
利用視圖機制實現(xiàn)安全保護的基本思想是:首先通過定義視圖,屏蔽掉一部分需要對某些用戶保密的數(shù)據(jù);然后,在視圖上定義存取權(quán)限,將對視圖的訪問權(quán)授予這個用戶,而不允許他們直接訪問定義視圖的關(guān)系(基本表)。
由于視圖是用查詢定義的,而查詢是求滿足某個謂詞(查詢條件)的元組集,因此視圖與授權(quán)配合使用實際上間接地實現(xiàn)支持存取謂詞的用戶權(quán)限定義。[例5-30]建立2012001班學(xué)生信息的視圖,把對該視圖的SELECT權(quán)限授予給張行老師,把該視圖上的所有操作權(quán)限授予周麗。CREATEVIEWV_Student/*先建立視圖V_Student*/ASSELECT*FROMStudentWHEREClass=’2012001’;GRANTSELECTONV_StudentTO張行;GRANTALLPRIVILEGESONV_StudentTO周麗;5.9.3角色機制
數(shù)據(jù)庫角色是指被命名的一組與數(shù)據(jù)庫操作相關(guān)的權(quán)限。角色是權(quán)限的集合,可以為一組具有相同權(quán)限的用戶創(chuàng)建一個角色,角色簡化了授權(quán)操作。
使用角色進行授權(quán)必須先創(chuàng)建角色,將數(shù)據(jù)庫對象上的存取權(quán)限授予角色,才能將角色授予用戶,使得用戶擁有角色所具有的所有存取權(quán)限。此外,SQL還允許收回賦予角色的存取權(quán),收回授予用戶的角色。SQL中,對角色的創(chuàng)建、授權(quán)、轉(zhuǎn)授和收回語句的語法如下。(1)角色的創(chuàng)建
CREATEROLE<角色名>
該語句創(chuàng)建一個角色,用<角色名>命名。可以像對用戶授權(quán)那樣,使用GRANT對角色進行授權(quán)。(2)給角色授權(quán)
GRANT<權(quán)限>[,<權(quán)限>]…
ON<對象類型>對象名
TO<角色>[,<角色>]…5.9.3角色機制(3)將一個角色授予其它的角色或用戶
GRANT<角色1>[,<角色2>]…
TO<角色3>[,<用戶1>]…
[WITHADMINOPTION]該語句把角色授予某用戶,或授予另一個角色。這樣,一個角色(例如角色3)所擁有的權(quán)限就是授予它的全部權(quán)限(例如角色1和角色2)所包含的權(quán)限和總和。授予者或者是角色的創(chuàng)建者,或者擁有在這個角色上的ADMINOPTION。如果指定了WITHADMINOPTION子句,則獲得某種權(quán)限的角色或用戶還可以把這種權(quán)限授予其它的角色。一個角色包含的權(quán)限包括直接授予這個角色的全部權(quán)限加上其他角色授予這個角色的全部權(quán)限。5.9.3角色機制(4)角色權(quán)限的收回
REVOKE<權(quán)限>[,<權(quán)限>]…
ON<對象類型><對象名>
FROM<角色>[,<角色>]…用戶可以收回角色的權(quán)限,從而修改角色擁有的權(quán)限。REVOKE動作的執(zhí)行者或者是角色的創(chuàng)建者,或者擁有在這個(些)角色上的ADMINOPTION。[例5-31]通過角色實現(xiàn)將一組權(quán)限授予一個用戶。①創(chuàng)建一個
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025下半年四川綿陽市游仙區(qū)人力資源和社會保障局事業(yè)單位招聘工作人員歷年高頻重點提升(共500題)附帶答案詳解
- 2025上半年江蘇省無錫宜興事業(yè)單位招聘91人歷年高頻重點提升(共500題)附帶答案詳解
- 2025上半年四川省廣元市昭化區(qū)部分事業(yè)單位考試招聘15人高頻重點提升(共500題)附帶答案詳解
- 金融服務(wù)解決方案招投標(biāo)模板
- 棚戶區(qū)管網(wǎng)改造工程合同
- 寵物行業(yè)招投標(biāo)管理規(guī)定
- 大數(shù)據(jù)平臺建設(shè)項目招投標(biāo)協(xié)議
- 高速公路服務(wù)區(qū)停電應(yīng)急預(yù)案
- 2024南坊公務(wù)員樓房買賣合同含附屬設(shè)施裝修及車位購買優(yōu)惠3篇
- 2024年度二零二四年創(chuàng)業(yè)投資輔導(dǎo)與融資服務(wù)合同3篇
- 如何防止個人信息被盜用
- 電氣領(lǐng)域知識培訓(xùn)課件
- 金融產(chǎn)品分類介紹
- 2024-2025學(xué)年上學(xué)期深圳初中語文七年級期末模擬卷2
- 期末檢測試卷(含答案)2024-2025學(xué)年數(shù)學(xué)五年級上冊人教版
- 2023年上海商學(xué)院招聘筆試真題
- 標(biāo)準(zhǔn)2024項目投資協(xié)議書
- 中建幕墻高處防墜落專項方案方案
- 鎂合金回收與再利用
- 浙江省杭州市拱墅區(qū)2023-2024學(xué)年六年級(上)期末數(shù)學(xué)試卷
- 2024年貴州省農(nóng)業(yè)農(nóng)村廳所屬事業(yè)單位招聘人員管理單位遴選500模擬題附帶答案詳解
評論
0/150
提交評論