第5章數(shù)據(jù)庫系統(tǒng)概論(第4版)課件_第1頁
第5章數(shù)據(jù)庫系統(tǒng)概論(第4版)課件_第2頁
第5章數(shù)據(jù)庫系統(tǒng)概論(第4版)課件_第3頁
第5章數(shù)據(jù)庫系統(tǒng)概論(第4版)課件_第4頁
第5章數(shù)據(jù)庫系統(tǒng)概論(第4版)課件_第5頁
已閱讀5頁,還剩125頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

本章目標(biāo):掌握數(shù)據(jù)庫的完整性概念,以及用SQL語言定義關(guān)系模式的完整性約束條件。第五章數(shù)據(jù)庫完整性12/16/2022本章目標(biāo):掌握數(shù)據(jù)庫的完整性概念,以及用SQL語言第五章數(shù)據(jù)庫完整性5.1實(shí)體完整性5.2參照完整性5.3用戶自定義完整性5.4完整性約束命名子句5.5域中的完整性限制5.6觸發(fā)器5.7小結(jié)2第五章數(shù)據(jù)庫完整性5.1實(shí)體完整性2重點(diǎn)和難點(diǎn)重點(diǎn):掌握DBMS完整性控制機(jī)制的三個(gè)方面,即完整性約束條件的定義、檢查和違約處理。用SQL語言定義關(guān)系模式的完整性約束條件。包括定義主碼、參照完整性;定義與應(yīng)用有關(guān)的完整性。難點(diǎn):如何實(shí)現(xiàn)完整性的策略,以確保數(shù)據(jù)的正確與有效。較復(fù)雜的是參照完整性的實(shí)現(xiàn)機(jī)制。3重點(diǎn)和難點(diǎn)重點(diǎn):3數(shù)據(jù)庫完整性數(shù)據(jù)庫的完整性數(shù)據(jù)的正確性和相容性數(shù)據(jù)的完整性和安全性是兩個(gè)不同概念數(shù)據(jù)的完整性防止數(shù)據(jù)庫中存在不正確的數(shù)據(jù)防范對(duì)象:不合語義的、不正確的數(shù)據(jù)數(shù)據(jù)的安全性防止惡意的破壞和非法的存取防范對(duì)象:非法用戶和非法操作4數(shù)據(jù)庫完整性數(shù)據(jù)庫的完整性4數(shù)據(jù)庫完整性(續(xù))為維護(hù)數(shù)據(jù)庫的完整性,DBMS必須:提供定義完整性約束條件的機(jī)制提供完整性檢查的方法違約處理----目前商用的DBMS產(chǎn)品都支持完整性控制本章重點(diǎn)講解SQL語言中實(shí)現(xiàn)完整性控制功能的方法5數(shù)據(jù)庫完整性(續(xù))為維護(hù)數(shù)據(jù)庫的完整性,DBMS必須:55.1實(shí)體完整性5.1.1實(shí)體完整性定義5.1.2實(shí)體完整性檢查和違約處理65.1實(shí)體完整性5.1.1實(shí)體完整性定義65.1.1實(shí)體完整性定義關(guān)系模型的實(shí)體完整性CREATETABLE中用PRIMARYKEY定義單屬性構(gòu)成的碼有兩種定義方法

定義為列級(jí)約束條件定義為表級(jí)約束條件對(duì)多個(gè)屬性構(gòu)成的碼只有一種定義方法定義為表級(jí)約束條件75.1.1實(shí)體完整性定義關(guān)系模型的實(shí)體完整性7實(shí)體完整性定義(續(xù))[例1]將Student表中的Sno屬性定義為碼在列級(jí)定義主碼:在屬性后增加關(guān)鍵字CREATETABLEStudent(SnoCHAR(9)PRIMARYKEY,SnameCHAR(20)NOTNULL,SsexCHAR(2),SageSMALLINT,SdeptCHAR(20));8實(shí)體完整性定義(續(xù))[例1]將Student表中的Sno屬性實(shí)體完整性定義(續(xù))在表級(jí)定義主碼:在屬性表中加入額外的定義主碼的子句:PRIMARYKEY(主碼屬性名表)

CREATETABLEStudent(SnoCHAR(9),SnameCHAR(20)NOTNULL,SsexCHAR(2),SageSMALLINT,SdeptCHAR(20),

PRIMARYKEY(Sno));9實(shí)體完整性定義(續(xù))在表級(jí)定義主碼:在屬性表中加入額外的定義實(shí)體完整性定義(續(xù))[例2]將SC表中的Sno,Cno屬性組定義為碼CREATETABLESC(SnoCHAR(9)NOTNULL,CnoCHAR(4)NOTNULL,GradeSMALLINT,

PRIMARYKEY(Sno,Cno)

/*只能在表級(jí)定義主碼*/);10實(shí)體完整性定義(續(xù))[例2]將SC表中的Sno,Cno屬性組5.1.2實(shí)體完整性檢查和違約處理插入或?qū)χ鞔a列進(jìn)行更新操作時(shí),RDBMS按照實(shí)體完整性規(guī)則自動(dòng)進(jìn)行檢查。包括:檢查主碼值是否唯一,不唯一則拒絕檢查主碼的各個(gè)屬性是否為空,只要有一個(gè)為空就拒絕檢查記錄中主碼值是否唯一的方法:全表掃描提高實(shí)體完整性檢查效率的方法:索引115.1.2實(shí)體完整性檢查和違約處理插入或?qū)χ鞔a列進(jìn)行更新操5.2參照完整性5.2.1參照完整性定義5.2.2參照完整性檢查和違約處理125.2參照完整性5.2.1參照完整性定義125.2.1參照完整性定義關(guān)系模型的參照完整性定義在CREATETABLE中用FOREIGNKEY短語定義哪些列為外碼用REFERENCES短語指明這些外碼參照哪些表的主碼135.2.1參照完整性定義關(guān)系模型的參照完整性定義13參照完整性定義(例)關(guān)系SC:(Sno,Cno)是主碼。Sno,Cno分別參照引用Student表的主碼和Course表的主碼[例3]定義SC中的參照完整性CREATETABLESC(SnoCHAR(9)NOTNULL,CnoCHAR(4)NOTNULL,

GradeSMALLINT,PRIMARYKEY(Sno,Cno),

FOREIGNKEY(Sno)REFERENCESStudent(Sno),

/*在表級(jí)定義參照完整性*/

FOREIGNKEY(Cno)REFERENCESCourse(Cno)

/*在表級(jí)定義參照完整性*/);14參照完整性定義(例)關(guān)系SC:(Sno,Cno)是主碼。Sn5.2.2參照完整性檢查和違約處理參照完整性:將兩個(gè)表中的相應(yīng)元組聯(lián)系起來可能破壞參照完整性的操作:對(duì)參照表和被參照表的增、刪、改155.2.2參照完整性檢查和違約處理參照完整性:將兩個(gè)表中的參照完整性檢查和違約處理[例]對(duì)表SC和Student,可能破壞參照完整性的操作情況SC表增加一個(gè)元組修改SC表的一個(gè)元組從Student表刪除一個(gè)元組修改Student表中一個(gè)元組的Sno屬性值16參照完整性檢查和違約處理[例]對(duì)表SC和Student,可能參照完整性檢查和違約處理[練習(xí)]對(duì)表SC和Course,可能破壞參照完整性的操作情況SC表增加一個(gè)元組修改SC表的一個(gè)元組從Course表刪除一個(gè)元組修改Course表中一個(gè)元組的Cno屬性值17參照完整性檢查和違約處理[練習(xí)]對(duì)表SC和Course,可能參照完整性檢查和違約處理可能破壞參照完整性的情況及違約處理被參照表

