




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
2025/8/14
1SQL語(yǔ)言高級(jí)
應(yīng)用第4章完整性和安全性2025/8/14
2數(shù)據(jù)完整性何為數(shù)據(jù)完整性?P9:由DBMS而不是用戶程序自動(dòng)檢查數(shù)據(jù)的一致性、相容性,保證數(shù)據(jù)符合完整性約束條件。數(shù)據(jù)須符合的條件或數(shù)據(jù)之間的關(guān)系數(shù)據(jù)類型準(zhǔn)確無誤數(shù)據(jù)的值滿足范圍設(shè)置同一表格數(shù)據(jù)之間不存在沖突多個(gè)表格數(shù)據(jù)之間不存在沖突2025/8/14
3完整性約束條件整個(gè)完整性控制都是圍繞完整性約束條件進(jìn)行的,從這個(gè)角度說,完整性約束條件是完整性控制機(jī)制的核心。2025/8/14
4完整性約束條件作用的對(duì)象列:對(duì)屬性的取值類型、范圍、精度等的約束條件元組:對(duì)元組中各個(gè)屬性列間的聯(lián)系的約束關(guān)系:對(duì)若干元組間、關(guān)系集合上以及關(guān)系之間的聯(lián)系的約束完整性約束條件作用的對(duì)象狀態(tài)靜態(tài)對(duì)靜態(tài)對(duì)象的約束是反映數(shù)據(jù)庫(kù)狀態(tài)合理性的約束這是最重要的一類完整性約束動(dòng)態(tài)對(duì)動(dòng)態(tài)對(duì)象的約束是反映數(shù)據(jù)庫(kù)狀態(tài)變遷的約束完整性約束條件2025/8/14
5完整性約束條件分類對(duì)象狀態(tài)動(dòng)態(tài)列級(jí)約束動(dòng)態(tài)元組約束動(dòng)態(tài)關(guān)系約束動(dòng)態(tài) ④⑤⑥
靜態(tài)列級(jí)約束靜態(tài)元組約束靜態(tài)關(guān)系約束靜態(tài)①②③
列元組關(guān)系對(duì)象粒度6靜態(tài)列級(jí)約束靜態(tài)列級(jí)約束是對(duì)一個(gè)列的取值域的說明,這是最常見最簡(jiǎn)單同時(shí)也最容易實(shí)現(xiàn)的一類完整性約束五類靜態(tài)列級(jí)約束對(duì)數(shù)據(jù)類型的約束,包括數(shù)據(jù)的類型、長(zhǎng)度、單位、精度等例:規(guī)定學(xué)生姓名的數(shù)據(jù)類型應(yīng)為字符型,長(zhǎng)度為8。對(duì)數(shù)據(jù)格式的約束
例:規(guī)定學(xué)號(hào)的格式為前兩位表示入學(xué)年份,后四位為順序編號(hào);出生日期的格式為YY.MM.DD。對(duì)取值范圍或取值集合的約束
例:規(guī)定成績(jī)的取值范圍為0-100;年齡的取值范圍為14-29;性別的取值集合為[男,女]。對(duì)空值的約束:空值表示未定義或未知的值,它與零值和空格不同。有的列允許空值,有的則不允許。例:規(guī)定成績(jī)可以為空值。其他約束
例:關(guān)于列的排序說明,組合列等。2025/8/14
7靜態(tài)元組約束靜態(tài)元組約束就是規(guī)定組成一個(gè)元組的各個(gè)列之間的約束關(guān)系。例:訂貨關(guān)系中包含發(fā)貨量、訂貨量等列, 發(fā)貨量不得超過訂貨量例:教師關(guān)系中包含職稱、工資等列, 教授的工資不得低于700元
靜態(tài)元組約束只局限在單個(gè)元組上。2025/8/14
8靜態(tài)關(guān)系約束在一個(gè)關(guān)系的各個(gè)元組之間或者若干關(guān)系之間常常存在各種聯(lián)系或約束。常見靜態(tài)關(guān)系約束實(shí)體完整性約束參照完整性約束函數(shù)依賴約束統(tǒng)計(jì)約束定義某個(gè)字段值與一個(gè)關(guān)系多個(gè)元組的統(tǒng)計(jì)值之間的約束關(guān)系例:規(guī)定部門經(jīng)理的工資不得高于本部門職工平均工資的5倍,不得低于本部門職工平均工資的2倍。本部門職工的平均工資值是一個(gè)統(tǒng)計(jì)計(jì)算值。2025/8/14
9動(dòng)態(tài)列級(jí)約束動(dòng)態(tài)列級(jí)約束是修改列定義或列值時(shí)應(yīng)滿足的約束條件。常見動(dòng)態(tài)列級(jí)約束修改列定義時(shí)的約束 例:規(guī)定將原來允許空值的列改為不允許空值時(shí),如果該列目前已存在空值,則拒絕這種修改。修改列值時(shí)的約束修改列值有時(shí)需要參照其舊值,并且新舊值之間需要滿足某種約束條件。
例:職工工資調(diào)整不得低于其原來工資,學(xué)生年齡只能增長(zhǎng)2025/8/14
10動(dòng)態(tài)元組約束動(dòng)態(tài)元組約束是指修改某個(gè)元組的值時(shí)需要參照其舊值,并且新舊值之間需要滿足某種約束條件。
例:職工工資調(diào)整不得低于其原來工資+工齡*1.52025/8/14
11動(dòng)態(tài)關(guān)系約束動(dòng)態(tài)關(guān)系約束是加在關(guān)系變化前后狀態(tài)上的限制條件。例:事務(wù)一致性、原子性等約束條件2025/8/14
12完整性約束條件小結(jié)
粒度狀態(tài)列級(jí)
元組級(jí)
關(guān)系級(jí)
靜態(tài)列定義·類型·格式·值域
·空值
元組值應(yīng)滿足的條件
實(shí)體完整性約束參照完整性約束函數(shù)依賴約束統(tǒng)計(jì)約束動(dòng)態(tài)改變列定義或列值元組新舊值之間應(yīng)滿足的約束條件
關(guān)系新舊狀態(tài)間應(yīng)滿足的約束條件
2025/8/14
13DBMS的完整性控制機(jī)制定義功能一個(gè)完善的完整性控制機(jī)制應(yīng)該允許用戶定義各類完整性約束條件。檢查功能立即執(zhí)行的約束(Immediateconstraints)檢查是否違背完整性約束的時(shí)機(jī)通常是在一條語(yǔ)句執(zhí)行完后立即檢查,我們稱這類約束為立即執(zhí)行的約束延遲執(zhí)行的約束(Deferredconstraints)在某些情況下,完整性檢查需要延遲到整個(gè)事務(wù)執(zhí)行結(jié)束后再進(jìn)行,我們稱這類約束為延遲執(zhí)行的約束違約反應(yīng)拒絕該操作其他處理方法2025/8/14
14關(guān)系系統(tǒng)三類完整性的實(shí)現(xiàn)提供有定義和檢查實(shí)體完整性、參照完整性和用戶定義的完整性的功能。對(duì)于違反實(shí)體完整性規(guī)則和用戶定義的完整性規(guī)則的操作一般都是采用拒絕執(zhí)行的方式進(jìn)行處理。而對(duì)于違反參照完整性的操作,并不都是簡(jiǎn)單地拒絕執(zhí)行,有時(shí)還需要采取另一種方法,即接受這個(gè)操作,同時(shí)執(zhí)行一些附加的操作,以保證數(shù)據(jù)庫(kù)的狀態(tài)仍然是正確的。2025/8/14
15實(shí)體完整性的實(shí)現(xiàn)例:在“學(xué)號(hào)不能為空”的約束中,約束作用的對(duì)象為Sno屬性則插入或修改Student元組時(shí),作何處理?
要求Sno不能為空 否則,拒絕執(zhí)行該操作2025/8/14
16用戶定義完整性的實(shí)現(xiàn)例:在“教授工資不得低于1000元”的約束中,約束作用的對(duì)象為工資Sal屬性則插入或修改職工元組時(shí),作如何處理?
如果職稱=‘教授’時(shí),
Sal不能小于1000
否則,拒絕執(zhí)行該操作2025/8/14
17參照完整性的實(shí)現(xiàn)外碼是否可以接受空值的問題刪除被參照關(guān)系的元組時(shí)的問題修改被參照關(guān)系中主碼的問題2025/8/14
18外碼是否可以接受空值的問題外碼是否能夠取空值是依賴于應(yīng)用環(huán)境的語(yǔ)義的。在實(shí)現(xiàn)參照完整性時(shí),系統(tǒng)除了應(yīng)該提供定義外碼的機(jī)制,還應(yīng)提供定義外碼列是否允許空值的機(jī)制。2025/8/14
19例1:在職工-部門數(shù)據(jù)庫(kù)中,EMP關(guān)系包含有外碼Deptno,某一元組的這一列若為空值,表示這個(gè)職工尚未分配到任何具體的部門工作。
這和應(yīng)用環(huán)境的語(yǔ)義是相符的,因此EMP的Deptno列應(yīng)允許空值。例2:在學(xué)生-選課數(shù)據(jù)庫(kù)中,Student關(guān)系為被參照關(guān)系,其主碼為Sno。SC為參照關(guān)系,外碼為Sno。若SC的Sno為空值,則表明尚不存在的某個(gè)學(xué)生,或者某個(gè)不知學(xué)號(hào)的學(xué)生,選修了某門課程,其成績(jī)記錄在Grade列中。
這與學(xué)校的應(yīng)用環(huán)境是不相符的,
因此SC的Sno列不能取空值。20刪除被參照關(guān)系的元組時(shí)的問題出現(xiàn)違約操作的情形需要?jiǎng)h除被參照關(guān)系的某個(gè)元組,而參照關(guān)系有若干元組的外碼值與被刪除的被參照關(guān)系的主碼值相對(duì)應(yīng)違約反應(yīng):可有三種策略級(jí)聯(lián)刪除(CASCADES)將參照關(guān)系中所有外碼值與被參照關(guān)系中要?jiǎng)h除元組主碼值相對(duì)應(yīng)的元組一起刪除。受限刪除(RESTRICTED)只有當(dāng)參照關(guān)系中沒有任何元組的外碼值與要?jiǎng)h除的被參照關(guān)系的元組的主碼值相對(duì)應(yīng)時(shí),系統(tǒng)才執(zhí)行刪除操作,否則拒絕此刪除操作。置空值刪除(NULLIFIES)刪除被參照關(guān)系的元組,并將參照關(guān)系中所有與被參照關(guān)系中被刪除元組主碼值相等的外碼值置為空值。這三種處理方法,哪一種是正確的,要依應(yīng)用環(huán)境的語(yǔ)義來定。2025/8/14
21例:要?jiǎng)h除Student關(guān)系中Sno=200801的元組,而SC關(guān)系中有4個(gè)元組的Sno都等于200801。級(jí)聯(lián)刪除: 將SC關(guān)系中所有4個(gè)Sno=200801的元組一起刪除。如果參照關(guān)系同時(shí)又是另一個(gè)關(guān)系的被參照關(guān)系,則這種刪除操作會(huì)繼續(xù)級(jí)聯(lián)下去。受限刪除:系統(tǒng)將拒絕執(zhí)行此刪除操作。置空值刪除:將SC關(guān)系中所有Sno=200801的元組的Sno值置為空值。在學(xué)生選課數(shù)據(jù)庫(kù)中,顯然第一種方法和第二種方法都是對(duì)的。第三種方法不符合應(yīng)用環(huán)境語(yǔ)義。22修改被參照關(guān)系中主碼的問題兩種策略不允許修改主碼允許修改主碼允許修改主碼策略違約操作要修改被參照關(guān)系中某些元組的主碼值,而參照關(guān)系中有些元組的外碼值正好等于被參照關(guān)系要修改的主碼值要修改參照關(guān)系中某些元組的主碼值,而被參照關(guān)系中沒有任何元組的外碼值等于被參照關(guān)系修改后的主碼值違約反應(yīng)修改的關(guān)系是被參照關(guān)系:與刪除類似級(jí)聯(lián)修改受限修改置空值修改修改的關(guān)系是參照關(guān)系:與插入類似受限修改級(jí)聯(lián)修改2025/8/14
23修改被參照關(guān)系中主碼的問題(續(xù))級(jí)聯(lián)修改修改被參照關(guān)系中主碼值同時(shí),用相同的方法修改參照關(guān)系中相應(yīng)的外碼值。受限修改拒絕此修改操作。只當(dāng)參照關(guān)系中沒有任何元組的外碼值等于被參照關(guān)系中某個(gè)元組的主碼值時(shí),這個(gè)元組的主碼值才能被修改。置空值修改修改被參照關(guān)系中主碼值,同時(shí)將參照關(guān)系中相應(yīng)的外碼值置為空值。2025/8/14
24例:學(xué)生200801休學(xué)一年后復(fù)學(xué),這時(shí)需要將Student關(guān)系中Sno=200801的元組中Sno值改為200923。而SC關(guān)系中有4個(gè)元組的Sno=200801級(jí)聯(lián)修改:
將SC關(guān)系中4個(gè)Sno=200801元組中的Sno值也改為200923。如果參照關(guān)系同時(shí)又是另一個(gè)關(guān)系的被參照關(guān)系,則這種修改操作會(huì)繼續(xù)級(jí)聯(lián)下去。受限修改:
只有SC中沒有任何元組的Sno=200801時(shí),才能修改Student表中Sno=200801的元組的Sno值改為200923。置空值修改:
將Student表中Sno=200801的元組的Sno值改為200923。而將S表中所有Sno=200801的元組的Sno值置為空值。在學(xué)生選課數(shù)據(jù)庫(kù)中只有第一種方法是正確的。2025/8/14
25小結(jié)如何進(jìn)行完整性維護(hù)系統(tǒng)的設(shè)計(jì)?1如何表達(dá)完整性約束條件?2如何檢查完整性約束條件?如何檢查?3違反條件時(shí)候的如何處理?DBMS中完整性的定義:使用約束完整性的類型約束的類型說明實(shí)體完整性PRIMARYKEY唯一標(biāo)識(shí)每一行,保證用戶不輸入重復(fù)的數(shù)據(jù),且創(chuàng)建一個(gè)索引來提高性能。不允許空值UNIQUE防止非主關(guān)鍵字的重復(fù),并保證創(chuàng)建一個(gè)索引來提高性能。允許空值用戶定義完整性DEFAULT指定在INSERT語(yǔ)句中沒有明確提供一個(gè)值時(shí),為該列提供的值CHECK指定在一個(gè)列中可接受的數(shù)據(jù)值參照完整性FOREIGNKEY定義一個(gè)列或幾個(gè)列的組合,他們的值匹配同一個(gè)表或另一個(gè)表中關(guān)鍵字2025/8/14
27CREATETABLE定義約束約束涉及單個(gè)屬性的,有兩種說明方法定義為列級(jí)約束條件定義為表級(jí)約束條件若約束涉及多個(gè)屬性的,只有一種說明方法定義為表級(jí)約束條件
28列級(jí)約束例1.CREATETABLE語(yǔ)句中定義列級(jí)約束
CREATETABLES
(snoNUMERIC(6)PRIMARYKEY,--列級(jí)約束
snameCHAR(8)NOTNULL,
ageNUMERIC(3,0),
sexCHAR(2),
bplaceCHAR(20)
);表級(jí)約束例2.
CREATETABLE語(yǔ)句中定義表級(jí)約束
CREATETABLESC
(snoNUMERIC(6)NOTNULL,cnovarchar(3)notnull,
PRIMARYKEY(sno,cno),--表級(jí)約束gradeNUMERIC(2));29例3.在Employee表中說明Eno為主碼,有兩種方法。①將屬性直接說明為主碼,列級(jí)約束
CREATETABLEEmployee(Enochar(4)PRIMARYKEY,Enamevarchar(8),Sexchar(2),Ageint,Dnochar(2));②在屬性列表后單獨(dú)說明主碼,表級(jí)約束CREATETABLEEmployee(Enochar(4),Enamevarchar(8),Sexchar(2),Ageint,Dnochar(2),
PRIMARYKEY(Eno));30ALTERTABLE定義約束添加約束語(yǔ)法:ALTERTABLE<表名> ADD[CONSTRAINT<約束名>]<具體約束>,…;例4.ALTERTABLE添加約束。ALTERTABLEEmployeeADDCONSTRAINTuq_enameUNIQUE(Ename);刪除約束:語(yǔ)法:ALTERTABLE<表名> DROP[CONSTRAINT]<約束名>,…;例5.ALTERTABLE刪除約束。ALTERTABLEEmployeeDROPCONSTRAINTuq_ename;31UNIQUE約束允許空值在一個(gè)表上可以放置多個(gè)UNIQUE約束可以在必須有唯一值,但不是表的主關(guān)鍵字的一個(gè)列或多個(gè)列上應(yīng)用UNIQUE約束通過在指定列上創(chuàng)建唯一索引強(qiáng)制UNIQUE約束例6.添加唯一性約束。
ALTERTABLEDepartmentADDCONSTRAINTuq_dnameUNIQUEnonclustered(dname);例7.增加Ename必須取唯一值的約束條件。
ALTERTABLEEmployee
/*用戶為該唯一值約束設(shè)定約束名為UQ_Ename*/ADDCONSTRAINTUQ_EnameUNIQUE(Ename);或者:
ALTERTABLEEmployeeADDUNIQUE(Ename);/*系統(tǒng)將自動(dòng)為此約束名賦值*/2025/8/14
32PRIMARYKEY約束每個(gè)表只能定義一個(gè)PRIMARYKEY約束輸入的值必須是唯一的不允許空值它在指定的列上創(chuàng)建一個(gè)唯一索引例8.添加主碼約束ALTERTABLEDepartmentADDCONSTRAINTpk_dnoPRIMARYKEYclustered(dno);33IDENTITY屬性每一個(gè)表都可有一標(biāo)識(shí)列,其中包含由系統(tǒng)自動(dòng)生成的能夠標(biāo)識(shí)表中每一行數(shù)據(jù)的唯一序列值。格式:IDENTITY[(SEED,INCREMENT)]SEED初始值,表中的第一行數(shù)據(jù)的標(biāo)識(shí)列的取值,默認(rèn)值為1INCREMEN步長(zhǎng)值,每一新標(biāo)識(shí)值比上一個(gè)增長(zhǎng)多少,默認(rèn)值為1使用IDENTITY列時(shí),應(yīng)注意:每張表只允許有一個(gè)IDENTITY列該列必須使用下列數(shù)據(jù)類型之一:decimal、numeric、int、smallint和tinyint該列必須設(shè)置成不允許為空值,且不能有默認(rèn)值2025/8/14
34DEFAULT約束只應(yīng)用于INSERT語(yǔ)句每列只能定義一個(gè)DEFAULT約束不能用于IDENTITY屬性或TIMESTAMP數(shù)據(jù)類型TIMESTAMP數(shù)據(jù)庫(kù)范圍內(nèi)的唯一數(shù)字,8字節(jié),一個(gè)表中只能一個(gè)此類型的列允許使用一些系統(tǒng)提供的值例9.增加列Title的默認(rèn)值取值為“助工”。
ALTERTABLEEmployeeADDCONSTRAINTDF_TitleDEFAULT'助工'
forTitle;2025/8/14
35CHECK約束在每次執(zhí)行INSERT或UPDATE語(yǔ)句時(shí)驗(yàn)證數(shù)據(jù)可以引用同一表中的其他列不能在具有IDENTITY屬性的列或具有timestamp或uniqueidentifier數(shù)據(jù)類型的列上放置CHECK約束不能含有子查詢例10.增加列性別取值約束。ALTERTABLEEmployeeADDCONSTRAINTck_sexCHECK(sexin('男','女'));2025/8/14
36CHECK約束也可涉及到表中多個(gè)域,稱為元組約束。在對(duì)整個(gè)元組完成插入或?qū)δ骋辉M的修改完成之后,系統(tǒng)將檢查元組是否符合CHECK條件表達(dá)式。例11.添加涉及多列的CHECK約束。ALTERTABLESalaryADDCONSTRAINTck_RightSalary
CHECK(Insure+Fund<Basepay);注意,完整性約束的檢查將花費(fèi)系統(tǒng)一定的時(shí)間,特別是那些復(fù)雜的CHECK條件,雖然非常有用,但不應(yīng)泛濫使用。2025/8/14
37FOREIGNKEY約束必須引用一個(gè)PRIMARYKEY約束或UNIQUE約束提供單列或多列引用完整性不自動(dòng)創(chuàng)建索引用戶在引用的表上必須有SELECT或REFERENCES權(quán)限在同一表中只使用REFERENCES子句例12.
添加外部碼約束。
ALTERTABLESCADDCONSTRAINTfk_sno
FOREIGNKEY(sno)REFERENCES
S(sno);2025/8/14
38例13.說明Employee表中Dno為外部碼,被參照關(guān)系為Department。兩種方法分別如下:--①列級(jí)約束,只使用REFERENCES子句
CREATETABLEEmployee(Enochar(4)PRIMARYKEY,Namevarchar(8),Sexchar(2),Ageint,
Dnochar(2)REFERENCESDepartment(Dno));--②表級(jí)約束
CREATETABLEEmployee(Enochar(4)PRIMARYKEY,Namevarchar(8),Sexchar(2),Ageint,Dnochar(2),
FOREIGNKEY(Dno)REFERENCESDepartment(Dno));2025/8/14
39參照完整性檢查和違約處理ONDELETE{NOACTION|CASCADE|SETNULL|SETDEFAULT}ONUPDATE{NOACTION|CASCADE|SETNULL|SETDEFAULT}高版本SQLSERVER支持:
SETNULL、SETDEFAULT2025/8/14
40ONDELETE指定如果已創(chuàng)建表中的行具有引用關(guān)系,并且被引用行已從父表中刪除,則對(duì)這些行采取的操作。默認(rèn)值為NOACTION。NOACTION
數(shù)據(jù)庫(kù)引擎將引發(fā)錯(cuò)誤,并回滾對(duì)父表中相應(yīng)行的刪除操作。CASCADE如果從父表中刪除一行,則將從引用表中刪除相應(yīng)行。SETNULL(高版本SQLSERVER支持)如果父表中對(duì)應(yīng)的行被刪除,則組成外鍵的所有值都將設(shè)置為NULL。若要執(zhí)行此約束,外鍵列必須可為空值。SETDEFAULT(高版本SQLSERVER支持)如果父表中對(duì)應(yīng)的行被刪除,則組成外鍵的所有值都將設(shè)置為默認(rèn)值。若要執(zhí)行此約束,所有外鍵列都必須有默認(rèn)定義。如果某個(gè)列可為空值,并且未設(shè)置顯式的默認(rèn)值,則將使用NULL作為該列的隱式默認(rèn)值。2025/8/14
41例14.添加并驗(yàn)證外碼約束的CASCADE級(jí)聯(lián)操作。
ALTERTABLEEmployeeADDCONSTRAINTfk_emp
FOREIGNKEY(Dno)
REFERENCESDepartment(Dno)
ONDELETECASCADEONUPDATECASCADE;2025/8/14
42ONUPDATE指定在發(fā)生更改的表中,如果行有引用關(guān)系且引用的行在父表中被更新,則對(duì)這些行采取什么操作。默認(rèn)值為NOACTION。NOACTION數(shù)據(jù)庫(kù)引擎將引發(fā)錯(cuò)誤,并回滾對(duì)父表中相應(yīng)行的更新操作。CASCADE如果在父表中更新了一行,則將在引用表中更新相應(yīng)的行。SETNULL
(高版本SQLSERVER支持)如果更新了父表中的相應(yīng)行,則會(huì)將構(gòu)成外鍵的所有值設(shè)置為NULL。若要執(zhí)行此約束,外鍵列必須可為空值。SETDEFAULT
(高版本SQLSERVER支持)如果更新了父表中的相應(yīng)行,則會(huì)將構(gòu)成外鍵的所有值都設(shè)置為其默認(rèn)值。若要執(zhí)行此約束,所有外鍵列都必須有默認(rèn)定義。如果某個(gè)列可為空值,并且未設(shè)置顯式的默認(rèn)值,則將使用NULL作為該列的隱式默認(rèn)值。2025/8/14
43數(shù)據(jù)完整性回顧如何進(jìn)行完整性維護(hù)系統(tǒng)的設(shè)計(jì)?1如何表達(dá)完整性約束條件?2如何檢查完整性約束條件?3違反條件時(shí)候的如何處理?2025/8/14
441.提供定義完整性約束條件的機(jī)制SQL標(biāo)準(zhǔn)使用了一系列概念來描述完整性,包括關(guān)系模型的實(shí)體完整性、參照完整性和用戶定義完整性這些完整性一般由SQL的DDL語(yǔ)句來實(shí)現(xiàn)數(shù)據(jù)完整性回顧2025/8/14
452.提供完整性檢查的方法引起數(shù)據(jù)庫(kù)狀態(tài)改變的操作有哪些?INSERT、UPDATE、DELETE語(yǔ)句執(zhí)行上述操作后開始檢查3.違約處理DBMS若發(fā)現(xiàn)用戶的操作違背了完整性約束條件,就采取一定的動(dòng)作拒絕(NOACTION)執(zhí)行該操作級(jí)聯(lián)(CASCADE)執(zhí)行其他操作其他用戶定義的操作DBMS定義約束完整性的類型約束的類型說明實(shí)體完整性PRIMARYKEY唯一標(biāo)識(shí)每一行,保證用戶不輸入重復(fù)的數(shù)據(jù),且創(chuàng)建一個(gè)索引來提高性能。不允許空值UNIQUE防止非主關(guān)鍵字的重復(fù),并保證創(chuàng)建一個(gè)索引來提高性能。允許空值用戶定義完整性DEFAULT指定在INSERT語(yǔ)句中沒有明確提供一個(gè)值時(shí),為該列提供的值CHECK指定在一個(gè)列中可接受的數(shù)據(jù)值參照完整性FOREIGNKEY定義一個(gè)列或幾個(gè)列的組合,他們的值匹配同一個(gè)表或另一個(gè)表中關(guān)鍵字2025/8/14
47實(shí)現(xiàn)數(shù)據(jù)完整性數(shù)據(jù)完整性的類型實(shí)體完整性參照完整性用戶定義完整性(域完整性)強(qiáng)制完整性聲明數(shù)據(jù)完整性:在對(duì)象定義中定義的條件SQLServer自動(dòng)強(qiáng)制使用約束、默認(rèn)值和規(guī)則實(shí)現(xiàn)過程數(shù)據(jù)完整性:在腳本中定義的條件腳本強(qiáng)制使用觸發(fā)器和存儲(chǔ)過程實(shí)現(xiàn)2025/8/14
48SQL語(yǔ)言
高級(jí)應(yīng)用(*)4.2觸發(fā)器2025/8/14
49主要內(nèi)容觸發(fā)器的概念觸發(fā)器的功能和類型如何使用企業(yè)管理器創(chuàng)建和管理觸發(fā)器如何使用T-SQL語(yǔ)句創(chuàng)建和管理觸發(fā)器2025/8/14
50EnoEnameSexAgeTitle1002胡一民男38工程師1004王愛民
男60高工1005張小華女50工程師1010宋文彬
男36工程師1011胡民
男34工程師1015張曉英
女26助工1022李紅衛(wèi)
女27助工1031丁為國(guó)
男24助工1111陳園園女24EmployeeSalaryEnoBasepayServicePrice1002685.0013.0085.001004728.34
35.0085.001005685.0025.0085.001010660.50
12.0085.001011660.50
10.0085.001015512.27
6.0085.001022523.45
7.0085.001031512.27
3.0085.001111500.000.000.002025/8/14
51觸發(fā)器的基本概念觸發(fā)器是一種特殊的存儲(chǔ)過程,它不能被顯式地調(diào)用,而是在往表中增刪改記錄時(shí),被自動(dòng)激活。可以用來對(duì)表實(shí)施復(fù)雜的完整性約束。觸發(fā)器和引起觸發(fā)器執(zhí)行的T-SQL語(yǔ)句被當(dāng)作一次事務(wù)處理,因此可以在觸發(fā)器中回滾這個(gè)事務(wù)。如果發(fā)現(xiàn)引起觸發(fā)器執(zhí)行的T-SQL語(yǔ)句執(zhí)行了一個(gè)非法操作,則可以通過回滾事務(wù)使語(yǔ)句不能執(zhí)行,回滾后SQLServer會(huì)自動(dòng)返回到此事務(wù)執(zhí)行前的狀態(tài)。2025/8/14
52觸發(fā)器的作用可以對(duì)數(shù)據(jù)庫(kù)進(jìn)行級(jí)聯(lián)修改。可以完成比CHECK約束更復(fù)雜的限制??梢园l(fā)現(xiàn)改變前后表中數(shù)據(jù)的不同,并根據(jù)這些不同來進(jìn)行相應(yīng)的操作。對(duì)于一個(gè)表上的不同的操作(INSERT、UPDATE或者DELETE)可以采用不同的觸發(fā)器,即使是對(duì)相同的語(yǔ)句也可調(diào)用不同的觸發(fā)器完成不同的操作。Inserted表和Deleted表SQLServer為每個(gè)觸發(fā)器都創(chuàng)建了兩個(gè)專用表:Inserted表和Deleted表。它們?yōu)檫壿嫳?,由系統(tǒng)來維護(hù),用戶不能對(duì)它們進(jìn)行修改,并存放在內(nèi)存而不是數(shù)據(jù)庫(kù)中。表結(jié)構(gòu)總是與引起該觸發(fā)器作用的表的結(jié)構(gòu)相同。觸發(fā)器執(zhí)行完成后,與該觸發(fā)器相關(guān)的這兩個(gè)表也會(huì)被刪除。Inserted表存放由于執(zhí)行Insert或Update語(yǔ)句而要從表中插入的所有行。Deleted表存放由于執(zhí)行Delete或Update語(yǔ)句而要從表中刪除的所有行。一個(gè)Update事務(wù)可以看作先執(zhí)行一個(gè)Delete操作,再執(zhí)行一個(gè)Insert操作。觸發(fā)器產(chǎn)生的臨時(shí)視圖:Col1intPKCol2char(10)TestUpdateEventUpdatetestSetCol2=‘second’whereCol1=1Col1=1Col2=‘second’DeletedTableUpdateTriggerCol1=1Col2=‘first’InsertedTableInsertEventInsertintotestvalues(1,‘first’)Col1=1Col2=‘first’空DeletedTableInsertTriggerInsertedTableDeleteEventDeletefromtestwhereCol1=1DeleteTriggerInsertedTableDeletedTable2025/8/14
55INSTEADOF和AFTER觸發(fā)器INSTEADOF觸發(fā)器和AFTER觸發(fā)器。INSTEADOF觸發(fā)器用于替代引起觸發(fā)器執(zhí)行的T-SQL語(yǔ)句。可作用于表、視圖。AFTER觸發(fā)器在一個(gè)INSERT、UPDATE或DELETE語(yǔ)句之后執(zhí)行,進(jìn)行約束檢查等動(dòng)作都將在AFTER觸發(fā)器被激活之前發(fā)生。只作用于表。2025/8/14
56觸發(fā)器的機(jī)制發(fā)生事件(對(duì)一個(gè)關(guān)系的增刪改操作)檢查觸發(fā)器的條件執(zhí)行觸發(fā)器的動(dòng)作
(由數(shù)據(jù)庫(kù)自動(dòng)完成)操作的剩余部分成立不成立2025/8/14
57創(chuàng)建觸發(fā)器創(chuàng)建前須知:CREATETRIGGER語(yǔ)句必須是一個(gè)批中的第一條語(yǔ)句。創(chuàng)建觸發(fā)器的權(quán)限默認(rèn)是屬于表的所有者的,而且不能授權(quán)給其他人。觸發(fā)器是數(shù)據(jù)庫(kù)對(duì)象,其名稱必須符合命名規(guī)則。只能在當(dāng)前數(shù)據(jù)庫(kù)中觸發(fā)器,但觸發(fā)器可以引用其他數(shù)據(jù)庫(kù)的對(duì)象。觸發(fā)器不能再臨時(shí)表或系統(tǒng)表上創(chuàng)建,觸發(fā)器可以引用臨時(shí)表,但不能引用系統(tǒng)表。TRUNCATETABLE的操作不被記入事務(wù)日志,也不會(huì)激活DELETE觸發(fā)器。2025/8/14
58創(chuàng)建觸發(fā)器時(shí)需考慮:觸發(fā)器的名稱觸發(fā)器所基于的表或視圖觸發(fā)器激活的時(shí)機(jī)激活觸發(fā)器的修改語(yǔ)句,有效的選項(xiàng)是INSERT、UPDATE和DELETE觸發(fā)器執(zhí)行的語(yǔ)句一個(gè)表上可以有多個(gè)具有不同名稱的各種類型觸發(fā)器,每個(gè)觸發(fā)器可以完成不同的功能。但每個(gè)觸發(fā)器只能作用在一個(gè)表上,每個(gè)觸發(fā)器可以被所有的三種動(dòng)作(INSERT、UPDATE和DELETE)所激發(fā)。2025/8/14
59使用T-SQL語(yǔ)句創(chuàng)建觸發(fā)器基本語(yǔ)法:
CREATETRIGGERtrigger_name
ON
{table_name|view_name} {FOR|AFTER|INSTEADOF} [INSERT,UPDATE,DELETE]
AS sql_statement2025/8/14
60例1.設(shè)數(shù)據(jù)庫(kù)中有一職工歷史表Emp_his,其表結(jié)構(gòu)與Employee表相同,為Employee表創(chuàng)建一觸發(fā)器,當(dāng)刪除職工時(shí),將刪除職工的信息保存到表Emp_his中。
CREATETRIGGERTri_del_empONEmployee
AFTERDELETEASINSERTINTOEmp_hisSELECT*FROMdeleted61例2.
創(chuàng)建一個(gè)觸發(fā)器,實(shí)現(xiàn)無法刪除有職工存在的部門信息,否則,將給出錯(cuò)誤信息。CREATETRIGGER
Tri_del_dept
ONDepartment
AFTERDELETEASIFEXISTS(SELECTEnoFROMEmployee,DELETEDWHEREEmployee.Dno=DELETED.Dno)
BEGIN
RAISERROR
('Thedepartmentthatisnotemptycannotbedeleted!',10,1)
ROLLBACKTRANSACTIONEND;RAISERROR將引發(fā)一個(gè)錯(cuò)誤號(hào)為50000的錯(cuò)誤消息。
2025/8/14
62例3.實(shí)現(xiàn)前面的那個(gè)例子,為Employee表創(chuàng)建一觸發(fā)器,當(dāng)插入一職工時(shí),在工資表中生成該職工的工資記錄,設(shè)置其基本工資為500,其他工資項(xiàng)為0。
CREATETRIGGERTri_ins_employee
ONEmployee
AFTERINSERT
ASDECLARE@enochar(4)SELECT@eno=EnoFROMinsertedINSERTINTOSalary(Eno,Basepay,Service,Price,Rest,Insure,Fund)VALUES(@eno,500,0,0,0,0,0)63例4.為employee表創(chuàng)建一觸發(fā)器,當(dāng)修改某位職工的職稱時(shí),應(yīng)同時(shí)修改salary表中的基本工資Basepay,具體標(biāo)準(zhǔn)為:當(dāng)職稱修改為工程師時(shí),增加150元;當(dāng)修改為高工時(shí),增加300元。
CREATETRIGGERTri_updatetitle_employee
ONEmployeeFORUPDATEASIFUPDATE(Title)IF(SELECTTitleFROMinserted)='工程師' UPDATESalarySETBasepay=Basepay+150WHEREEno=(SELECTEnoFROMinserted)ELSEIF(SELECTTitleFROMinserted)='高工'UPDATESalarySETBasepay=Basepay+300WHEREEno=(SELECTEnoFROMinserted)64INSTEADOF觸發(fā)器例5.假設(shè)有一查詢每個(gè)部門職工人數(shù)的視圖,則創(chuàng)建一觸發(fā)器使得刪除視圖數(shù)據(jù)即為刪除該部門的職工。CREATEVIEWV_dnumber(Dno,Dnumber)ASSELECTDno,COUNT(Eno)FROMEmployeeGROUPBYDnoCREATETRIGGERTri_Del_V_dnumber
ON
V_dnumber
INSTEADOF
DELETEASDELETEFROMEmployeeWHEREDno=(SELECTDnoFROMdeleted)2025/8/14
65觸發(fā)器編程注意對(duì)于SQLSERVER,一個(gè)增刪改操作對(duì)應(yīng)于確定的觸發(fā)器只會(huì)作用一次,而不管在這個(gè)操作中有多少記錄受到了該操作的影響,因?yàn)樗钦Z(yǔ)句級(jí)的。ORALCE中可支持行級(jí)觸發(fā)器(FOREACHROW)對(duì)于更新觸發(fā)器,可指定更新特殊的列(column)執(zhí)行不能順利完成,可給出錯(cuò)誤信息并回滾事務(wù)(取消所有操作)。沒有出錯(cuò),提交事務(wù)。2025/8/14
66修改觸發(fā)器修改ALTERTRIGGEREnterpriseManager2025/8/14
67查看依賴關(guān)系在重命名數(shù)據(jù)庫(kù)對(duì)象時(shí),最好先查看與該數(shù)據(jù)庫(kù)對(duì)象有依賴關(guān)系的其他數(shù)據(jù)庫(kù)對(duì)象,以決定是否有觸發(fā)器需要為此而修改定義??捎肊nterpriseManager。2025/8/14
68獲得觸發(fā)器的有關(guān)信息顯示表上觸發(fā)器的類型
sp_helptrigger
顯示了觸發(fā)器的名稱、擁有者,并用五個(gè)布爾值表明了觸發(fā)器的類型和觸發(fā)器被激活的時(shí)機(jī)。顯示觸發(fā)器的代碼
sp_helptext2025/8/14
69使表上的觸發(fā)器無效或重新有效修改表的ALTERTABLE語(yǔ)句。使用DISABLETRIGGER子句可以使該表上的某一觸發(fā)器無效。使用ENABLETRIGGER子句可以使觸發(fā)器重新有效。2025/8/14
70刪除觸發(fā)器觸發(fā)器被刪除時(shí),觸發(fā)器所在表中的數(shù)據(jù)不會(huì)因此改變。當(dāng)某個(gè)表被刪除時(shí),該表上的所有觸發(fā)器也自動(dòng)被刪除。使用DROPTRIGGER語(yǔ)句可刪除當(dāng)前數(shù)據(jù)庫(kù)的一個(gè)或多個(gè)觸發(fā)器。使用EnterpriseManager。2025/8/14
71*
域中的
完整性限制MicrosoftSQLServer的實(shí)現(xiàn)主要內(nèi)容用戶自定義數(shù)據(jù)類型創(chuàng)建、修改、刪除和查看規(guī)則規(guī)則的概念創(chuàng)建、修改和刪除規(guī)則默認(rèn)值默認(rèn)值的概念創(chuàng)建、修改和刪除默認(rèn)值規(guī)則與CHECK約束、默認(rèn)值與DEFAULT約束的異同點(diǎn)2025/8/14
731用戶自定義數(shù)據(jù)類型利用用戶定義的數(shù)據(jù)類型可以使在不同表中重復(fù)出現(xiàn)的各列具有相同的特性,使相似的數(shù)據(jù)種類標(biāo)準(zhǔn)化。可以將規(guī)則和默認(rèn)值捆綁到用戶定義的數(shù)據(jù)類型上,那么該規(guī)則和默認(rèn)值就可以約束使用此數(shù)據(jù)類型的每個(gè)列。如果在model數(shù)據(jù)庫(kù)中創(chuàng)建了用戶自定義的數(shù)據(jù)類型,則它將出現(xiàn)在所有以后新建的數(shù)據(jù)庫(kù)中。但是定義在用戶數(shù)據(jù)庫(kù)中的用戶自定義數(shù)據(jù)類型,則只會(huì)出現(xiàn)在定義它的數(shù)據(jù)庫(kù)中。2025/8/14
74創(chuàng)建用戶自定義數(shù)據(jù)類型使用企業(yè)管理器使用T-SQL語(yǔ)句可以使用系統(tǒng)存儲(chǔ)過程sp_addtype
來創(chuàng)建用戶自定義數(shù)據(jù)類型(別名類型)。具體語(yǔ)法:sp_addtypetype,system_data_type[,’null_type’]75例1.基于系統(tǒng)提供的varchar數(shù)據(jù)類型創(chuàng)建別名類型。sp_addtypetelephone,'varchar(8)','NULL'例2.創(chuàng)建不允許空值并且名為birthday的別名數(shù)據(jù)類型(基于datetime)。EXECsp_addtypebirthday,datetime,'NOTNULL';SQLSERVER高版本將使用CREATETYPE代替sp_addtype的使用。CREATETYPEtelephoneFROMvarchar(8)NULL;CREATETYPE支持創(chuàng)建用戶定義表類型
CREATETYPEEmployeetypeASTABLE
(EnoVARCHAR(5),
EnameVARCHAR(10));2025/8/14
76查看用戶自定義數(shù)據(jù)類型使用系統(tǒng)存儲(chǔ)過程sp_help來查看用戶自定義數(shù)據(jù)類型的信息:基于的系統(tǒng)數(shù)據(jù)類型長(zhǎng)度、精度是否允許為空值在這一數(shù)據(jù)類型上捆綁的規(guī)則和默認(rèn)值等。2025/8/14
77刪除用戶自定義數(shù)據(jù)類型使用企業(yè)管理器使用T-SQL語(yǔ)句使用系統(tǒng)存儲(chǔ)過程sp_droptype來刪除用戶自定義數(shù)據(jù)類型。語(yǔ)法:sp_droptype‘type’注意,正在被表或數(shù)據(jù)庫(kù)使用的用戶自定義數(shù)據(jù)類型不能被刪除。2025/8/14
78例3.刪除別名數(shù)據(jù)類型birthday。
sp_droptype
'birthday';SQLSERVER高版本中的使用:
DROPTYPEbirthday;2025/8/14
792規(guī)則在向表的某列插入或更新數(shù)據(jù)時(shí),用它來限制輸入的新值的取值范圍。規(guī)則是實(shí)現(xiàn)域完整性的方法之一,用來驗(yàn)證一個(gè)數(shù)據(jù)庫(kù)中的數(shù)據(jù)是否處于一個(gè)指定的值域范圍內(nèi)。規(guī)則與CHECK約束的不同之處:CHECK約束是用CREATETABLE語(yǔ)句在建表時(shí)指定的,而規(guī)則需要作為單獨(dú)的數(shù)據(jù)庫(kù)對(duì)象來實(shí)現(xiàn)。在一列上只能使用一個(gè)規(guī)則,但可以使用多個(gè)CHECK約束。規(guī)則可以應(yīng)用于多個(gè)列,還可以應(yīng)用于用戶自定義的數(shù)據(jù)類型,而CHECK約束只能應(yīng)用于它定義的列。2025/8/14
80創(chuàng)建規(guī)則使用T-SQL語(yǔ)句CREATERULE語(yǔ)法:
CREATERULErule
AScondition_expressioncondition_expression可以是任何在查詢的where子句中出現(xiàn)的表達(dá)式,但不能包括列名或其他數(shù)據(jù)庫(kù)對(duì)象名。在表達(dá)式中有一個(gè)以@開頭的變量,該變量代表在修改該列的紀(jì)錄是用戶輸入的數(shù)值。2025/8/14
81例4.創(chuàng)建具有范圍的規(guī)則CREATERULErange_ruleAS@value>=18例5.創(chuàng)建具有列表的規(guī)則
CREATERULEsex_rule
AS@sexIN('男','女');例6.創(chuàng)建具有模糊匹配的規(guī)則
CREATERULEtelephone_rule
AS@telephonelike'[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]';2025/8/14
82捆綁規(guī)則使用系統(tǒng)存儲(chǔ)過程sp_bindrule可以將規(guī)則捆綁到列或用戶自定義數(shù)據(jù)類型上。語(yǔ)法:Sp_bindrule‘rule’,‘object_name’[,‘futureonly_flag’]rule:規(guī)則的名稱object_name為規(guī)則要捆綁到的列名或用戶自定義數(shù)據(jù)類型名futureonly_flag可選參數(shù),僅在要捆綁到用戶自定義數(shù)據(jù)類型時(shí)使用。2025/8/14
83例7.將規(guī)則綁定到列。
EXECsp_bindrule'range_rule','Employee.Age';例8.將規(guī)則綁定到別名數(shù)據(jù)類型。
EXECsp_bindrule'telephone_rule','telephone';例9.使用futureonly_flag。
以下示例將telephone_rule規(guī)則綁定到別名數(shù)據(jù)類型telephone。由于已指定futureonly,因此不影響類型為telephone的現(xiàn)有列。EXECsp_bindrule
'telephone_rule','telephone','futureonly';2025/8/14
84使用sp_unbindrule系統(tǒng)存儲(chǔ)過程可以解除捆綁到列或用戶自定義數(shù)據(jù)類型上的規(guī)則。語(yǔ)法:
sp_unbindrule‘object_name’[,‘futureonly_flag’]2025/8/14
85例10.解除綁定列上的規(guī)則。EXECsp_unbindrule
'Employee.Age';例11.解除綁定別名類型的規(guī)則。EXECsp_unbindrule
'telephone','futureonly';2025/8/14
86查看規(guī)則使用企業(yè)管理器使用系統(tǒng)存儲(chǔ)過程sp_help可以查看規(guī)則的擁有者、創(chuàng)建時(shí)間等基本信息。使用系統(tǒng)存儲(chǔ)過程sp_helptext可以查看規(guī)則的定義。2025/8/14
87刪除規(guī)則使用DROPRULE語(yǔ)句可以刪除當(dāng)前數(shù)據(jù)庫(kù)中的一個(gè)或多個(gè)規(guī)則。在刪除一個(gè)規(guī)則之前,應(yīng)首先將規(guī)則從它所捆綁的列或用戶自定義數(shù)據(jù)類型上解除下來。當(dāng)要?jiǎng)h除的規(guī)則仍捆綁在列或用戶自定義數(shù)據(jù)類型上時(shí),執(zhí)行DROPRULE會(huì)顯示錯(cuò)誤信息,同時(shí)DROPRULE操作將被撤銷。2025/8/14
88例12.刪除規(guī)則
--先解除綁定在列上的該規(guī)則
EXECsp_unbindrule
'Employee.Age';--然后在刪除該規(guī)則
DROPRULErange_rule;2025/8/14
893默認(rèn)值默認(rèn)值可以是常量、內(nèi)置函數(shù)或數(shù)學(xué)表達(dá)式。使用CREATETABLE語(yǔ)句創(chuàng)建表時(shí),使用DEFAULT子句為表中的列提供默認(rèn)值。使用CREATEDEFAULT語(yǔ)句來創(chuàng)建一個(gè)默認(rèn)對(duì)象,然后再將其捆綁到列或用戶自定義數(shù)據(jù)類型上。2025/8/14
90創(chuàng)建默認(rèn)值使用T-SQL語(yǔ)句CREATEDEFAULT可以創(chuàng)建默認(rèn)對(duì)象。語(yǔ)法:
CREATEDEFAULTdefault
ASconstant_expression2025/8/14
91捆綁默認(rèn)值可以使用sp_bindefault系統(tǒng)存儲(chǔ)過程語(yǔ)法:
sp_bindefault‘default’,‘object_name’,‘futureonly_flag’使用sp_unbindefault系統(tǒng)存儲(chǔ)過程可以解除捆綁導(dǎo)列或用戶自定義數(shù)據(jù)類型上的默認(rèn)值。語(yǔ)法:sp_unbindefault‘object_name’[,’futureonly_flag’]2025/8/14
92例13.創(chuàng)建默認(rèn)值addressdefault。
CREATEDEFAULTaddressdefault
AS‘杭州下沙’;例14.綁定默認(rèn)值。
EXECsp_bindefault‘a(chǎn)ddressdefault’,'Employee.Address';例15.解除默認(rèn)值。EXEC
sp_unbindefault
'Employee.Address';2025/8/14
93查看默認(rèn)值可使用企業(yè)管理器??墒褂孟到y(tǒng)存儲(chǔ)過程sp_help可以查看默認(rèn)值的擁有者、創(chuàng)建時(shí)間等基本信息??墒褂孟到y(tǒng)存儲(chǔ)過程sp_helptext可以查看默認(rèn)值的定義。2025/8/14
94刪除默認(rèn)值使用DROPDEFAULT語(yǔ)句可以刪除當(dāng)前數(shù)據(jù)庫(kù)中的一個(gè)或多個(gè)默認(rèn)值。注意:在刪除默認(rèn)值之前,應(yīng)使用sp_unbindefault系統(tǒng)存儲(chǔ)過程來解除該默認(rèn)值在列或用戶自定義數(shù)據(jù)類型上的捆綁。95數(shù)據(jù)完整性小結(jié)數(shù)據(jù)庫(kù)的完整性是為了保證數(shù)據(jù)庫(kù)中存儲(chǔ)的數(shù)據(jù)是正確的RDBMS完整性實(shí)現(xiàn)的機(jī)制完整性約束定義機(jī)制完整性檢查機(jī)制違背完整性約束條件時(shí)RDBMS應(yīng)采取的動(dòng)作在關(guān)系系統(tǒng)中,最重要的完整性約束是實(shí)體完整性參照完整性用戶定義的完整性數(shù)據(jù)庫(kù)完整性的定義一般由SQL的DDL語(yǔ)句實(shí)現(xiàn)作為數(shù)據(jù)庫(kù)模式的一部分存入數(shù)據(jù)字典在數(shù)據(jù)庫(kù)數(shù)據(jù)修改時(shí),RDBMS的完整性檢查機(jī)制就按照數(shù)據(jù)字典中定義的這些約束進(jìn)行檢查完整性機(jī)制的實(shí)施會(huì)影響系統(tǒng)性能。隨著硬件性能的提高,數(shù)據(jù)庫(kù)技術(shù)的發(fā)展,目前的RDBMS都提供了定義和檢查實(shí)體完整性、參照完整性和用戶定義的完整性的功能。對(duì)于違反完整性的操作要根據(jù)應(yīng)用語(yǔ)義來選擇合適的處理策略,以保證數(shù)據(jù)庫(kù)的正確性2025/8/14
97可能破壞參照完整性的情況及違約處理被參照表(例如Student)參照表(例如SC)違約處理可能破壞參照完整性插入元組拒絕可能破壞參照完整性修改外碼值拒絕刪除元組可能破壞參照完整性拒絕/級(jí)連刪除/設(shè)置為空值修改主碼值可能破壞參照完整性拒絕/級(jí)連修改/設(shè)置為空值2025/8/14
98完整性小結(jié)(續(xù)):觸發(fā)器實(shí)現(xiàn)數(shù)據(jù)庫(kù)完整性的一個(gè)重要方法是觸發(fā)器是定義在關(guān)系表上的由事件驅(qū)動(dòng)的特殊過程可以用于數(shù)據(jù)庫(kù)完整性檢查也可以用來實(shí)現(xiàn)數(shù)據(jù)庫(kù)系統(tǒng)的其他功能數(shù)據(jù)庫(kù)安全性應(yīng)用系統(tǒng)的一些業(yè)務(wù)流程和控制流程基于規(guī)則的數(shù)據(jù)和業(yè)務(wù)控制功能不同的RDBMS實(shí)現(xiàn)觸發(fā)器的語(yǔ)法不同2025/8/14
99作業(yè)1準(zhǔn)備第三次上機(jī)實(shí)驗(yàn)內(nèi)容(1)詳見附錄A:“上機(jī)實(shí)驗(yàn)八完整性約束的實(shí)現(xiàn)”。在MicrosoftSQLServer環(huán)境中,上機(jī)實(shí)現(xiàn)書中第4章的各例題。2025/8/14
100SQL語(yǔ)言
高級(jí)應(yīng)用(二)4.3數(shù)據(jù)庫(kù)安全性2025/8/14
101數(shù)據(jù)庫(kù)保護(hù)數(shù)據(jù)庫(kù)中的數(shù)據(jù)由DBMS統(tǒng)一管理控制,為適應(yīng)數(shù)據(jù)共享的環(huán)境,DBMS必須提供數(shù)據(jù)的安全性、完整性、并發(fā)控制和數(shù)據(jù)備份恢復(fù)等數(shù)據(jù)保護(hù)能力,以保證數(shù)據(jù)庫(kù)中的數(shù)據(jù)安全可靠和正確有效。2025/8/14
1021.完整性數(shù)據(jù)庫(kù)的完整性是指數(shù)據(jù)庫(kù)中數(shù)據(jù)的正確性與相容性。SQL語(yǔ)言定義完整性約束條件CREATETABLE語(yǔ)句ALTERTABLE語(yǔ)句實(shí)體完整性:primarykey、unique參照完整性:foreignkey用戶定義完整性:check、default2025/8/14
1032.安全性安全性:保護(hù)數(shù)據(jù)庫(kù),防止不合法的使用所造成的數(shù)據(jù)泄露和破壞。保證數(shù)據(jù)安全性的主要措施:存取控制:控制用戶只能存取他有權(quán)存取的數(shù)據(jù),規(guī)定不同用戶對(duì)于不同數(shù)據(jù)對(duì)象所允許執(zhí)行的操作2025/8/14
1043.并發(fā)控制并發(fā)控制:當(dāng)多個(gè)用戶并發(fā)地對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作時(shí),對(duì)他們加以控制、協(xié)調(diào),以保證并發(fā)操作正確執(zhí)行,保持?jǐn)?shù)據(jù)庫(kù)的一致性。SQL語(yǔ)言并發(fā)控制能力:提供事務(wù)開始、事務(wù)結(jié)束、提交、撤銷等概念2025/8/14
1054.數(shù)據(jù)備份恢復(fù)恢復(fù):當(dāng)發(fā)生各種類型的故障導(dǎo)致數(shù)據(jù)庫(kù)處于不一致狀態(tài)時(shí),將數(shù)據(jù)庫(kù)恢復(fù)到一致狀態(tài)的功能。SQL語(yǔ)言恢復(fù)功能:提供事務(wù)回滾、重做等概念(UNDO、REDO)2025/8/14
106數(shù)據(jù)安全性數(shù)據(jù)庫(kù)系統(tǒng)的安全性是數(shù)據(jù)庫(kù)保護(hù)的首要問題。安全性是相對(duì)的。加強(qiáng)安全性是應(yīng)用開發(fā)一個(gè)重要的方面。安全性與保密性不可分。本節(jié)主要討論安全性的一般概念和方法,介紹SQLServer數(shù)據(jù)庫(kù)系統(tǒng)的安全性措施。2025/8/14
107數(shù)據(jù)庫(kù)安全數(shù)據(jù)庫(kù)的破壞一般來自以下的四個(gè)方面:系統(tǒng)故障;并發(fā)所引起的數(shù)據(jù)不一致;輸入或更新數(shù)據(jù)庫(kù)數(shù)據(jù)有誤;人為的破壞。所謂數(shù)據(jù)庫(kù)安全(Security),就是要防止其中第四種。2025/8/14
108數(shù)據(jù)庫(kù)安全性概念何為數(shù)據(jù)庫(kù)安全性?保護(hù)數(shù)據(jù)庫(kù)以防止不合法的使用所造成的數(shù)據(jù)泄露、更改或破壞。系統(tǒng)安全保護(hù)措施是否有效是數(shù)據(jù)庫(kù)系統(tǒng)的主要性能指標(biāo)之一。安全性問題和保密問題密切相關(guān)。前者主要涉及數(shù)據(jù)的存取控制、
修改和傳播的技術(shù)手段;后者在很大程度上是法律、政策、倫理、道德等問題。一些國(guó)家已成立了專門機(jī)構(gòu)對(duì)數(shù)據(jù)的安全保密制訂了法律道德準(zhǔn)則和政策法規(guī)。2025/8/14
109數(shù)據(jù)庫(kù)安全保密方式數(shù)據(jù)庫(kù)安全保密方式有:系統(tǒng)處理的和物理的兩個(gè)方面。所謂物理的是指,對(duì)于強(qiáng)力逼迫透露口令、在通訊線路上竊聽、以至盜竊物理存儲(chǔ)設(shè)備等行為而采取的將數(shù)據(jù)編為密碼,加強(qiáng)警衛(wèi)以識(shí)別用戶身份和保護(hù)存儲(chǔ)設(shè)備等措施。所謂系統(tǒng)處理的是指利用計(jì)算機(jī)系統(tǒng)方面的技術(shù)手段。本節(jié)主要講述系統(tǒng)處理方面的數(shù)據(jù)庫(kù)安全措施。2025/8/14
110計(jì)算機(jī)安全措施設(shè)置模型在一般計(jì)算機(jī)系統(tǒng)中,安全措施是一級(jí)一級(jí)層層設(shè)置的。有如下的模型:2025/8/14
111數(shù)據(jù)庫(kù)安全措施數(shù)據(jù)庫(kù)系統(tǒng)的安全措施是建立在計(jì)算機(jī)系統(tǒng)基礎(chǔ)之上的,通常有五個(gè)方面。1.用戶標(biāo)識(shí)和鑒定2.存取控制3.定義視圖4.審計(jì)5.數(shù)據(jù)加密2025/8/14
112安全措施一:用戶標(biāo)識(shí)和鑒定用戶標(biāo)識(shí)和鑒定常用的方法有:(1)用一個(gè)用戶名或用戶標(biāo)識(shí)號(hào)標(biāo)明用戶身份。(2)口令(Password)(3)系統(tǒng)提供一個(gè)隨機(jī)數(shù),用戶根據(jù)預(yù)先約定好的某一過程或者函數(shù)進(jìn)行計(jì)算,系統(tǒng)根據(jù)用戶計(jì)算結(jié)果是否正確進(jìn)一步鑒定用戶身份。用戶標(biāo)識(shí)和鑒定可重復(fù)多次。2025/8/14
113安全措施二:存取控制對(duì)于獲得上機(jī)權(quán)的用戶還要根據(jù)預(yù)先定義好的用戶權(quán)限進(jìn)行存取控制,保證用戶只能存取他有權(quán)存取的數(shù)據(jù)。所謂用戶權(quán)限是指不同的用戶對(duì)于不同的數(shù)據(jù)對(duì)象允許執(zhí)行的操作權(quán)限,它由兩部分組成:數(shù)據(jù)對(duì)象和操作類型。數(shù)據(jù)對(duì)象操作類型模式、外模式、內(nèi)模式建立、修改、檢索表或者記錄、字段查找、插入、修改、刪除2025/8/14
114安全措施三:視圖視圖主要用于保證程序的邏輯獨(dú)立性,也還可將機(jī)密數(shù)據(jù)隱藏起來,能提供一定程度的安全保護(hù),但不精細(xì)。不同的DBMS都提供了建立視圖的機(jī)制。開發(fā)數(shù)據(jù)系統(tǒng)時(shí)應(yīng)盡可能地為不同的用戶建立相應(yīng)的視圖來訪問數(shù)據(jù)。
如建立一個(gè)“信息管理系學(xué)生視圖”2025/8/14
115安全措施四:審計(jì)審計(jì)是一種預(yù)防手段,監(jiān)測(cè)可能的不合法訪問。審訊追蹤技術(shù)使用專用文件或數(shù)據(jù)庫(kù)自動(dòng)記錄用戶對(duì)數(shù)據(jù)庫(kù)的所有操作,利用這些信息就能找出非法存取數(shù)據(jù)的人。審訊追蹤很費(fèi)時(shí)間和空間,一般DBMS只作為一種可選的特性,可靈活地打開或關(guān)閉審計(jì)功能。審計(jì)功能一般用于安全性要求較高的部門。
2025/8/14
116安全措施五:數(shù)據(jù)加密對(duì)高度機(jī)密性數(shù)據(jù),通過采用數(shù)據(jù)加密技術(shù),以密碼形式存儲(chǔ)和傳輸,這樣即使數(shù)據(jù)被竊取,看到是無法辨識(shí)的二進(jìn)制代碼。用戶正常檢索數(shù)據(jù)時(shí),首先要提供密碼鑰匙,經(jīng)系統(tǒng)譯碼后,才能得到可識(shí)別的數(shù)據(jù)。目前很多數(shù)據(jù)產(chǎn)品都提供了數(shù)據(jù)加密例行程序,可根據(jù)用戶要求自動(dòng)對(duì)數(shù)據(jù)進(jìn)行加密處理,另外有一些數(shù)據(jù)庫(kù)產(chǎn)品雖本身未提供加密程序,但允許用戶用其他廠商的加密程序來加密數(shù)據(jù)。解密程序本身一定要具有一定的安全性保護(hù)措施。加密與解密很費(fèi)時(shí),會(huì)占用大量系統(tǒng)資源,因此,一般作為數(shù)據(jù)庫(kù)存系統(tǒng)的可選功能,允許用戶自由選擇。
2025/8/14
117DBMS實(shí)現(xiàn)數(shù)據(jù)安全性保護(hù)的過程用戶或DBA把授權(quán)決定告知系統(tǒng)SQL的GRANT和REVOKEDBMS把授權(quán)的結(jié)果存入數(shù)據(jù)字典當(dāng)用戶提出操作請(qǐng)求時(shí),DBMS根據(jù)授權(quán)定義進(jìn)行檢查,以決定是否執(zhí)行操作請(qǐng)求2025/8/14
118DBMS實(shí)現(xiàn)數(shù)據(jù)安全性保護(hù)的過程誰(shuí)定義?
DBA和表的建立者(即表的擁有者)如何定義?SQL語(yǔ)句:
GRANT
REVOKE2025/8/14
119SQLSERVER中的安全性措施SQLSERVER具有較健全的安全性機(jī)制設(shè)置了兩種安全認(rèn)證模式用戶與角色管理權(quán)限管理SQLServer的安全性機(jī)制SQLServer數(shù)據(jù)庫(kù)的安全性
用戶成功登錄SQLServer服務(wù)器后,并不自動(dòng)擁有對(duì)所有數(shù)據(jù)庫(kù)的訪問權(quán)限。用戶必須在想要訪問的數(shù)據(jù)庫(kù)中也有一個(gè)帳戶。當(dāng)需要訪問某個(gè)數(shù)據(jù)庫(kù)時(shí),SQLServer的安全系統(tǒng)會(huì)根據(jù)這個(gè)帳戶的權(quán)限決定是否允許用戶訪問該數(shù)據(jù)庫(kù)。
SQLServer數(shù)據(jù)庫(kù)對(duì)象的安全性
在創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)對(duì)象時(shí),創(chuàng)建者將自動(dòng)擁有對(duì)該數(shù)據(jù)庫(kù)對(duì)象的所有權(quán),即可以完全控制該對(duì)象。當(dāng)一個(gè)非數(shù)據(jù)庫(kù)擁有者想要訪問數(shù)據(jù)庫(kù)中的對(duì)象時(shí),必須事先由數(shù)據(jù)庫(kù)擁有者賦予該用戶對(duì)指定對(duì)象的操作權(quán)限。2025/8/14
121安全認(rèn)證模式SQLServer登錄身份驗(yàn)證模式SQLServer身份驗(yàn)證Windows身份驗(yàn)證設(shè)置SQLServer身份驗(yàn)證模式
添加SQLServer、Windows身份驗(yàn)證登錄帳戶修改、拒絕、刪除登錄帳戶特殊帳戶sa當(dāng)SQLServer安裝完成后,SQLServer就建立了一個(gè)特殊的帳戶sa(SystemAdministrator)。sa帳戶擁有服務(wù)器和所有的數(shù)據(jù)庫(kù),即sa擁有最高的管理權(quán)限,可以執(zhí)行服務(wù)器范圍內(nèi)的所有操作。同時(shí),sa帳戶無法刪除。用戶管理SQLServer中,在建立用戶的登錄賬號(hào)信息時(shí),會(huì)提示用戶選擇默認(rèn)的數(shù)據(jù)庫(kù)。對(duì)于任何用戶來說,master數(shù)據(jù)庫(kù)總是能連接并訪問的。如果在設(shè)置登錄賬號(hào)時(shí)沒有指定默認(rèn)的數(shù)據(jù)庫(kù),則用戶的權(quán)限將局限在master數(shù)據(jù)庫(kù)以內(nèi)。①創(chuàng)建賬號(hào)語(yǔ)句:SP_ADDLOGIN‘<登錄賬號(hào)名>’[,‘<密碼>’][,‘<默認(rèn)數(shù)據(jù)庫(kù)名>’]例:sp_addlogin‘kite’②修改賬號(hào)密碼語(yǔ)句:SP_PASSWORD‘<舊密碼>’,‘<新密碼>’,‘<登錄賬號(hào)名>’例:sp_password‘’,’kite’,’kite’③修改默認(rèn)數(shù)據(jù)庫(kù)名語(yǔ)句:SP_DEFAULTDB‘<登錄賬號(hào)名>’,‘<默認(rèn)數(shù)據(jù)庫(kù)名>’④刪除賬號(hào)語(yǔ)句:SP_DROPLOGIN‘<登錄賬號(hào)名>’用戶管理(續(xù))將登錄賬號(hào)添加為數(shù)據(jù)庫(kù)用戶后,使用該登錄賬號(hào)登錄的SQLServer用戶就可以實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)的訪問。①添加數(shù)據(jù)庫(kù)用戶語(yǔ)句:SP_GRANTDBACCESS‘<登錄賬號(hào)名>’[,‘<該賬號(hào)在數(shù)據(jù)庫(kù)下的用戶名>’]②刪除數(shù)據(jù)庫(kù)用戶語(yǔ)句:
SP_REVOKEDBACCESS‘<該賬號(hào)在數(shù)據(jù)庫(kù)下的用戶名>’③為當(dāng)前數(shù)據(jù)庫(kù)中的新用戶添加安全帳戶:
SP_ADDUSER‘<登錄賬號(hào)名>’[,‘<該賬號(hào)在數(shù)據(jù)庫(kù)下的用戶名>’]例:sp_adduser‘kite’,’ftt’報(bào)告
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 銷售網(wǎng)上面試題庫(kù)精 編版:全面掌握銷售技巧
- 保險(xiǎn)與家庭理財(cái)宣講
- 履帶式工程機(jī)械行走系介紹2講課文檔
- 《第5課北極星不動(dòng)的秘密課件》
- 三清招聘面試必 備題庫(kù):新面試題目深度解讀
- 年會(huì)團(tuán)建活動(dòng)策劃方案
- 清廉醫(yī)院建設(shè)指導(dǎo)
- 2026屆江西省撫州市臨川第一中學(xué)化學(xué)高一上期末學(xué)業(yè)水平測(cè)試試題含解析
- 心臟起搏器基礎(chǔ)與應(yīng)用
- 文明城市創(chuàng)建講解
- 疼痛的基本概念及診斷
- 2024年西藏噶爾縣公開招聘城市協(xié)管員試題帶答案詳解
- 2025年廣西公需科目考試試題及答案(供參考)
- 急危重癥的觀察與護(hù)理
- 2025中國(guó)南水北調(diào)集團(tuán)新能源投資有限公司中層及職員社會(huì)招聘筆試參考題庫(kù)附帶答案詳解
- DB64∕ 266-2018 建筑工程資料管理規(guī)程
- 資產(chǎn)管理效能提升路徑與實(shí)踐探索
- 2025至2030中國(guó)飲用礦泉水行業(yè)發(fā)展分析及產(chǎn)業(yè)運(yùn)行態(tài)勢(shì)及投資規(guī)劃深度研究報(bào)告
- 高中地理開學(xué)第一課高一上學(xué)期
- 中學(xué)團(tuán)建活動(dòng)方案
- 中醫(yī)藥健康管理培訓(xùn)課件
評(píng)論
0/150
提交評(píng)論