《數(shù)據(jù)庫技術(shù)與應(yīng)用》電子課件
《數(shù)據(jù)庫技術(shù)與應(yīng)用》電子課件,數(shù)據(jù)庫技術(shù)與應(yīng)用,數(shù)據(jù)庫技術(shù),應(yīng)用,電子,課件
第5章數(shù)據(jù)庫的完整性和安全性本章學(xué)習(xí)目標(biāo)l掌握數(shù)據(jù)庫完整性的基本概念。掌握數(shù)據(jù)庫完整性的基本概念。l清楚數(shù)據(jù)庫完整性約束條件的分類。清楚數(shù)據(jù)庫完整性約束條件的分類。l掌握并運用掌握并運用SQLSQL實現(xiàn)實體完整性和參照完整性的定義。實現(xiàn)實體完整性和參照完整性的定義。l運用運用SQLSQL靈活實現(xiàn)用戶自定義完整性的各種約束。靈活實現(xiàn)用戶自定義完整性的各種約束。l掌握完整性約束的修改方法。掌握完整性約束的修改方法。l理解觸發(fā)器的概念和作用。理解觸發(fā)器的概念和作用。l掌握數(shù)據(jù)庫安全性的基本概念。掌握數(shù)據(jù)庫安全性的基本概念。l清楚清楚DBMSDBMS中的安全性保護措施。中的安全性保護措施。l清楚清楚SQLSQL中的安全機制。中的安全機制。l掌握并運用掌握并運用SQLSQL實現(xiàn)授權(quán)和角色機制。實現(xiàn)授權(quán)和角色機制。l了解其他安全措施。了解其他安全措施。本章概述數(shù)數(shù)據(jù)據(jù)庫庫作作為為資資源源共共享享和和存存放放大大量量數(shù)數(shù)據(jù)據(jù)的的場場所所,如如何何能能更更好好地地保保護護數(shù)數(shù)據(jù)據(jù)庫庫中中的的數(shù)數(shù)據(jù)據(jù)就就顯顯得得尤尤為為重重要要。數(shù)數(shù)據(jù)據(jù)的的完完整整性性和和安安全全性性是是數(shù)數(shù)據(jù)據(jù)庫庫保保護護的的兩兩個個不不同同方方面面。安安全全性性是是防防止止非非法法用用戶戶惡惡意意破破壞壞和和越越權(quán)權(quán)存存取取數(shù)數(shù)據(jù)據(jù),確確保保用用戶戶被被限限制制在在其其想想做做的的事事情情范范圍圍之之內(nèi)內(nèi)。完完整整性性則則是是防防止止合合法法用用戶戶使使用用數(shù)數(shù)據(jù)據(jù)庫庫時時無無意意中中造造成成的的破破壞壞,確確保保用用戶戶所所做做的的事事情情是是正正確確的的。即即安安全全性性措措施施的的防防范范對對象象是是非非法法用用戶戶和和非非法法操操作作,完完整整性措施的防范對象是不合語義的數(shù)據(jù)。性措施的防范對象是不合語義的數(shù)據(jù)。主要內(nèi)容5.1 完整性概述5.3參照完整性5.4用戶自定義完整性5.2 實體完整性5.5 完整性約束的修改5.6 觸發(fā)器5.8 DBMS中的安全性保護5.9 SQL中的安全性機制5.7 安全性概述5.10 其它安全機制主要內(nèi)容5.1 完整性概述5.3參照完整性5.4用戶自定義完整性5.2 實體完整性5.5 完整性約束的修改5.6 觸發(fā)器5.8 DBMS中的安全性保護5.9 SQL中的安全性機制5.7 安全性概述5.10 其它安全機制5.1.1 完整性概念數(shù)據(jù)庫的數(shù)據(jù)庫的完整性完整性(integrity)(integrity)的基本含義是指數(shù)據(jù)庫中數(shù)據(jù)的的基本含義是指數(shù)據(jù)庫中數(shù)據(jù)的正正確性、有效性和相容性確性、有效性和相容性,其目的是,其目的是防止防止不符合語義、不正確的數(shù)據(jù)不符合語義、不正確的數(shù)據(jù)進入數(shù)據(jù)庫,從而來保證數(shù)據(jù)庫系統(tǒng)能夠真實的反映客觀現(xiàn)實世界。進入數(shù)據(jù)庫,從而來保證數(shù)據(jù)庫系統(tǒng)能夠真實的反映客觀現(xiàn)實世界。l正確性正確性(correctness)correctness)是指數(shù)據(jù)的合法性,例如成績屬于數(shù)值型數(shù)據(jù),是指數(shù)據(jù)的合法性,例如成績屬于數(shù)值型數(shù)據(jù),只能含有數(shù)字而不能含有字母。只能含有數(shù)字而不能含有字母。l有效性有效性(valid)(valid)是指數(shù)據(jù)是否屬于所定義域的有效范圍,例如性別只能是指數(shù)據(jù)是否屬于所定義域的有效范圍,例如性別只能是男或女。是男或女。l相容性相容性(consistency)(consistency)是指表示同一事實的兩個數(shù)據(jù)應(yīng)當(dāng)一致,不一致是指表示同一事實的兩個數(shù)據(jù)應(yīng)當(dāng)一致,不一致即是不相容。例如一個學(xué)生不能有兩個學(xué)號。即是不相容。例如一個學(xué)生不能有兩個學(xué)號。lDBMSDBMS必須必須提供一種功能來確保數(shù)據(jù)的提供一種功能來確保數(shù)據(jù)的正確性正確性,避免不合語義的數(shù)據(jù)造,避免不合語義的數(shù)據(jù)造成的無效操作和錯誤結(jié)果,還要檢查先后輸入的數(shù)據(jù)是否一致。成的無效操作和錯誤結(jié)果,還要檢查先后輸入的數(shù)據(jù)是否一致。5.1.2完整性約束條件 數(shù)據(jù)庫中的數(shù)據(jù)要成為有意義的信息,必須滿足一定的語義數(shù)據(jù)庫中的數(shù)據(jù)要成為有意義的信息,必須滿足一定的語義約束條件。數(shù)據(jù)庫中數(shù)據(jù)應(yīng)當(dāng)滿足的條件稱為約束條件。數(shù)據(jù)庫中數(shù)據(jù)應(yīng)當(dāng)滿足的條件稱為“完整性約束條件完整性約束條件”,也稱為,也稱為“完整性規(guī)則完整性規(guī)則”。它是。它是DBMSDBMS控制數(shù)據(jù)完整性的依據(jù),控制數(shù)據(jù)完整性的依據(jù),是整個完整性控制機制的核心。是整個完整性控制機制的核心。完整性約束條件作用的對象是完整性約束條件作用的對象是關(guān)系、元組和屬性關(guān)系、元組和屬性,這三種對,這三種對象的狀態(tài)可以是象的狀態(tài)可以是靜態(tài)靜態(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)為:p(1)(1)靜態(tài)屬性級約束靜態(tài)屬性級約束:是對一個屬性的取值域的說明,即對數(shù)據(jù)類型、數(shù)是對一個屬性的取值域的說明,即對數(shù)據(jù)類型、數(shù)據(jù)格式和取值范圍的約束。如,學(xué)生的出生年月日必須為日期型,成績的據(jù)格式和取值范圍的約束。如,學(xué)生的出生年月日必須為日期型,成績的取值范圍必須在取值范圍必須在0 0100100等。等。p(2)(2)靜態(tài)元組級約束靜態(tài)元組級約束:是對元組中各個屬性值之間關(guān)系的約束。如圖書管是對元組中各個屬性值之間關(guān)系的約束。如圖書管理表中有總庫存量,借出量,和剩余量三個屬性,其中借出量和剩余量都理表中有總庫存量,借出量,和剩余量三個屬性,其中借出量和剩余量都不得超過總庫存量。不得超過總庫存量。p(3)(3)靜態(tài)關(guān)系級約束靜態(tài)關(guān)系級約束:是一個關(guān)系中各個元組之間或者若干個關(guān)系之間常是一個關(guān)系中各個元組之間或者若干個關(guān)系之間常常存在的各種聯(lián)系的約束。常見的靜態(tài)關(guān)系約束有:常存在的各種聯(lián)系的約束。常見的靜態(tài)關(guān)系約束有:實體完整性;實體完整性;參參照完整性;照完整性;函數(shù)依賴約束,大部分函數(shù)依賴約束都在關(guān)系模式中定義;函數(shù)依賴約束,大部分函數(shù)依賴約束都在關(guān)系模式中定義;統(tǒng)計約束,即字段值與關(guān)系中多個元組的統(tǒng)計值之間的約束關(guān)系。統(tǒng)計約束,即字段值與關(guān)系中多個元組的統(tǒng)計值之間的約束關(guān)系。5.1.2完整性約束條件動態(tài)約束動態(tài)約束是指數(shù)據(jù)庫從一種正確狀態(tài)轉(zhuǎn)移到另一種狀態(tài)時,新、舊值是指數(shù)據(jù)庫從一種正確狀態(tài)轉(zhuǎn)移到另一種狀態(tài)時,新、舊值之間所應(yīng)滿足的約束條件。例:學(xué)生的最高學(xué)位,如下動態(tài)轉(zhuǎn)移是正之間所應(yīng)滿足的約束條件。例:學(xué)生的最高學(xué)位,如下動態(tài)轉(zhuǎn)移是正確的:學(xué)士到碩士、碩士到博士。確的:學(xué)士到碩士、碩士到博士。p(1)(1)動態(tài)屬性級約束動態(tài)屬性級約束:是修改:是修改定義或?qū)傩灾刀x或?qū)傩灾禃r應(yīng)滿足的約束條件,包時應(yīng)滿足的約束條件,包括兩種情況。括兩種情況。修改定義時的約束。例:將允許空值的屬性改為不允許空值時,如果該屬性當(dāng)前修改定義時的約束。例:將允許空值的屬性改為不允許空值時,如果該屬性當(dāng)前已存在空值,則規(guī)定拒絕修改。已存在空值,則規(guī)定拒絕修改。修改屬性值時的約束。例:修改屬性值時有時需要參照其舊值,或新舊值之間應(yīng)修改屬性值時的約束。例:修改屬性值時有時需要參照其舊值,或新舊值之間應(yīng)該滿足某種約束條件,如學(xué)生的年齡只能增長。該滿足某種約束條件,如學(xué)生的年齡只能增長。p(2)(2)動態(tài)元組級約束:動態(tài)元組級約束:是指修改是指修改某個元組的值某個元組的值時需要參照該元組的原時需要參照該元組的原有值,或者元組中各個字段之間應(yīng)當(dāng)滿足某種約束條件。例:給職工提有值,或者元組中各個字段之間應(yīng)當(dāng)滿足某種約束條件。例:給職工提升工資時新工資不得低于原工資升工資時新工資不得低于原工資+現(xiàn)工齡現(xiàn)工齡1010。p(3)(3)動態(tài)關(guān)系級約束:動態(tài)關(guān)系級約束:是加在關(guān)系變化前后是加在關(guān)系變化前后狀態(tài)上的限制狀態(tài)上的限制條件。例:條件。例:事物一致性、原子性等約束條件。事物一致性、原子性等約束條件。5.1.2完整性約束條件完整性約束條件從執(zhí)行時間上又可分為完整性約束條件從執(zhí)行時間上又可分為立即執(zhí)行約束立即執(zhí)行約束(immediate(immediate CONSTRAINTS)CONSTRAINTS)和和延遲執(zhí)行約束延遲執(zhí)行約束(deferred CONSTRAINTS)(deferred CONSTRAINTS)。p立即執(zhí)行約束立即執(zhí)行約束是指在執(zhí)行用戶事物是指在執(zhí)行用戶事物過程中過程中,某一條語句執(zhí)行完后,系統(tǒng)立,某一條語句執(zhí)行完后,系統(tǒng)立即對此數(shù)據(jù)進行完整性約束條件檢查。如果發(fā)現(xiàn)用戶操作請求違背了立即即對此數(shù)據(jù)進行完整性約束條件檢查。如果發(fā)現(xiàn)用戶操作請求違背了立即執(zhí)行約束,則可以拒絕該操作,以保證數(shù)據(jù)的完整性。執(zhí)行約束,則可以拒絕該操作,以保證數(shù)據(jù)的完整性。p延遲執(zhí)行約束延遲執(zhí)行約束是指在整個事物是指在整個事物執(zhí)行結(jié)束后執(zhí)行結(jié)束后再對約束條件進行完整性檢查,再對約束條件進行完整性檢查,結(jié)果正確后才能提交。如果發(fā)現(xiàn)用戶操作請求違背了延遲執(zhí)行約束,而又結(jié)果正確后才能提交。如果發(fā)現(xiàn)用戶操作請求違背了延遲執(zhí)行約束,而又不知道是哪個事物的操作破壞了完整性,則只能拒絕整個事物,把數(shù)據(jù)庫不知道是哪個事物的操作破壞了完整性,則只能拒絕整個事物,把數(shù)據(jù)庫恢復(fù)到該事物執(zhí)行前的狀態(tài)?;謴?fù)到該事物執(zhí)行前的狀態(tài)。完整性約束條件還可以完整性約束條件還可以作用在數(shù)據(jù)庫上作用在數(shù)據(jù)庫上,說明數(shù)據(jù)庫的合法取值。,說明數(shù)據(jù)庫的合法取值。通常,數(shù)據(jù)庫的約束檢查是可以延遲到事務(wù)提交時進行的,而上述通常,數(shù)據(jù)庫的約束檢查是可以延遲到事務(wù)提交時進行的,而上述作用于屬性、元組和關(guān)系的約束檢查是立即進行的。所有數(shù)據(jù)庫的作用于屬性、元組和關(guān)系的約束檢查是立即進行的。所有數(shù)據(jù)庫的更新都不能破壞數(shù)據(jù)庫的完整性。更新都不能破壞數(shù)據(jù)庫的完整性。5.1.3完整性控制機制為了維護數(shù)據(jù)庫的完整性,為了維護數(shù)據(jù)庫的完整性,DBMSDBMS必須提供以下三種機制:必須提供以下三種機制:p1.1.完整性約束條件定義完整性約束條件定義完整性約束條件也稱為完整性規(guī)則,是數(shù)據(jù)庫中的數(shù)據(jù)必須滿足的語義約束條件。SQL標(biāo)準(zhǔn)使用了一系列概念來描述完整性,包括關(guān)系模型的實體完整性、參照完整性和用戶定義完整性。這些完整性一般由SQL的DDL語義來實現(xiàn),它們作為數(shù)據(jù)庫模式的一部分存入數(shù)據(jù)字典中。p2.2.完整性檢查方法完整性檢查方法檢查數(shù)據(jù)是否滿足已定義的完整性約束條件稱為完整性檢查。一般在INSERT、UPDATE、DELETE語句執(zhí)行后開始檢查,也可以在事務(wù)提交時檢查。檢查這些操作執(zhí)行后數(shù)據(jù)庫中的數(shù)據(jù)是否違背了完整性約束條件。p3.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.8 DBMS中的安全性保護5.9 SQL中的安全性機制5.7 安全性概述5.10 其它安全機制5.2 實體完整性實體完整性實體完整性要求基本表的要求基本表的主碼值唯一且不允許為空值主碼值唯一且不允許為空值。在在SQLSQL中,實體完整性定義是使用中,實體完整性定義是使用CREATE TABLECREATE TABLE語句中的語句中的PRIMARY KEYPRIMARY KEY短語來實現(xiàn),或通過使用短語來實現(xiàn),或通過使用ALTER TABLEALTER TABLE語句中的語句中的ADD ADD PRIMARY KEYPRIMARY KEY短語來實現(xiàn)。短語來實現(xiàn)。對單屬性構(gòu)成的碼有兩種說明方法:對單屬性構(gòu)成的碼有兩種說明方法:u定義為列級約束條件定義為列級約束條件u定義為表級約束條件定義為表級約束條件對多個屬性構(gòu)成的碼只有一種說明方法,即定義為表級約束條件。對多個屬性構(gòu)成的碼只有一種說明方法,即定義為表級約束條件。5.2.1 實體完整性定義l 例例5-15-1 將將StudentStudent表中的表中的SnoSno屬性定義為碼。屬性定義為碼。CREATE TABLE Student (Sno CHAR(7),Sname CHAR(8)NOT NULL,Ssex CHAR(2),Sage SMALLINT,Sdept CHAR(20),PRIMARY KEY(Sno);/*在表級定義主碼*/其中,Sno為表Student的主碼,它由主碼約束說明PRIMARY KEY實現(xiàn)。對于這種情況,還可以直接在列Sno定義的同一行上定義為表Student的主碼。如:CREATE TABLE Student (Sno CHAR(7)PRIMARY KEY,/*在列級定義主碼*/Sname CHAR(8)NOT NULL,Ssex CHAR(2),Sage SMALLINT,Sdept CHAR(20);注意,如果主碼包含多列,則只能在表級定義。5.2.1 實體完整性定義l 例例5-2 5-2 將將SCSC表中的表中的Sno,CnoSno,Cno屬性組定義為主碼。屬性組定義為主碼。CREATE TABLE SC (Sno CHAR(7),Cno CHAR(4),Grade SMALLINT,PRIMARY KEY(Sno,Cno);/*只能在表級定義主碼*/5.2.2實體完整性檢查和違約處理在用在用PRIMAYR KEYPRIMAYR KEY語句定義了關(guān)系的主碼后,每個用戶程序?qū)Z句定義了關(guān)系的主碼后,每個用戶程序?qū)颈聿迦胍粭l記錄或者對主碼列進行更新操作時,本表插入一條記錄或者對主碼列進行更新操作時,RDBMSRDBMS將按實將按實體完整性規(guī)則自動進行檢查。包括:體完整性規(guī)則自動進行檢查。包括:(1)(1)檢查主碼值是否唯一,如果不唯一則拒絕插入或修改。檢查主碼值是否唯一,如果不唯一則拒絕插入或修改。(2)(2)檢查主碼的各個屬性是否為空,只要有一個為空就拒絕檢查主碼的各個屬性是否為空,只要有一個為空就拒絕插入或修改。插入或修改。檢查主碼值的唯一性,可以采用全表掃描法或B+樹索引掃描法。p全表掃描法:全表掃描法:從外存依次將表的每個數(shù)據(jù)塊讀入內(nèi)存,判斷塊中的從外存依次將表的每個數(shù)據(jù)塊讀入內(nèi)存,判斷塊中的每一條記錄的主碼值與待插入每一條記錄的主碼值與待插入(或修改或修改)記錄的主碼值是否相同,如果記錄的主碼值是否相同,如果相同,則阻止插入相同,則阻止插入(或修改或修改)。全表掃描法如圖。全表掃描法如圖5-15-1所示。所示。待插入或修改的記錄碼值碼值 i i屬性值屬性值i1i1屬性值屬性值i2i2碼值11屬性值11屬性值12碼值21屬性值21屬性值22碼值31屬性值31屬性這325.2.2實體完整性檢查和違約處理p B B+樹索引掃描法樹索引掃描法全表掃描法是十分耗時的,為了避免對基本表進行全表掃描,全表掃描法是十分耗時的,為了避免對基本表進行全表掃描,DBMSDBMS核心一般都在核心一般都在主碼上自動建立一個主碼上自動建立一個B B+樹索引,通過掃描索引來查找基本表中是否存在相同的主碼樹索引,通過掃描索引來查找基本表中是否存在相同的主碼值,這將大大提高效率。值,這將大大提高效率。例如,如果新插入記錄的主碼值是25,通過主碼索引,從B+樹的根結(jié)點開始查找,只要讀取3個結(jié)點就可以知道該主碼值已經(jīng)存在,所以不能插入這條記錄。這3個結(jié)點是根結(jié)點(51)、中間結(jié)點(12 30)、葉節(jié)點(15 20 25)。如果新插入記錄的主碼值是86,也只要查找3個結(jié)點就可以知道該主碼值不存在,所以可以插入該記錄,如圖5-2所示。主要內(nèi)容5.1 完整性概述5.3參照完整性5.4用戶自定義完整性5.2 實體完整性5.5 完整性約束的修改5.6 觸發(fā)器5.8 DBMS中的安全性保護5.9 SQL中的安全性機制5.7 安全性概述5.10 其它安全機制5.3參照完整性 參照完整性參照完整性是指基本關(guān)系是指基本關(guān)系R R的任何一個元組在外碼的任何一個元組在外碼F F上的取值上的取值要么是空值,要么是被參照關(guān)系要么是空值,要么是被參照關(guān)系S S中一個元組的主碼值。中一個元組的主碼值。SQLSQL不僅可以實現(xiàn)實體完整性的定義,還可以通過不僅可以實現(xiàn)實體完整性的定義,還可以通過CREATE CREATE TABLETABLE語句定義參照完整性規(guī)則。即用戶可以在建表時定義哪些語句定義參照完整性規(guī)則。即用戶可以在建表時定義哪些列為外碼列,這個外碼對應(yīng)于哪個表的主碼。列為外碼列,這個外碼對應(yīng)于哪個表的主碼。一般來講,參照完整性的定義包括兩個部分:一般來講,參照完整性的定義包括兩個部分:(1)(1)外碼說明外碼說明,它由,它由FOREIGN KEY(FOREIGN KEY(列名列名)語句來描述。語句來描述。(2)(2)被引用的表名和列名被引用的表名和列名,由,由REFERENCESREFERENCES語句描述。語句描述。5.3.1 參照完整性定義l 例例5-3 5-3 關(guān)系關(guān)系SCSC中一個元組表示一個學(xué)生選修的某門課程的成績,中一個元組表示一個學(xué)生選修的某門課程的成績,Sno Sno 代表代表StudentStudent中的一個學(xué)生,中的一個學(xué)生,CnoCno代表代表CourseCourse中的一門課程。因此中的一門課程。因此SnoSno,CnoCno分別是對分別是對StudentStudent和和CourseCourse的參照引用。的參照引用。CREATE TABLE SC (Sno CHAR(7),Cno CHAR(4),Grade SMALLINT,PRIMARY KEY(Sno,Cno),/*在表級定義實體完整性*/FOREIGN KEY Sno REFERENCES Student(Sno),/*在表級定義參照完整性*/FOREIGN KEY Cno REFERENCES Course(Cno)/*在表級定義參照完整性*/);5.3.2參照完整性檢查和違約處理l定義了參照完整性,對參照表和被參照表進行修改操作有可能會破壞參定義了參照完整性,對參照表和被參照表進行修改操作有可能會破壞參照完整性,系統(tǒng)首先會檢查是否違反了參照完整性,如果違反了,則進照完整性,系統(tǒng)首先會檢查是否違反了參照完整性,如果違反了,則進行違約處理。違約處理的策略如下:行違約處理。違約處理的策略如下:p(1)(1)拒絕拒絕(NO ACTION)(NO ACTION)執(zhí)行。執(zhí)行。不允許該操作執(zhí)行,該策略一般設(shè)置為不允許該操作執(zhí)行,該策略一般設(shè)置為默認(rèn)默認(rèn)策略。策略。在被參照關(guān)系中刪除元組:在被參照關(guān)系中刪除元組:僅當(dāng)參照關(guān)系中沒有任何元組的外碼值與被參照關(guān)僅當(dāng)參照關(guān)系中沒有任何元組的外碼值與被參照關(guān)系中要刪除元組的主碼值相同時,系統(tǒng)才執(zhí)行刪除操作,否則拒絕此操作。系中要刪除元組的主碼值相同時,系統(tǒng)才執(zhí)行刪除操作,否則拒絕此操作。參照關(guān)系參照關(guān)系中可以隨意刪除元組。中可以隨意刪除元組。在參照關(guān)系中修改元組:在參照關(guān)系中修改元組:僅當(dāng)參照關(guān)系中修改后的元組的外碼值依然在被參照僅當(dāng)參照關(guān)系中修改后的元組的外碼值依然在被參照關(guān)系中,系統(tǒng)才執(zhí)行修改操作,否則拒絕該操作。關(guān)系中,系統(tǒng)才執(zhí)行修改操作,否則拒絕該操作。在被參照關(guān)系中修改元組:在被參照關(guān)系中修改元組:僅當(dāng)被參照關(guān)系中修改前的元組的主碼值沒有出現(xiàn)僅當(dāng)被參照關(guān)系中修改前的元組的主碼值沒有出現(xiàn)在參照關(guān)系的外碼中,系統(tǒng)才執(zhí)行修改操作,否則拒絕該操作。在參照關(guān)系的外碼中,系統(tǒng)才執(zhí)行修改操作,否則拒絕該操作。在參照關(guān)系中插入元組:在參照關(guān)系中插入元組:僅當(dāng)參照關(guān)系中插入的元組的外碼值等于被參照關(guān)系僅當(dāng)參照關(guān)系中插入的元組的外碼值等于被參照關(guān)系中某個元組的主碼值時,系統(tǒng)才執(zhí)行插入操作,否則拒絕該操作。中某個元組的主碼值時,系統(tǒng)才執(zhí)行插入操作,否則拒絕該操作。被參照關(guān)系被參照關(guān)系可以隨意插入新元組。可以隨意插入新元組。5.3.2參照完整性檢查和違約處理p(2)(2)級聯(lián)級聯(lián)(CASCADE)(CASCADE)操作。操作。當(dāng)刪除或修改被參照表的一個元組造成當(dāng)刪除或修改被參照表的一個元組造成了與參照表的不一致,則刪除或修改參照表中的所有造成不一致的了與參照表的不一致,則刪除或修改參照表中的所有造成不一致的元組。元組。級聯(lián)操作必須在定義外碼時給出顯式定義。級聯(lián)操作必須在定義外碼時給出顯式定義。p(3)(3)設(shè)置為空值設(shè)置為空值(SET NULL)(SET NULL)。當(dāng)刪除或修改被參照表的一個元組時當(dāng)刪除或修改被參照表的一個元組時造成了不一致,則將參照表中的所有造成不一致的元組的對應(yīng)屬性造成了不一致,則將參照表中的所有造成不一致的元組的對應(yīng)屬性設(shè)置為空值。設(shè)置為空值。p(4)(4)置空值刪除置空值刪除(NULLIFIES)(NULLIFIES)。刪除被參照關(guān)系的元組,并將參照刪除被參照關(guān)系的元組,并將參照關(guān)系中相應(yīng)元組的外碼值置空值。關(guān)系中相應(yīng)元組的外碼值置空值。主要內(nèi)容5.1 完整性概述5.3參照完整性5.4用戶自定義完整性5.2 實體完整性5.5 完整性約束的修改5.6 觸發(fā)器5.8 DBMS中的安全性保護5.9 SQL中的安全性機制5.7 安全性概述5.10 其它安全機制5.4用戶自定義完整性用戶自定義完整性就是針對某一具體應(yīng)用的數(shù)據(jù)必須滿足的語義用戶自定義完整性就是針對某一具體應(yīng)用的數(shù)據(jù)必須滿足的語義要求,由要求,由RDBMSRDBMS提供,而不必由應(yīng)用程序承擔(dān)。提供,而不必由應(yīng)用程序承擔(dān)。l5.4.1 5.4.1 屬性上的約束條件屬性上的約束條件在在CREATE TABLECREATE TABLE中定義屬性的同時可以根據(jù)應(yīng)用要求,定義中定義屬性的同時可以根據(jù)應(yīng)用要求,定義屬性上屬性上的約束條件,即的約束條件,即屬性值限制屬性值限制。當(dāng)往表中插入或修改屬性值時,系統(tǒng)。當(dāng)往表中插入或修改屬性值時,系統(tǒng)檢查是否滿足約束條件,如果不滿足,則拒絕相應(yīng)的操作。屬性上檢查是否滿足約束條件,如果不滿足,則拒絕相應(yīng)的操作。屬性上的約束主要包括:的約束主要包括:列值非空列值非空(NOT NULL(NOT NULL短語短語)列值唯一列值唯一(UNIQUE(UNIQUE短語短語)設(shè)置默認(rèn)值設(shè)置默認(rèn)值(DEFAULT(DEFAULT短語短語)檢查列值是否滿足一個布爾表達式檢查列值是否滿足一個布爾表達式(CHECK(CHECK短語短語)5.4.1 屬性上的約束條件 例例5-4 5-4 規(guī)定規(guī)定StudentStudent表的姓名屬性不能取空值。表的姓名屬性不能取空值。CREATE TABLE Student (Sno CHAR(7)PRIMARY KEY,Sname CHAR(8)NOT NULL,Ssex CHAR(2),Sage SMALLINT,Sdept CHAR(20);l1.不允許取空值NOT NULL約束指定在某一列上用戶不能輸入空值。5.4.1 屬性上的約束條件 例例5-5 5-5 規(guī)定規(guī)定StudentStudent表的姓名和性別兩個屬性的組合不能取表的姓名和性別兩個屬性的組合不能取重復(fù)值。重復(fù)值。CREATE TABLE Student (Sno CHAR(7)PRIMARY KEY,Sname CHAR(8),Ssex CHAR(2),Sage SMALLINT,Sdept CHAR(20),UNIQUE(Sname Ssex);l2.唯一值約束UNIQUE約束指定一列的值不能于該表另一行數(shù)據(jù)在該列上的值相同。5.4.1 屬性上的約束條件 例例 5-6 5-6 規(guī)定規(guī)定StudentStudent表的年齡默認(rèn)值是表的年齡默認(rèn)值是1818,不允許為空值。,不允許為空值。CREATE TABLE Student (Sno CHAR(7)PRIMARY KEY,Sname CHAR(8),Ssex CHAR(2),Sage SMALLINT DEFAULT 18 NOT NULL,Sdept CHAR(20),UNIQUE(Sname Ssex);l3.設(shè)置默認(rèn)值DEFAULT指定一列的默認(rèn)取值。5.4.1 屬性上的約束條件 例例5-7 Student5-7 Student表的表的SsexSsex只允許取只允許取“男男”或或“女女”。CREATE TABLE Student (Sno CHAR(7)PRIMARY KEY,Sname CHAR(8),Ssex CHAR(2)CHECK(Ssex IN(男,女),Sage SMALLINTDEFAULT 18 NOT NULL,Sdept CHAR(20),UNIQUE(Sname Ssex);當(dāng)當(dāng)往往表表中中插插入入元元組組或或修修改改屬屬性性的的值值時時,RDBMS就就檢檢查查屬屬性性上上的的約約束束條條件件是否被滿足,如果不滿足則操作被拒絕執(zhí)行。是否被滿足,如果不滿足則操作被拒絕執(zhí)行。l 4.檢查列值是否滿足某個表達式CHECK約束可以對一個屬性的值加以限制,只允許滿足條件的值輸入。5.4.2 元組上的約束條件 p 例例5-8 5-8 在學(xué)生表在學(xué)生表StudentStudent中定義,當(dāng)學(xué)生的性別是男時,其姓名中定義,當(dāng)學(xué)生的性別是男時,其姓名不能以張開頭。不能以張開頭。CREATE TABLE Student (Sno CHAR(7)PRIMARY KEY,Sname CHAR(8),Ssex CHAR(2)CHECK(Ssex IN(男男,女女),Sage SMALLINT,Sdept CHAR(20),CHECK(Ssex=男男 AND Sname NOT LIKE 張張%);元組上的約束可以設(shè)置不同屬性之間的取值的相互約束條件,它也是用短語CHECK引出的約束。插入元組或修改屬性的值時,RDBMS檢查元組上的約束條件是否被滿足,如果不滿足則操作被拒絕執(zhí)行。5.4.3域約束 lDBMSDBMS提供了一些標(biāo)準(zhǔn)的數(shù)據(jù)類型提供了一些標(biāo)準(zhǔn)的數(shù)據(jù)類型(域域),用戶可以使用它們說明屬性類型。,用戶可以使用它們說明屬性類型。域的定義允許用戶定義新的域,聲明一個域包括下面幾個方面:域的定義允許用戶定義新的域,聲明一個域包括下面幾個方面:(1)(1)域值類型。包括數(shù)據(jù)的類型、長度、單位、精度等,域值類型。包括數(shù)據(jù)的類型、長度、單位、精度等,(2)(2)缺省值。例如,可以規(guī)定缺省值。例如,可以規(guī)定StudentStudent表中的表中的SageSage屬性的缺省值為屬性的缺省值為2020。(3)(3)域值的格式。例如,可以規(guī)定日期的格式為:域值的格式。例如,可以規(guī)定日期的格式為:YYYY.MM.DDYYYY.MM.DD。(4)(4)對取值范圍或取值集合的約束。例如,可以規(guī)定性別域的取值集合為對取值范圍或取值集合的約束。例如,可以規(guī)定性別域的取值集合為男,女,學(xué)生成績域的取值范圍為男,女,學(xué)生成績域的取值范圍為0,1000,100。域完整性是保證數(shù)據(jù)庫字段取值的合理性。域完整性約束是最簡單、最基本的約束。一個屬性能否取空值由其語義決定。域約束使得新的值插入到數(shù)據(jù)庫中時,系統(tǒng)可根據(jù)約束對新插入的值進行完整性檢查。另外,域約束的恰當(dāng)定義還可以對查詢進行檢測,從而保證比較是有意義的。5.4.3域約束l1.創(chuàng)建域CREATE DOMAIN CREATE DOMAIN AS AS DEFAULT DEFAULT,;該語句創(chuàng)建了一個名為該語句創(chuàng)建了一個名為 的域,它的值類型由的域,它的值類型由“AS AS ”說明??蛇x說明??蛇x的的DEFAULTDEFAULT子句定義缺省值,子句定義缺省值,“缺省值缺省值”必須是域中的一個合法值必須是域中的一個合法值(滿足域約束滿足域約束)。注意:注意:每個域都包含一個特殊值每個域都包含一個特殊值NULL(NULL(空值空值),但是可以通過域約束排除空值。,但是可以通過域約束排除空值。域定義中可以包含零個或多個域定義中可以包含零個或多個(域約束域約束),用來約束域值的取值。每個,用來約束域值的取值。每個 具具有如下形式:有如下形式:CONSTRAINTCONSTRAINT CHECK(CHECK();可選短語可選短語“CONSTRAINTCONSTRAINT”為約束命名。為約束命名。的常見形式是涉及域值的布的常見形式是涉及域值的布爾表達式,其中域值用爾表達式,其中域值用VALUEVALUE表示。表示??蛇x的可選的“”可以是可以是NOT DEFERRABLE(NOT DEFERRABLE(不可延遲的不可延遲的)或或DEFERRABLE(DEFERRABLE(可延遲可延遲的的),缺省時為不可延遲,缺省時為不可延遲(約束立即檢查約束立即檢查)。5.4.3域約束l 例例5-95-9 對對StudentStudent表的屬性表的屬性SageSage創(chuàng)建域約束,設(shè)置其域名為創(chuàng)建域約束,設(shè)置其域名為SSageSSage,數(shù)據(jù)類型為數(shù)據(jù)類型為INTINT,默認(rèn)值為默認(rèn)值為2020,取值范圍為,取值范圍為18221822。CREATE DOMAIN SSage AS INTCREATE DOMAIN SSage AS INTCONSTRAINT Age CHECK(VALUE BETWEEN 18 AND 22);CONSTRAINT Age CHECK(VALUE BETWEEN 18 AND 22);5.4.3域約束l2.修改域約束 域約束可以進行修改,包括設(shè)置缺省值、刪除缺省值、添加約束和刪除約束。ALTER DOMAIN ALTER DOMAIN;其中可以是:(1)(1)SET DEFAULTSET DEFAULT。設(shè)置缺省值。設(shè)置缺省值。(2)(2)DROP DEFAULTDROP DEFAULT。刪除缺省值。刪除缺省值。(3)(3)ADD ADD 。添加域約束,其中。添加域約束,其中 與與CREATE DOMAINCREATE DOMAIN相同。相同。(4)(4)DROP CONSTRAINT DROP CONSTRAINT 。刪除。刪除 命名的域約束。命名的域約束。例例5-10 修改上例中的域修改上例中的域SSageSSage,取消其缺省值。,取消其缺省值。ALTER DOMAIN SSage SSage DROP DEFAULT;5.4.3域約束l3.刪除域 當(dāng)不需要某個域約束時,可以使用DROP DOMAIN語句將它刪除。語句格式為 DROP BOMAIN DROP BOMAIN CASCADE|RESTRICT;CASCADE|RESTRICT;其中CASCADE表示級聯(lián)刪除,RESTRICT表示受限刪除。聲明RESTRICT時,如果存在基于該域定義的列,則不能刪除。然而,聲明CASCADE時,與刪除模式和刪除基本表不同,域刪除后并不刪除依賴于該域定義的列,而是將列定義(包括類型、缺省值、約束)用定義域的標(biāo)準(zhǔn)類型取代。例例5-11 5-11 級聯(lián)刪除域級聯(lián)刪除域SSageSSage。DROP BOMAINDROP BOMAIN SSage CASCADE;SSage CASCADE;5.4.4 斷言約束 斷言約束方法使用一種約束定義語言來定義顯式約束,是一種形式化方法。約束定義語言通常是關(guān)系演算語言的變種。顯式約束的斷言定義方法是把約束集合和完整性驗證子系統(tǒng)嚴(yán)格分顯式約束的斷言定義方法是把約束集合和完整性驗證子系統(tǒng)嚴(yán)格分開。約束集合存儲在約束庫中,完整性驗證子系統(tǒng)則存取相應(yīng)約束庫開。約束集合存儲在約束庫中,完整性驗證子系統(tǒng)則存取相應(yīng)約束庫中的約束,然后將其應(yīng)用到相應(yīng)的數(shù)據(jù)庫更新事務(wù)中。中的約束,然后將其應(yīng)用到相應(yīng)的數(shù)據(jù)庫更新事務(wù)中。在顯式約束的斷言定義方法中,完整性約束被稱為完整性斷言或在顯式約束的斷言定義方法中,完整性約束被稱為完整性斷言或斷言,完整性約束定義語言又被稱為斷言定義語言。斷言,完整性約束定義語言又被稱為斷言定義語言。斷言定義方法已經(jīng)應(yīng)用于關(guān)系數(shù)據(jù)庫系統(tǒng),其語法格式為:斷言定義方法已經(jīng)應(yīng)用于關(guān)系數(shù)據(jù)庫系統(tǒng),其語法格式為:CREATE ASSERTION CREATE ASSERTION CHECK CHECK;5.4.4 斷言約束l 例例 5-12 5-12 定義一個斷言定義一個斷言ASSER_cASSER_c,要求每門課程最多要求每門課程最多5050名學(xué)生選修。名學(xué)生選修。CREAT ASSERTION ASSER_cCHECK(50=ALL(SELECT COUNT(SC.Sno)FROM S,SCWHERE S.sno=SC.sno GROUP BY Cno);使用斷言定義方法后,數(shù)據(jù)庫管理系統(tǒng)需要提供一個完整性控制子系統(tǒng)。完使用斷言定義方法后,數(shù)據(jù)庫管理系統(tǒng)需要提供一個完整性控制子系統(tǒng)。完整性控制子系統(tǒng)負(fù)責(zé)編譯完整性斷言,并將其存入數(shù)據(jù)庫管理系統(tǒng)的約束庫。整性控制子系統(tǒng)負(fù)責(zé)編譯完整性斷言,并將其存入數(shù)據(jù)庫管理系統(tǒng)的約束庫。當(dāng)一個事務(wù)執(zhí)行更新數(shù)據(jù)庫的操作時,完整性控制子系統(tǒng)自動從約束庫中讀當(dāng)一個事務(wù)執(zhí)行更新數(shù)據(jù)庫的操作時,完整性控制子系統(tǒng)自動從約束庫中讀取相應(yīng)的完整性斷言,驗證該事務(wù)是否違背完整性斷言以確保數(shù)據(jù)庫的完整取相應(yīng)的完整性斷言,驗證該事務(wù)是否違背完整性斷言以確保數(shù)據(jù)庫的完整性。性。這種方法簡化了數(shù)據(jù)庫更新事務(wù)的編寫,程序員不再需要考慮如何在事務(wù)中這種方法簡化了數(shù)據(jù)庫更新事務(wù)的編寫,程序員不再需要考慮如何在事務(wù)中編寫完整性驗證代碼,而且完整性約束發(fā)生變化時,相應(yīng)的事務(wù)代碼不需任編寫完整性驗證代碼,而且完整性約束發(fā)生變化時,相應(yīng)的事務(wù)代碼不需任何修改,但是這一技術(shù)實現(xiàn)復(fù)雜,系統(tǒng)開銷也很大。何修改,但是這一技術(shù)實現(xiàn)復(fù)雜,系統(tǒng)開銷也很大。主要內(nèi)容5.1 完整性概述5.3參照完整性5.4用戶自定義完整性5.2 實體完整性5.5 完整性約束的修改5.6 觸發(fā)器5.8 DBMS中的安全性保護5.9 SQL中的安全性機制5.7 安全性概述5.10 其它安全機制5.5 完整性約束的修改 為了可以靈活地增加、刪除一個完整性約束條件,為此為了可以靈活地增加、刪除一個完整性約束條件,為此SQLSQL還為還為CREATE TABLECREATE TABLE語句中提供了完整性約束條件命名子句語句中提供了完整性約束條件命名子句CONSTRAINTCONSTRAINT,用用來對完整性約束條件命名。來對完整性約束條件命名。l5.5.1 5.5.1 完整性約束命名完整性約束命名 CONSTRAINTCONSTRAINT PRIMARY KEY PRIMARY KEY 短語短語|FOREIGN KEYFOREIGN KEY短語短語|CHECKCHECK短語短語 例例5-13 5-13 將將StudentStudent表的碼約束條件命名為表的碼約束條件命名為StudentKeyStudentKey。CREATE TABLE Student (Sno CHAR(7),SnameCHAR(8)NOT NULL,SsexCHAR(2),Sage SMALLINT,Sdept CHAR(20),CONSTRAINT StudentKey PRIMARY KEY(Sno);5.5.1 完整性約束命名l 例例5-14 5-14 建立教師表建立教師表TeacherTeacher,要求姓名不能取空值,年齡小于,要求姓名不能取空值,年齡小于5555歲,歲,性別只能是性別只能是“男男”或或“女女”。每個教師的實發(fā)工資不低于。每個教師的實發(fā)工資不低于30003000元,實元,實發(fā)工資實際上就是應(yīng)發(fā)工資列發(fā)工資實際上就是應(yīng)發(fā)工資列SalSal與扣除項與扣除項DeductDeduct之差。之差。CREATE TABLE Teacher(Tno NUMERIC(4)PRIMARY KEY,Tname CHAR(10),CONSTRAINT C1 NOT NULL,Tage NUMERIC(3),CONSTRAINT C2 CHECK(Tage=3000);5.5.2 修改完整性約束 我們可以使用我們可以使用ALTER TABLEALTER TABLE語句修改表中的完整性限制,通過關(guān)鍵語句修改表中的完整性限制,通過關(guān)鍵字字ADDADD來增加一個完整性約束條件,或使用關(guān)鍵字來增加一個完整性約束條件,或使用關(guān)鍵字DROPDROP來刪除原有的約來刪除原有的約束條件。束條件。l 例例5-15 5-15 增加表增加表StudentStudent中中SsexSsex只能取只能取男男和和女女的約束。的約束。ALTER TABLE StudentALTER TABLE Student ADD CONSTRAINT GenderCHECK(Ssex IN(ADD CONSTRAINT GenderCHECK(Ssex IN(男男,女女););l 例例5-16 5-16 去掉表去掉表TeacherTeacher中對性別的限制。中對性別的限制。ALTER TABLE TeacherALTER TABLE Teacher DROP CONSTRAINT C3;DROP CONSTRAINT C3;l 例例5-17 5-17 修改表修改表TeacherTeacher中的約束條件,年齡小于中的約束條件,年齡小于5555歲改成小于歲改成小于6060。ALTER TABLE TeacherALTER TABLE Teacher DROP CONSTRAINT C2;DROP CONSTRAINT C2;ALTER TABLE TeacherALTER TABLE Teacher ADD CONSTRAINT C5 CHECK(Tage 60);ADD CONSTRAINT C5 CHECK(Tage 60);主要內(nèi)容5.1 完整性概述5.3參照完整性5.4用戶自定義完整性5.2 實體完整性5.5 完整性約束的修改5.6 觸發(fā)器5.8 DBMS中的安全性保護5.9 SQL中的安全性機制5.7 安全性概述5.10 其它安全機制5.6 觸發(fā)器 l觸發(fā)器主要有以下優(yōu)點:觸發(fā)器主要有以下優(yōu)點:觸發(fā)器是觸發(fā)器是自動的自動的,在對表的數(shù)據(jù)作了修改之后立即被激活。,在對表的數(shù)據(jù)作了修改之后立即被激活。觸發(fā)器可以實現(xiàn)數(shù)據(jù)庫中相關(guān)表的觸發(fā)器可以實現(xiàn)數(shù)據(jù)庫中相關(guān)表的級聯(lián)修改級聯(lián)修改。觸發(fā)器能實現(xiàn)比觸發(fā)器能實現(xiàn)比CHECKCHECK語句更為語句更為復(fù)雜的約束復(fù)雜的約束。觸發(fā)器能提供數(shù)據(jù)庫修改前后數(shù)據(jù)變化的觸發(fā)器能提供數(shù)據(jù)庫修改前后數(shù)據(jù)變化的前后狀態(tài)前后狀態(tài)。觸發(fā)器能維護觸發(fā)器能維護非規(guī)范化數(shù)據(jù)非規(guī)范化數(shù)據(jù)。非規(guī)范化數(shù)據(jù)是指在表中派生的、冗余的數(shù)據(jù)。非規(guī)范化數(shù)據(jù)是指在表中派生的、冗余的數(shù)據(jù)值。維護非規(guī)范化數(shù)據(jù)保證了數(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ā)器SQLSQL使用使用CREATE TRIGGERCREATE TRIGGER命令建立觸發(fā)器,其一般格式為命令建立觸發(fā)器,其一般格式為CREATE TRIGGER CREATE TRIGGER BEFORE|AFTER|INSTEAD OFBEFORE|AFTER|INSTEAD OF ONON FOR EACHROW|STATEMENTFOR EACHROW|STATEMENT WHEN WHEN ;觸發(fā)器名在數(shù)據(jù)庫中必須是唯一的。觸發(fā)器名在數(shù)據(jù)庫中必須是唯一的。ON子句子句用于指定在其上執(zhí)行觸發(fā)器的表名或者是視圖名。用于指定在其上執(zhí)行觸發(fā)器的表名或者是視圖名。AFTER:在在觸觸發(fā)發(fā)事事件件完完成成之之后后,測測試試WHEN條條件件是是否否滿滿足足,若若滿滿足足則則執(zhí)行動作部分的操作。執(zhí)行動作部分的操作。BEFORE:在在觸觸發(fā)發(fā)事事件件進進行行以以前前,測測試試WHEN條條件件是是否否滿滿足足。若若滿滿足足則先執(zhí)行動作部分的操作,然后再執(zhí)行觸發(fā)事件的操作。則先執(zhí)行動作部分的操作,然后再執(zhí)行觸發(fā)事件的操作。5.6.1 定義觸發(fā)器 INSTEAD INSTEAD OFOF:在在觸觸發(fā)發(fā)事事件件發(fā)發(fā)生生時時,只只要要滿滿足足WHENWHEN條條件件,就就執(zhí)執(zhí)行行動動作作部部分分的的操作,而觸發(fā)事件的操作不再執(zhí)行。操作,而觸發(fā)事件的操作不再執(zhí)行。INSERTINSERT、DELETEDELETE和和UPDATEUPDATE是是觸觸發(fā)發(fā)事事件件,若若同同時時有有兩兩個個以以上上觸觸發(fā)發(fā)事事件件,則則各各操作之間用逗號分隔。操作之間用逗號分隔。元元組組級級(行行級級)觸觸發(fā)發(fā)器器帶帶有有“FOR FOR EACH EACH ROW”ROW”子子句句,表表示示對對每每一一個個修修改改的的元元組組都都要要檢檢查查一一次次。語語句句級級觸觸發(fā)發(fā)器器不不帶帶有有“FOR FOR EACH EACH ROW”ROW”子子句句,只只檢檢查查一一次次SQLSQL語句執(zhí)行的結(jié)果。語句執(zhí)行的結(jié)果。觸觸發(fā)發(fā)動動作作體體既既可可以以是是匿匿名名PL/SQLPL/SQL過過程程塊塊,也也可可以以是是對對已已建建立立存存儲儲過過程程的的調(diào)調(diào)用用。如如果果是是行行級級觸觸發(fā)發(fā)器器,在在兩兩種種情情況況下下,用用戶戶都都可可以以在在過過程程體體中中使使用用NEWNEW和和OLDOLD引引用用UPDATE/INSERTUPDATE/INSERT事事件件之之后后的的新新值值和和UPDATE/DELETEUPDATE/DELETE事事件件之之前前的的舊舊值值。如如果果是是語語句句級級觸觸發(fā)發(fā)器器,則則不不能能在在觸觸發(fā)發(fā)動動作作體體中中使使用用NEWNEW和和OLDOLD進進行行引引用用。如如果果觸觸發(fā)發(fā)動動作作體體執(zhí)執(zhí)行行失失敗敗,激激活活觸觸發(fā)發(fā)器器的的事事件件就就會會終終止止執(zhí)執(zhí)行行,觸觸發(fā)發(fā)器器的的目目標(biāo)標(biāo)表表或或觸觸發(fā)發(fā)器器可可能能影響的其它對象不發(fā)生任何變化。影響的其它對象不發(fā)生任何變化。5.6.1 定義觸發(fā)器l創(chuàng)建觸發(fā)器時,我們還需要注意以下幾點:創(chuàng)建觸發(fā)器時,我們還需要注意以下幾點:p(1)(1)在一個表上可以建立在一個表上可以建立多個多個名稱不同、類型各異的觸發(fā)器,每個觸發(fā)器名稱不同、類型各異的觸發(fā)器,每個觸發(fā)器可由可由INSERTINSERT、DELETEDELETE和和UPDATEUPDATE三個操作來引發(fā)。對于三個操作來引發(fā)。對于AFTERAFTER型型的觸發(fā)器,的觸發(fā)器,可以在同一種操作上建立可以在同一種操作上建立多個多個觸發(fā)器;對于觸發(fā)器;對于INSTEAD OFINSTEAD OF型的觸發(fā)器,在同型的觸發(fā)器,在同一種操作上只能建立一種操作上只能建立一個一個觸發(fā)器。觸發(fā)器。p(2)(2)大部分大部分SQLSQL語句都可用在觸發(fā)器中,但也有一些限制。例如,所有的語句都可用在觸發(fā)器中,但也有一些限制。例如,所有的創(chuàng)建和更改數(shù)據(jù)庫以及數(shù)據(jù)庫對象的語句、所有的創(chuàng)建和更改數(shù)據(jù)庫以及數(shù)據(jù)庫對象的語句、所有的DROPDROP語句都語句都不允許不允許在觸在觸發(fā)器中使用。發(fā)器中使用。p(3)(3)在觸發(fā)器中可以使用兩個特殊的在觸發(fā)器中可以使用兩個特殊的臨時表:臨時表:INSERTEDINSERTED和和DELETEDDELETED表表,這,這兩個表的結(jié)構(gòu)同建立觸發(fā)器的表的結(jié)構(gòu)完全相同,而且這兩個臨時表只能兩個表的結(jié)構(gòu)同建立觸發(fā)器的表的結(jié)構(gòu)完全相同,而且這兩個臨時表只能用在觸發(fā)器代碼中。用在觸發(fā)器代碼中。INSERTEDINSERTED表保存了表保存了INSERTINSERT操作插入的數(shù)據(jù)和操作插入的數(shù)據(jù)和UPDATEUPDATE操操作中更新后的數(shù)據(jù)。作中更新后的數(shù)據(jù)。DELETEDDELETED保存了保存了DELETEDELETE操作中被刪除的數(shù)據(jù)和操作中被刪除的數(shù)據(jù)和UPDATEUPDATE操作中更新前的數(shù)據(jù)。操作中更新前的數(shù)據(jù)。在觸發(fā)器中對這兩個臨時表的使用方法同一般基本在觸發(fā)器中對這兩個臨時表的使用方法同一般基本表一樣,可以通過這兩個臨時表記錄的數(shù)據(jù)來判斷所進行的操作是否符合表一樣,可以通過這兩個臨時表記錄的數(shù)據(jù)來判斷所進行的操作是否符合約束。約束。5.6.1 定義觸發(fā)器l 例例5-18 5-18 定義一個定義一個BEFOREBEFORE行級觸發(fā)器,為教師表行級觸發(fā)器,為教師表TeacherTeacher定義完整性規(guī)則定義完整性規(guī)則“教授的工資不得低于教授的工資不得低于35003500元,如果低于元,如果低于35003500元,自動改成元,自動改成35003500元元”。CREATE TRIGGER T1 CREATE TRIGGER T1 /*/*在教師表在教師表TeacherTeacher上定義觸發(fā)器上定義觸發(fā)器*/BEFORE INSERT OR UPDATE ON Teacher BEFORE INSERT OR UPDATE ON Teacher /*/*觸發(fā)事件是插入或更新操作觸發(fā)事件是插入或更新操作*/FOR EACH ROW FOR EACH ROW /*/*這是行級觸發(fā)器這是行級觸發(fā)器*/AS BEGIN AS BEGIN /*/*定義觸發(fā)動作體,這是一個定義觸發(fā)動作體,這是一個PL/SQLPL/SQL過程塊過程塊*/IF(NEW.Job=IF(NEW.Job=教授教授)AND(NEW.Sal 3500)THEN NEW.Sal:=3500 AND(NEW.Sal 3500)THEN NEW.Sal:=3500 /*/*因為是行級觸發(fā)器,可在過程體中使用插入或更新操作后的新值因為是行級觸發(fā)器,可在過程體中使用插入或更新操作后的新值*/END IF;END IF;END;END;/*/*觸發(fā)動作體結(jié)束觸發(fā)動作體結(jié)束*/5.6.1 定義觸發(fā)器l 例例5-19 5-19 定義定義AFTERAFTER行級觸發(fā)器,行級觸發(fā)器,當(dāng)教師表當(dāng)教師表TeacherTeacher的工資發(fā)生變的工資發(fā)生變化后就自動在工資變化表化后就自動在工資變化表Sal_logSal_log中增加一條相應(yīng)記錄。中增加一條相應(yīng)記錄。首先建立工資變化表首先建立工資變化表Sal_logSal_log。CREATE TABLE Sal_log CREATE TABLE Sal_log (Tno NUMERIC(4)(Tno NUMERIC(4)REFERENCES teacher(Tno)REFERENCES teacher(Tno),Sal NUMERIC(7,2),Sal NUMERIC(7,2),Username char(10),Username char(10),Date TIMESTAMP Date TIMESTAMP););CREATE TRIGGER Insert_Sal /*建立了一個觸發(fā)器建立了一個觸發(fā)器*/AFTER INSFRT ON Teacher /*觸發(fā)事件是觸發(fā)事件是INSERT*/FOR EACH ROW AS BEGIN INSERT INTO Sal_log VALUES(NEW.Tno,NEW.Sal,CURRENT_USER,CURRENT_TIMESTAMP);END;CREATE TRIGGER Update_Sal /*建立了一個觸發(fā)器建立了一個觸發(fā)器*/AFTER UPDATE ON Teacher /*觸發(fā)事件是觸發(fā)事件是UPDATE*/FOR EACH ROW AS BEGINIF (NEW.Sal OLD.Sal)THEN INSERT INTO Sal_log VALUES(NEW.Tno,NEW.Sal,CURRENT_USER,CURRENT_TIMESTAMP);END IF;END;5.6.2 激活觸發(fā)器 觸發(fā)事件激活觸發(fā)器,并由數(shù)據(jù)庫服務(wù)器自動執(zhí)行。在一個數(shù)據(jù)觸發(fā)事件激活觸發(fā)器,并由數(shù)據(jù)庫服務(wù)器自動執(zhí)行。在一個數(shù)據(jù)表上可以定義多個觸發(fā)器,比如多個表上可以定義多個觸發(fā)器,比如多個BEFOREBEFORE觸發(fā)器,多個觸發(fā)器,多個AFTERAFTER觸發(fā)器觸發(fā)器等。同一表上的多個觸發(fā)器激活時遵循以下執(zhí)行順序:等。同一表上的多個觸發(fā)器激活時遵循以下執(zhí)行順序:(1)(1)執(zhí)行該表上的執(zhí)行該表上的BEROREBERORE觸發(fā)器;觸發(fā)器;(2)(2)激活觸發(fā)器的激活觸發(fā)器的SQLSQL語句;語句;(3)(3)執(zhí)行該表上的
收藏