(例如Student)參照表

(例如SC)違約

處理可能破壞

參照完整性

插入元組拒絕可能破壞

參照完整性

修改外碼值拒絕刪除元組可能破壞

參照完整性拒絕/級(jí)連刪除/設(shè)置為空值修改主碼值可能破壞

參照完整性拒絕/級(jí)連修改/設(shè)置為空值18參照完整性檢查和違約處理可能破壞參照完整性的情況及違約處理被違約處理參照完整性違約處理拒絕(NOACTION)執(zhí)行默認(rèn)策略級(jí)聯(lián)(CASCADE)操作刪除/修改被參照表的某元組時(shí),則刪除/修改參照表中不一致的元組設(shè)置為空值(SET-NULL)刪除/修改被參照表的某元組時(shí),則設(shè)置參照表中不一致的元組的對(duì)應(yīng)屬性為空值19違約處理參照完整性違約處理19違約處理設(shè)置為空值(SET-NULL)對(duì)于參照完整性,除了應(yīng)該定義外碼,還應(yīng)定義外碼列是否允許空值當(dāng)參照表與被參照表的操作違反了參照完整性時(shí)系統(tǒng)選用默認(rèn)策略,即拒絕執(zhí)行若想讓系統(tǒng)采取其他策略,必須在創(chuàng)建表時(shí)顯式地說明20違約處理設(shè)置為空值(SET-NULL)20在主表中修改主碼例例:將S關(guān)系中Sno=950001的元組中Sno值改為960123。設(shè)SC關(guān)系中有4個(gè)元組的Sno=950001級(jí)聯(lián)修改:將SC關(guān)系中4個(gè)Sno=950001元組中的Sno值也改為960123。若參照關(guān)系同時(shí)又是另一關(guān)系的被參照關(guān)系,則修改操作會(huì)繼續(xù)級(jí)聯(lián)下去21在主表中修改主碼例例:將S關(guān)系中Sno=950001的元組中在主表中修改主碼例受限修改:只有當(dāng)SC中沒有任何元組的Sno=950001時(shí),才能修改S表中Sno=950001的元組的Sno值(改為960123)置空值修改:將S表中Sno=950001的元組的Sno值改為960123,而將SC表中所有Sno=950001的元組的Sno值置為空值。在學(xué)生選課數(shù)據(jù)庫中只有前二種方法是正確的(級(jí)聯(lián)修改、受限修改)22在主表中修改主碼例受限修改:只有當(dāng)SC中沒有任何元組的Sno違約處理(續(xù))[例4]顯式說明參照完整性違約處理示例CREATETABLESC

(SnoCHAR(9)NOTNULL,CnoCHAR(4)NOTNULL,

GradeSMALLINT,PRIMARYKEY(Sno,Cno),

FOREIGNKEY(Sno)REFERENCESStudent(Sno)

ONDELETECASCADE

/*級(jí)聯(lián)刪除SC表中相應(yīng)的元組*/

ONUPDATECASCADE,

/*級(jí)聯(lián)更新SC表中相應(yīng)的元組*/

FOREIGNKEY(Cno)REFERENCESCourse(Cno)

ONDELETENOACTION

/*當(dāng)刪除course表中的元組造成了與SC表不一致時(shí)拒絕刪除*/

ONUPDATECASCADE

/*當(dāng)更新course表中的cno時(shí),級(jí)聯(lián)更新SC表中相應(yīng)的元組*/)23違約處理(續(xù))[例4]顯式說明參照完整性違約處理示例23ONDELETECASCADE----級(jí)連刪除DELETEFROMSCWHERESno='1‘則只刪除SC的一條記錄,Student表的相應(yīng)記錄不會(huì)被刪除DELETEFROMStudentWHERESno='1‘不但刪除Student的一條記錄,而且表SC中Sno=‘1‘同學(xué)的所有選修記錄也會(huì)被級(jí)連刪除24ONDELETECASCADE----級(jí)連刪除DELET5.3用戶定義的完整性用戶定義的完整性就是針對(duì)某一具體應(yīng)用的數(shù)據(jù)必須滿足的語義要求RDBMS提供定義和檢驗(yàn)機(jī)制,而不必由應(yīng)用程序承擔(dān)255.3用戶定義的完整性用戶定義的完整性就是針對(duì)某一具體應(yīng)用5.3用戶定義的完整性5.3.1屬性上的約束條件的定義5.3.2屬性上的約束條件檢查和違約處理5.3.3元組上的約束條件的定義5.3.4元組上的約束條件檢查和違約處理265.3用戶定義的完整性5.3.1屬性上的約束條件的定義25.3.1屬性上的約束條件的定義CREATETABLE時(shí)定義列值非空(NOTNULL)列值唯一(UNIQUE)檢查列值是否滿足一個(gè)布爾表達(dá)式(CHECK)275.3.1屬性上的約束條件的定義CREATETABLE時(shí)屬性上的約束條件的定義(續(xù))1.不允許取空值

[例5]定義SC表時(shí),說明Sno、Cno、Grade屬性不允許取空值。CREATETABLESC(SnoCHAR(9)NOTNULL, CnoCHAR(4)NOTNULL, GradeSMALLINTNOTNULL, PRIMARYKEY(Sno,Cno)/*如果在表級(jí)定義實(shí)體完整性,隱含了Sno,Cno不允許取空值,則在列級(jí)不允許取空值的定義就不必寫了*/);

CREATETABLESC(SnoCHAR(9), CnoCHAR(4), GradeSMALLINTNOTNULL, PRIMARYKEY(Sno,Cno));

28屬性上的約束條件的定義(續(xù))1.不允許取空值[例5]定義S屬性上的約束條件的定義(續(xù))2.列值唯一

[例6]建立部門表DEPT,要求部門名稱Dname屬性列取值唯一,部門編號(hào)Deptno屬性列為主碼CREATETABLEDEPT

(DeptnoNUMERIC(2),

DnameCHAR(9)UNIQUE,/*要求Dname列值唯一*/

LocationCHAR(10),

PRIMARYKEY(Deptno));29屬性上的約束條件的定義(續(xù))2.列值唯一29屬性上的約束條件的定義(續(xù))3.用CHECK短語指定列值應(yīng)滿足的條件[例7]Student表的Ssex只允許取“男”或“女”CREATETABLEStudent

(SnoCHAR(9)PRIMARYKEY,

SnameCHAR(8)NOTNULL,

SsexCHAR(2)CHECK(SsexIN(‘男’,‘女’)),

/*性別屬性Ssex只允許取'男'或'女'*/

SageSMALLINT,

SdeptCHAR(20));30屬性上的約束條件的定義(續(xù))3.用CHECK短語指定列值應(yīng)滿屬性上的約束條件的定義(續(xù))[例8]SC表的Grade只允許取0-100的數(shù)字

CREATETABLESC(SnoCHAR(9),CnoCHAR(4)NOTNULL,GradeSMALLINTCHECK(Grade>=0ANDGrade<=100),

/*Grade屬性只允許取0-100的數(shù)字*/PRIMARYKEY(Sno,Cno),FOREIGNKEY(Sno)REFERENCESStudent(Sno),FOREIGNKEY(Cno)REFERENCESCourse(Cno))31屬性上的約束條件的定義(續(xù))[例8]SC表的Grade只允許5.3.2屬性上的約束條件檢查和違約處理插入元組或修改屬性的值時(shí),RDBMS檢查屬性上的約束條件是否被滿足如果不滿足則操作被拒絕執(zhí)行325.3.2屬性上的約束條件檢查和違約處理插入元組或修改屬性5.3.3元組上的約束條件的定義在CREATETABLE時(shí)可以用CHECK短語定義元組上的約束條件,即元組級(jí)的限制同屬性值限制相比,元組級(jí)的限制可以設(shè)置不同屬性之間取值的相互約束條件335.3.3元組上的約束條件的定義在CREATETABLE元組上的約束條件的定義(續(xù))[例9]當(dāng)學(xué)生的性別是男時(shí),其名字不能以Ms.打頭

CREATETABLEStudent(SnoCHAR(9),SnameCHAR(8)NOTNULL,SsexCHAR(2),SageSMALLINT,SdeptCHAR(20),PRIMARYKEY(Sno),

CHECK(Ssex='女'ORSnameNOTLIKE'Ms.%')

/*定義了元組中Sname和Ssex兩個(gè)屬性值之間的約束條件*/)性別是女性的元組都能通過該項(xiàng)檢查;當(dāng)性別是男性時(shí),則名字一定不能以Ms.打頭,才能通過檢查34元組上的約束條件的定義(續(xù))[例9]當(dāng)學(xué)生的性別是男時(shí),其名5.3.4元組上的約束條件檢查和違約處理插入元組或修改屬性的值時(shí),RDBMS檢查元組上的約束條件是否被滿足如果不滿足則操作被拒絕執(zhí)行355.3.4元組上的約束條件檢查和違約處理插入元組或修改屬性5.4完整性約束命名子句完整性約束命名:CONSTRAINT約束子句CONSTRAINT<完整性約束條件名>[PRIMARYKEY短語|FOREIGNKEY短語|CHECK短語]365.4完整性約束命名子句完整性約束命名:CONSTRAIN完整性約束命名子句(續(xù))[例10]建立學(xué)生登記表Student,要求學(xué)號(hào)在90000-99999之間,姓名不能取空值,年齡小于30,性別只能是“男”或“女”。CREATETABLEStudent(SnoNUMERIC(6)CONSTRAINTC1

CHECK(SnoBETWEEN90000AND99999),SnameCHAR(20)CONSTRAINTC2NOTNULL,SageNUMERIC(3)CONSTRAINTC3CHECK(Sage<30),SsexCHAR(2)CONSTRAINTC4CHECK(SsexIN('男','女')),

CONSTRAINTStudentKeyPRIMARYKEY(Sno))在Student表上建立了5個(gè)約束條件,包括主碼約束(命名為StudentKey)以及C1、C2、C3、C4四個(gè)列級(jí)約束。37完整性約束命名子句(續(xù))[例10]建立學(xué)生登記表Studen完整性約束命名子句(續(xù))修改表中的完整性限制:ALTERTABLE語句增加新的約束條件(ADD)修改表中的完整性限制(DROP-ADD)先刪除原來的約束條件(DROP)再增加新的約束條件(ADD)刪除表中原有的完整性限制(DROP)38完整性約束命名子句(續(xù))修改表中的完整性限制:ALTERT完整性約束命名子句(續(xù))[例13]修改表Student中的約束條件,要求學(xué)號(hào)改為在900000-999999之間,年齡由小于30改為小于40可先刪除原來的約束條件,再增加新的約束條件ALTERTABLEStudentDROPCONSTRAINTC1;ALTERTABLEStudentADDCONSTRAINTC1

CHECK(SnoBETWEEN900000AND999999),ALTERTABLEStudentDROPCONSTRAINTC3;ALTERTABLEStudentADDCONSTRAINTC3

CHECK(Sage<40);39完整性約束命名子句(續(xù))[例13]修改表Student中的約數(shù)據(jù)完整性小結(jié)數(shù)據(jù)庫的完整性是為了保證數(shù)據(jù)庫中存儲(chǔ)的數(shù)據(jù)是正確的RDBMS完整性實(shí)現(xiàn)的機(jī)制完整性約束定義機(jī)制完整性檢查機(jī)制違背完整性約束條件時(shí)RDBMS應(yīng)采取的動(dòng)作40數(shù)據(jù)完整性小結(jié)數(shù)據(jù)庫的完整性是為了保證數(shù)據(jù)庫中存儲(chǔ)的數(shù)據(jù)是正數(shù)據(jù)完整性小結(jié)(續(xù))完整性約束的用途:限制輸入到數(shù)據(jù)庫表中的值的范圍SQLServer根據(jù)不同用途提供了多種約束PRIMARY(主鍵)約束FOREIGN(外鍵)約束UNIQUE(惟一)約束CHECK(檢查)約束NULL(可否為空)約束CASCADE級(jí)連引用一致性約束41數(shù)據(jù)完整性小結(jié)(續(xù))完整性約束的用途:限制輸入到數(shù)據(jù)庫表中的數(shù)據(jù)完整性小結(jié)(續(xù))當(dāng)需要在一個(gè)表中的多個(gè)列上建立約束時(shí),只能定義表級(jí)約束要瀏覽有關(guān)約束的信息可以使用系統(tǒng)存儲(chǔ)過程sp_helpconstraintsp_helpconstraint<表名>42數(shù)據(jù)完整性小結(jié)(續(xù))當(dāng)需要在一個(gè)表中的多個(gè)列上建立約束時(shí),只5.6觸發(fā)器5.6.1創(chuàng)建觸發(fā)器

5.6.2激活觸發(fā)器5.6.3刪除觸發(fā)器435.6觸發(fā)器5.6.1創(chuàng)建觸發(fā)器43觸發(fā)器(Trigger)觸發(fā)器是用戶定義在關(guān)系表上的一類由事件驅(qū)動(dòng)的特殊的存儲(chǔ)過程由服務(wù)器自動(dòng)激活可以進(jìn)行更復(fù)雜的檢查和操作,具有更精細(xì)和更強(qiáng)大的數(shù)據(jù)控制能力----不是SQL規(guī)范的內(nèi)容,但大多DBMS都支持

44觸發(fā)器(Trigger)觸發(fā)器是用戶定義在關(guān)系表上的一類由事觸發(fā)器(續(xù))觸發(fā)器有助于強(qiáng)制引用完整性但強(qiáng)制引用完整性的最好方法是在相關(guān)表中定義主鍵和外鍵約束只要約束和默認(rèn)值提供了全部所需的功能,就應(yīng)使用約束和默認(rèn)值45觸發(fā)器(續(xù))觸發(fā)器有助于強(qiáng)制引用完整性45定義觸發(fā)器CREATETRIGGER語法格式

CREATETRIGGER<觸發(fā)器名>{BEFORE|AFTER}<觸發(fā)事件>ON<表名>

FOREACH{ROW|STATEMENT}[WHEN<觸發(fā)條件>]<觸發(fā)動(dòng)作體>46定義觸發(fā)器CREATETRIGGER語法格式46創(chuàng)建觸發(fā)器----SQLServer2000語法格式CREATETRIGGER<觸發(fā)器名>

ON<表名>|<視圖名>[WITHENCRYPTION]{FOR|AFTER|INSTEADOF}{[INSERT][,][UPDATE][,][DELETE]}AS<觸發(fā)動(dòng)作體>47創(chuàng)建觸發(fā)器----SQLServer2000語法格式CR定義觸發(fā)器(續(xù))語法說明:創(chuàng)建者:表的擁有者觸發(fā)器名表名:觸發(fā)器的目標(biāo)表觸發(fā)事件:INSERT、DELETE、UPDATE觸發(fā)器類型行級(jí)觸發(fā)器(FOREACHROW)語句級(jí)觸發(fā)器(FOREACHSTATEMENT)48定義觸發(fā)器(續(xù))語法說明:48定義觸發(fā)器(續(xù))語法說明:觸發(fā)條件觸發(fā)條件為真省略WHEN觸發(fā)條件觸發(fā)動(dòng)作體可以是一個(gè)匿名SQL過程語句塊也可以是對(duì)已創(chuàng)建存儲(chǔ)過程的調(diào)用49定義觸發(fā)器(續(xù))語法說明:49定義觸發(fā)器(續(xù))語法說明:[WITHENCRYPTION]----加密系統(tǒng)分類表中包含CREATETRIGGER語句文本的條目50定義觸發(fā)器(續(xù))語法說明:50定義觸發(fā)器(續(xù))語句級(jí)與行級(jí)觸發(fā)器示例在TEACHER表上創(chuàng)建一個(gè)AFTERUPDATE觸發(fā)器,若表TEACHER有1000行,執(zhí)行語句:UPDATETEACHERSETDeptno=5;

若為語句級(jí)觸發(fā)器,則執(zhí)行完該語句后,觸發(fā)動(dòng)作只發(fā)生一次若為行級(jí)觸發(fā)器,觸發(fā)動(dòng)作將執(zhí)行1000次51定義觸發(fā)器(續(xù))語句級(jí)與行級(jí)觸發(fā)器示例51SQLServer2000觸發(fā)器類型可使用FOR子句指定觸發(fā)器的執(zhí)行時(shí)間AFTER:在觸發(fā)它們的語句(INSERT、UPDATE、DELETE)完成后執(zhí)行----SQLServer2000中AFTER是默認(rèn)的觸發(fā)器INSTEADOF:用于替代引起觸發(fā)器執(zhí)行的SQL語句----只能為每個(gè)觸發(fā)操作定義一個(gè)INSTEADOF觸發(fā)器52SQLServer2000觸發(fā)器類型可使用FOR子句指定觸觸發(fā)器語句中使用的兩個(gè)臨時(shí)的駐留內(nèi)存的表SQLServer2000自動(dòng)創(chuàng)建和治理可以使用這兩個(gè)表測(cè)試某些數(shù)據(jù)修改的效果及設(shè)置觸發(fā)器操作的條件不能直接對(duì)表中的數(shù)據(jù)進(jìn)行更改INSERTED表和DELETED表53觸發(fā)器語句中使用的兩個(gè)臨時(shí)的駐留內(nèi)存的表INSERTED表和INSERTED表用于存儲(chǔ)INSERT和UPDATE語句所影響的行的副本在一個(gè)插入或更新事務(wù)處理中,新建行被同時(shí)添加到INSERTED表和觸發(fā)器表中INSERTED表中的行是觸發(fā)器表中新行的副本INSERTED表和DELETED表54INSERTED表INSERTED表和DELETED表54DELETED表:用于存儲(chǔ)DELETE和UPDATE語句所影響的行的復(fù)本在執(zhí)行DELETE或UPDATE語句時(shí),行從觸發(fā)器表中刪除,并傳輸?shù)紻ELETED表中DELETE表和觸發(fā)器表通常沒有相同的行INSERTED表和DELETED表55DELETED表:INSERTED表和DELETED表55插入操作(INSERT):INSERTED表有數(shù)據(jù),DELETED表無數(shù)據(jù)刪除操作(DELETE):INSERTED表無數(shù)據(jù),DELETED表有數(shù)據(jù)更新操作(UPDATE):INSERTED表有數(shù)據(jù)(新數(shù)據(jù)),DELETED表有數(shù)據(jù)(舊數(shù)據(jù))INSERTED表和DELETED表56插入操作(INSERT):INSERTED表有數(shù)據(jù),DELEUPDATE觸發(fā)器的工作過程UPDATE觸發(fā)器的工作過程當(dāng)在定義了觸發(fā)器的表上執(zhí)行UPDATE語句的時(shí)候,原行(前像)被移到DETELED表中,而更新的行(后像)則插入INSERTED表中觸發(fā)器可以檢索DELETED和INSERTED表以及被更新的表,來確定是否更新了多行以及如何執(zhí)行觸發(fā)器動(dòng)作57UPDATE觸發(fā)器的工作過程UPDATE觸發(fā)器的工作過程57定義觸發(fā)器和激活觸發(fā)器[例1]用戶插入數(shù)據(jù)時(shí)顯示提示信息CREATETRIGGERchufa1ONStudentFORINSERTASPRINT‘成功插入數(shù)據(jù)‘激活I(lǐng)NSERTINTOStudent(Sno,Sname)Values('15','ww')58定義觸發(fā)器和激活觸發(fā)器[例1]用戶插入數(shù)據(jù)時(shí)顯示提示信息58定義觸發(fā)器和激活觸發(fā)器(例)[例2]阻止用戶插入和刪除Student表中的信息

CREATETRIGGERnooperateONStudentFORINSERT,DELETEASBEGINPRINT'no'ROLLBACKTRANSACTIONRETURNEND激活DELETEFROMStudentWHERESno='1'59定義觸發(fā)器和激活觸發(fā)器(例)[例2]阻止用戶插入和刪除Stu定義觸發(fā)器和激活觸發(fā)器(例)[例3]阻止用戶修改Student表中的信息

CREATETRIGGERnomodifyONStudentFORUPDATEASIFUPDATE(Sno)BEGINPRINT'no'ROLLBACKTRANSACTIONRETURNEND激活UPDATEStudentSETSno='18'WHERESno='1'60定義觸發(fā)器和激活觸發(fā)器(例)[例3]阻止用戶修改Studen5.6.3刪除觸發(fā)器DROPTRIGGER<觸發(fā)器名>例:DROPTRIGGERchufa1

----當(dāng)用戶刪除某個(gè)關(guān)系表時(shí),所有建立在該表上的觸發(fā)器都將被刪除615.6.3刪除觸發(fā)器DROPTRIGGER<觸發(fā)器名>修改觸發(fā)器ALTERTRIGGER<觸發(fā)器名>

ONtable

{FOR{[DELETE][,][UPDATE][,][INSERT]}

ASsql語句}62修改觸發(fā)器ALTERTRIGGER<觸發(fā)器名>

ON5.7小結(jié)數(shù)據(jù)庫的完整性是為了保證數(shù)據(jù)庫中存儲(chǔ)的數(shù)據(jù)是正確的RDBMS完整性實(shí)現(xiàn)的機(jī)制完整性約束定義機(jī)制完整性檢查機(jī)制違背完整性約束條件時(shí)RDBMS應(yīng)采取的動(dòng)作635.7小結(jié)數(shù)據(jù)庫的完整性是為了保證數(shù)據(jù)庫中存儲(chǔ)的數(shù)據(jù)是正觸發(fā)器在學(xué)生表建立觸發(fā)器,如果插入成功則顯示’Hello’在選課表建立觸發(fā)器,對(duì)選課表的數(shù)據(jù)不允許修改和刪除操作在學(xué)生表建立觸發(fā)器,使得學(xué)生表的學(xué)號(hào)不允許被修改64觸發(fā)器在學(xué)生表建立觸發(fā)器,如果插入成功則顯示’Hello’6謝謝!謝謝!本章目標(biāo):掌握數(shù)據(jù)庫的完整性概念,以及用SQL語言定義關(guān)系模式的完整性約束條件。第五章數(shù)據(jù)庫完整性12/16/2022本章目標(biāo):掌握數(shù)據(jù)庫的完整性概念,以及用SQL語言第五章數(shù)據(jù)庫完整性5.1實(shí)體完整性5.2參照完整性5.3用戶自定義完整性5.4完整性約束命名子句5.5域中的完整性限制5.6觸發(fā)器5.7小結(jié)67第五章數(shù)據(jù)庫完整性5.1實(shí)體完整性2重點(diǎn)和難點(diǎn)重點(diǎn):掌握DBMS完整性控制機(jī)制的三個(gè)方面,即完整性約束條件的定義、檢查和違約處理。用SQL語言定義關(guān)系模式的完整性約束條件。包括定義主碼、參照完整性;定義與應(yīng)用有關(guān)的完整性。難點(diǎn):如何實(shí)現(xiàn)完整性的策略,以確保數(shù)據(jù)的正確與有效。較復(fù)雜的是參照完整性的實(shí)現(xiàn)機(jī)制。68重點(diǎn)和難點(diǎn)重點(diǎn):3數(shù)據(jù)庫完整性數(shù)據(jù)庫的完整性數(shù)據(jù)的正確性和相容性數(shù)據(jù)的完整性和安全性是兩個(gè)不同概念數(shù)據(jù)的完整性防止數(shù)據(jù)庫中存在不正確的數(shù)據(jù)防范對(duì)象:不合語義的、不正確的數(shù)據(jù)數(shù)據(jù)的安全性防止惡意的破壞和非法的存取防范對(duì)象:非法用戶和非法操作69數(shù)據(jù)庫完整性數(shù)據(jù)庫的完整性4數(shù)據(jù)庫完整性(續(xù))為維護(hù)數(shù)據(jù)庫的完整性,DBMS必須:提供定義完整性約束條件的機(jī)制提供完整性檢查的方法違約處理----目前商用的DBMS產(chǎn)品都支持完整性控制本章重點(diǎn)講解SQL語言中實(shí)現(xiàn)完整性控制功能的方法70數(shù)據(jù)庫完整性(續(xù))為維護(hù)數(shù)據(jù)庫的完整性,DBMS必須:55.1實(shí)體完整性5.1.1實(shí)體完整性定義5.1.2實(shí)體完整性檢查和違約處理715.1實(shí)體完整性5.1.1實(shí)體完整性定義65.1.1實(shí)體完整性定義關(guān)系模型的實(shí)體完整性CREATETABLE中用PRIMARYKEY定義單屬性構(gòu)成的碼有兩種定義方法

定義為列級(jí)約束條件定義為表級(jí)約束條件對(duì)多個(gè)屬性構(gòu)成的碼只有一種定義方法定義為表級(jí)約束條件725.1.1實(shí)體完整性定義關(guān)系模型的實(shí)體完整性7實(shí)體完整性定義(續(xù))[例1]將Student表中的Sno屬性定義為碼在列級(jí)定義主碼:在屬性后增加關(guān)鍵字CREATETABLEStudent(SnoCHAR(9)PRIMARYKEY,SnameCHAR(20)NOTNULL,SsexCHAR(2),SageSMALLINT,SdeptCHAR(20));73實(shí)體完整性定義(續(xù))[例1]將Student表中的Sno屬性實(shí)體完整性定義(續(xù))在表級(jí)定義主碼:在屬性表中加入額外的定義主碼的子句:PRIMARYKEY(主碼屬性名表)

CREATETABLEStudent(SnoCHAR(9),SnameCHAR(20)NOTNULL,SsexCHAR(2),SageSMALLINT,SdeptCHAR(20),

PRIMARYKEY(Sno));74實(shí)體完整性定義(續(xù))在表級(jí)定義主碼:在屬性表中加入額外的定義實(shí)體完整性定義(續(xù))[例2]將SC表中的Sno,Cno屬性組定義為碼CREATETABLESC(SnoCHAR(9)NOTNULL,CnoCHAR(4)NOTNULL,GradeSMALLINT,

PRIMARYKEY(Sno,Cno)

/*只能在表級(jí)定義主碼*/);75實(shí)體完整性定義(續(xù))[例2]將SC表中的Sno,Cno屬性組5.1.2實(shí)體完整性檢查和違約處理插入或?qū)χ鞔a列進(jìn)行更新操作時(shí),RDBMS按照實(shí)體完整性規(guī)則自動(dòng)進(jìn)行檢查。包括:檢查主碼值是否唯一,不唯一則拒絕檢查主碼的各個(gè)屬性是否為空,只要有一個(gè)為空就拒絕檢查記錄中主碼值是否唯一的方法:全表掃描提高實(shí)體完整性檢查效率的方法:索引765.1.2實(shí)體完整性檢查和違約處理插入或?qū)χ鞔a列進(jìn)行更新操5.2參照完整性5.2.1參照完整性定義5.2.2參照完整性檢查和違約處理775.2參照完整性5.2.1參照完整性定義125.2.1參照完整性定義關(guān)系模型的參照完整性定義在CREATETABLE中用FOREIGNKEY短語定義哪些列為外碼用REFERENCES短語指明這些外碼參照哪些表的主碼785.2.1參照完整性定義關(guān)系模型的參照完整性定義13參照完整性定義(例)關(guān)系SC:(Sno,Cno)是主碼。Sno,Cno分別參照引用Student表的主碼和Course表的主碼[例3]定義SC中的參照完整性CREATETABLESC(SnoCHAR(9)NOTNULL,CnoCHAR(4)NOTNULL,

GradeSMALLINT,PRIMARYKEY(Sno,Cno),

FOREIGNKEY(Sno)REFERENCESStudent(Sno),

/*在表級(jí)定義參照完整性*/

FOREIGNKEY(Cno)REFERENCESCourse(Cno)

/*在表級(jí)定義參照完整性*/);79參照完整性定義(例)關(guān)系SC:(Sno,Cno)是主碼。Sn5.2.2參照完整性檢查和違約處理參照完整性:將兩個(gè)表中的相應(yīng)元組聯(lián)系起來可能破壞參照完整性的操作:對(duì)參照表和被參照表的增、刪、改805.2.2參照完整性檢查和違約處理參照完整性:將兩個(gè)表中的參照完整性檢查和違約處理[例]對(duì)表SC和Student,可能破壞參照完整性的操作情況SC表增加一個(gè)元組修改SC表的一個(gè)元組從Student表刪除一個(gè)元組修改Student表中一個(gè)元組的Sno屬性值81參照完整性檢查和違約處理[例]對(duì)表SC和Student,可能參照完整性檢查和違約處理[練習(xí)]對(duì)表SC和Course,可能破壞參照完整性的操作情況SC表增加一個(gè)元組修改SC表的一個(gè)元組從Course表刪除一個(gè)元組修改Course表中一個(gè)元組的Cno屬性值82參照完整性檢查和違約處理[練習(xí)]對(duì)表SC和Course,可能參照完整性檢查和違約處理可能破壞參照完整性的情況及違約處理被參照表

(例如Student)參照表

(例如SC)違約

處理可能破壞

參照完整性

插入元組拒絕可能破壞

參照完整性

修改外碼值拒絕刪除元組可能破壞

參照完整性拒絕/級(jí)連刪除/設(shè)置為空值修改主碼值可能破壞

參照完整性拒絕/級(jí)連修改/設(shè)置為空值83參照完整性檢查和違約處理可能破壞參照完整性的情況及違約處理被違約處理參照完整性違約處理拒絕(NOACTION)執(zhí)行默認(rèn)策略級(jí)聯(lián)(CASCADE)操作刪除/修改被參照表的某元組時(shí),則刪除/修改參照表中不一致的元組設(shè)置為空值(SET-NULL)刪除/修改被參照表的某元組時(shí),則設(shè)置參照表中不一致的元組的對(duì)應(yīng)屬性為空值84違約處理參照完整性違約處理19違約處理設(shè)置為空值(SET-NULL)對(duì)于參照完整性,除了應(yīng)該定義外碼,還應(yīng)定義外碼列是否允許空值當(dāng)參照表與被參照表的操作違反了參照完整性時(shí)系統(tǒng)選用默認(rèn)策略,即拒絕執(zhí)行若想讓系統(tǒng)采取其他策略,必須在創(chuàng)建表時(shí)顯式地說明85違約處理設(shè)置為空值(SET-NULL)20在主表中修改主碼例例:將S關(guān)系中Sno=950001的元組中Sno值改為960123。設(shè)SC關(guān)系中有4個(gè)元組的Sno=950001級(jí)聯(lián)修改:將SC關(guān)系中4個(gè)Sno=950001元組中的Sno值也改為960123。若參照關(guān)系同時(shí)又是另一關(guān)系的被參照關(guān)系,則修改操作會(huì)繼續(xù)級(jí)聯(lián)下去86在主表中修改主碼例例:將S關(guān)系中Sno=950001的元組中在主表中修改主碼例受限修改:只有當(dāng)SC中沒有任何元組的Sno=950001時(shí),才能修改S表中Sno=950001的元組的Sno值(改為960123)置空值修改:將S表中Sno=950001的元組的Sno值改為960123,而將SC表中所有Sno=950001的元組的Sno值置為空值。在學(xué)生選課數(shù)據(jù)庫中只有前二種方法是正確的(級(jí)聯(lián)修改、受限修改)87在主表中修改主碼例受限修改:只有當(dāng)SC中沒有任何元組的Sno違約處理(續(xù))[例4]顯式說明參照完整性違約處理示例CREATETABLESC

(SnoCHAR(9)NOTNULL,CnoCHAR(4)NOTNULL,

GradeSMALLINT,PRIMARYKEY(Sno,Cno),

FOREIGNKEY(Sno)REFERENCESStudent(Sno)

ONDELETECASCADE

/*級(jí)聯(lián)刪除SC表中相應(yīng)的元組*/

ONUPDATECASCADE,

/*級(jí)聯(lián)更新SC表中相應(yīng)的元組*/

FOREIGNKEY(Cno)REFERENCESCourse(Cno)

ONDELETENOACTION

/*當(dāng)刪除course表中的元組造成了與SC表不一致時(shí)拒絕刪除*/

ONUPDATECASCADE

/*當(dāng)更新course表中的cno時(shí),級(jí)聯(lián)更新SC表中相應(yīng)的元組*/)88違約處理(續(xù))[例4]顯式說明參照完整性違約處理示例23ONDELETECASCADE----級(jí)連刪除DELETEFROMSCWHERESno='1‘則只刪除SC的一條記錄,Student表的相應(yīng)記錄不會(huì)被刪除DELETEFROMStudentWHERESno='1‘不但刪除Student的一條記錄,而且表SC中Sno=‘1‘同學(xué)的所有選修記錄也會(huì)被級(jí)連刪除89ONDELETECASCADE----級(jí)連刪除DELET5.3用戶定義的完整性用戶定義的完整性就是針對(duì)某一具體應(yīng)用的數(shù)據(jù)必須滿足的語義要求RDBMS提供定義和檢驗(yàn)機(jī)制,而不必由應(yīng)用程序承擔(dān)905.3用戶定義的完整性用戶定義的完整性就是針對(duì)某一具體應(yīng)用5.3用戶定義的完整性5.3.1屬性上的約束條件的定義5.3.2屬性上的約束條件檢查和違約處理5.3.3元組上的約束條件的定義5.3.4元組上的約束條件檢查和違約處理915.3用戶定義的完整性5.3.1屬性上的約束條件的定義25.3.1屬性上的約束條件的定義CREATETABLE時(shí)定義列值非空(NOTNULL)列值唯一(UNIQUE)檢查列值是否滿足一個(gè)布爾表達(dá)式(CHECK)925.3.1屬性上的約束條件的定義CREATETABLE時(shí)屬性上的約束條件的定義(續(xù))1.不允許取空值

[例5]定義SC表時(shí),說明Sno、Cno、Grade屬性不允許取空值。CREATETABLESC(SnoCHAR(9)NOTNULL, CnoCHAR(4)NOTNULL, GradeSMALLINTNOTNULL, PRIMARYKEY(Sno,Cno)/*如果在表級(jí)定義實(shí)體完整性,隱含了Sno,Cno不允許取空值,則在列級(jí)不允許取空值的定義就不必寫了*/);

CREATETABLESC(SnoCHAR(9), CnoCHAR(4), GradeSMALLINTNOTNULL, PRIMARYKEY(Sno,Cno));

93屬性上的約束條件的定義(續(xù))1.不允許取空值[例5]定義S屬性上的約束條件的定義(續(xù))2.列值唯一

[例6]建立部門表DEPT,要求部門名稱Dname屬性列取值唯一,部門編號(hào)Deptno屬性列為主碼CREATETABLEDEPT

(DeptnoNUMERIC(2),

DnameCHAR(9)UNIQUE,/*要求Dname列值唯一*/

LocationCHAR(10),

PRIMARYKEY(Deptno));94屬性上的約束條件的定義(續(xù))2.列值唯一29屬性上的約束條件的定義(續(xù))3.用CHECK短語指定列值應(yīng)滿足的條件[例7]Student表的Ssex只允許取“男”或“女”CREATETABLEStudent

(SnoCHAR(9)PRIMARYKEY,

SnameCHAR(8)NOTNULL,

SsexCHAR(2)CHECK(SsexIN(‘男’,‘女’)),

/*性別屬性Ssex只允許取'男'或'女'*/

SageSMALLINT,

SdeptCHAR(20));95屬性上的約束條件的定義(續(xù))3.用CHECK短語指定列值應(yīng)滿屬性上的約束條件的定義(續(xù))[例8]SC表的Grade只允許取0-100的數(shù)字

CREATETABLESC(SnoCHAR(9),CnoCHAR(4)NOTNULL,GradeSMALLINTCHECK(Grade>=0ANDGrade<=100),

/*Grade屬性只允許取0-100的數(shù)字*/PRIMARYKEY(Sno,Cno),FOREIGNKEY(Sno)REFERENCESStudent(Sno),FOREIGNKEY(Cno)REFERENCESCourse(Cno))96屬性上的約束條件的定義(續(xù))[例8]SC表的Grade只允許5.3.2屬性上的約束條件檢查和違約處理插入元組或修改屬性的值時(shí),RDBMS檢查屬性上的約束條件是否被滿足如果不滿足則操作被拒絕執(zhí)行975.3.2屬性上的約束條件檢查和違約處理插入元組或修改屬性5.3.3元組上的約束條件的定義在CREATETABLE時(shí)可以用CHECK短語定義元組上的約束條件,即元組級(jí)的限制同屬性值限制相比,元組級(jí)的限制可以設(shè)置不同屬性之間取值的相互約束條件985.3.3元組上的約束條件的定義在CREATETABLE元組上的約束條件的定義(續(xù))[例9]當(dāng)學(xué)生的性別是男時(shí),其名字不能以Ms.打頭

CREATETABLEStudent(SnoCHAR(9),SnameCHAR(8)NOTNULL,SsexCHAR(2),SageSMALLINT,SdeptCHAR(20),PRIMARYKEY(Sno),

CHECK(Ssex='女'ORSnameNOTLIKE'Ms.%')

/*定義了元組中Sname和Ssex兩個(gè)屬性值之間的約束條件*/)性別是女性的元組都能通過該項(xiàng)檢查;當(dāng)性別是男性時(shí),則名字一定不能以Ms.打頭,才能通過檢查99元組上的約束條件的定義(續(xù))[例9]當(dāng)學(xué)生的性別是男時(shí),其名5.3.4元組上的約束條件檢查和違約處理插入元組或修改屬性的值時(shí),RDBMS檢查元組上的約束條件是否被滿足如果不滿足則操作被拒絕執(zhí)行1005.3.4元組上的約束條件檢查和違約處理插入元組或修改屬性5.4完整性約束命名子句完整性約束命名:CONSTRAINT約束子句CONSTRAINT<完整性約束條件名>[PRIMARYKEY短語|FOREIGNKEY短語|CHECK短語]1015.4完整性約束命名子句完整性約束命名:CONSTRAIN完整性約束命名子句(續(xù))[例10]建立學(xué)生登記表Student,要求學(xué)號(hào)在90000-99999之間,姓名不能取空值,年齡小于30,性別只能是“男”或“女”。CREATETABLEStudent(SnoNUMERIC(6)CONSTRAINTC1

CHECK(SnoBETWEEN90000AND99999),SnameCHAR(20)CONSTRAINTC2NOTNULL,SageNUMERIC(3)CONSTRAINTC3CHECK(Sage<30),SsexCHAR(2)CONSTRAINTC4CHECK(SsexIN('男','女')),

CONSTRAINTStudentKeyPRIMARYKEY(Sno))在Student表上建立了5個(gè)約束條件,包括主碼約束(命名為StudentKey)以及C1、C2、C3、C4四個(gè)列級(jí)約束。102完整性約束命名子句(續(xù))[例10]建立學(xué)生登記表Studen完整性約束命名子句(續(xù))修改表中的完整性限制:ALTERTABLE語句增加新的約束條件(ADD)修改表中的完整性限制(DROP-ADD)先刪除原來的約束條件(DROP)再增加新的約束條件(ADD)刪除表中原有的完整性限制(DROP)103完整性約束命名子句(續(xù))修改表中的完整性限制:ALTERT完整性約束命名子句(續(xù))[例13]修改表Student中的約束條件,要求學(xué)號(hào)改為在900000-999999之間,年齡由小于30改為小于40可先刪除原來的約束條件,再增加新的約束條件ALTERTABLEStudentDROPCONSTRAINTC1;ALTERTABLEStudentADDCONSTRAINTC1

CHECK(SnoBETWEEN900000AND999999),ALTERTABLEStudentDROPCONSTRAINTC3;ALTERTABLEStudentADDCONSTRAINTC3

CHECK(Sage<40);104完整性約束命名子句(續(xù))[例13]修改表Student中的約數(shù)據(jù)完整性小結(jié)數(shù)據(jù)庫的完整性是為了保證數(shù)據(jù)庫中存儲(chǔ)的數(shù)據(jù)是正確的RDBMS完整性實(shí)現(xiàn)的機(jī)制完整性約束定義機(jī)制完整性檢查機(jī)制違背完整性約束條件時(shí)RDBMS應(yīng)采取的動(dòng)作105數(shù)據(jù)完整性小結(jié)數(shù)據(jù)庫的完整性是為了保證數(shù)據(jù)庫中存儲(chǔ)的數(shù)據(jù)是正數(shù)據(jù)完整性小結(jié)(續(xù))完整性約束的用途:限制輸入到數(shù)據(jù)庫表中的值的范圍SQLServer根據(jù)不同用途提供了多種約束PRIMARY(主鍵)約束FOREIGN(外鍵)約束UNIQUE(惟一)約束CHECK(檢查)約束NULL(可否為空)約束CASCADE級(jí)連引用一致性約束106數(shù)據(jù)完整性小結(jié)(續(xù))完整性約束的用途:限制輸入到數(shù)據(jù)庫表中的數(shù)據(jù)完整性小結(jié)(續(xù))當(dāng)需要在一個(gè)表中的多個(gè)列上建立約束時(shí),只能定義表級(jí)約束要瀏覽有關(guān)約束的信息可以使用系統(tǒng)存儲(chǔ)過程sp_helpconstraintsp_helpconstraint<表名>107數(shù)據(jù)完整性小結(jié)(續(xù))當(dāng)需要在一個(gè)表中的多個(gè)列上建立約束時(shí),只5.6觸發(fā)器5.6.1創(chuàng)建觸發(fā)器

5.6.2激活觸發(fā)器5.6.3刪除觸發(fā)器1085.6觸發(fā)器5.6.1創(chuàng)建觸發(fā)器43觸發(fā)器(Trigger)觸發(fā)器是用戶定義在關(guān)系表上的一類由事件驅(qū)動(dòng)的特殊的存儲(chǔ)過程由服務(wù)器自動(dòng)激活可以進(jìn)行更復(fù)雜的檢查和操作,具有更精細(xì)和更強(qiáng)大的數(shù)據(jù)控制能力----不是SQL規(guī)范的內(nèi)容,但大多DBMS都支持

109觸發(fā)器(Trigger)觸發(fā)器是用戶定義在關(guān)系表上的一類由事觸發(fā)器(續(xù))觸發(fā)器有助于強(qiáng)制引用完整性但強(qiáng)制引用完整性的最好方法是在相關(guān)表中定義主鍵和外鍵約束只要約束和默認(rèn)值提供了全部所需的功能,就應(yīng)使用約束和默認(rèn)值110觸發(fā)器(續(xù))觸發(fā)器有助于強(qiáng)制引用完整性45定義觸發(fā)器CREATETRIGGER語法格式

CREATETRIGGER<觸發(fā)器名>{BEFORE|AFTER}<觸發(fā)事件>ON<表名>

FOREACH{ROW|STATEMENT}[WHEN<觸發(fā)條件>]<觸發(fā)動(dòng)作體>111定義觸發(fā)器CREATETRIGGER語法格式46創(chuàng)建觸發(fā)器----SQLServer2000語法格式CREATETRIGGER<觸發(fā)器名>

ON<表名>|<視圖名>[WITHENCRYPTION]{FOR|AFTER|INSTEADOF}{[INSERT][,][UPDATE][,][DELETE]}AS<觸發(fā)動(dòng)作體>112創(chuàng)建觸發(fā)器----SQLServer2000語法格式CR定義觸發(fā)器(續(xù))語法說明:創(chuàng)建者:表的擁有者觸發(fā)器名表名:觸發(fā)器的目標(biāo)表觸發(fā)事件:INSERT、DELETE、UPDATE觸發(fā)器類型行級(jí)觸發(fā)器(FOREACHROW)語句級(jí)觸發(fā)器(FOREACHSTATEMENT)113定義觸發(fā)器(續(xù))語法說明:48定義觸發(fā)器(續(xù))語法說明:觸發(fā)條件觸發(fā)條件為真省略WHEN觸發(fā)條件觸發(fā)動(dòng)作體可以是一個(gè)匿名SQL過程語句塊也可以是對(duì)已創(chuàng)建存儲(chǔ)過程的調(diào)用114定義觸發(fā)器(續(xù))語法說明:49定義觸發(fā)器(續(xù))語法說明:[WITHENCRYPTION]----加密系統(tǒng)分類表中包含CREATETRIGGER語句文本的條目115定義觸發(fā)器(續(xù))語法說明:50定義觸發(fā)器(續(xù))語句級(jí)與行級(jí)觸發(fā)器示例

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論