數(shù)據(jù)庫(kù)系統(tǒng)原理-第七章約束與觸發(fā)器_第1頁(yè)
數(shù)據(jù)庫(kù)系統(tǒng)原理-第七章約束與觸發(fā)器_第2頁(yè)
數(shù)據(jù)庫(kù)系統(tǒng)原理-第七章約束與觸發(fā)器_第3頁(yè)
數(shù)據(jù)庫(kù)系統(tǒng)原理-第七章約束與觸發(fā)器_第4頁(yè)
數(shù)據(jù)庫(kù)系統(tǒng)原理-第七章約束與觸發(fā)器_第5頁(yè)
已閱讀5頁(yè),還剩62頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第7章約束與觸發(fā)器

7.1鍵與外鍵7.2屬性和元組上的約束7.3修改約束7.4斷言7.5觸發(fā)器Page1SQL中約束種類數(shù)據(jù)庫(kù)設(shè)計(jì)質(zhì)量體現(xiàn)為約束constraints所提供的可靠性保障。約束以表達(dá)式或語(yǔ)句的形式存儲(chǔ)在數(shù)據(jù)庫(kù)中。約束是一種主動(dòng)性(active)元素,當(dāng)數(shù)據(jù)庫(kù)特定狀態(tài)發(fā)生改變時(shí)自動(dòng)運(yùn)行。SQL2提供部分完整性約束:鍵、參照完整性、域約束、元組約束等。SQL3提供觸發(fā)器trigger機(jī)制:由特定事件觸發(fā)某種主動(dòng)性元素。Page2在第二章中已經(jīng)介紹了SQL中通過(guò)保留字PRIMARYKEY或UNIQUE來(lái)定義一個(gè)屬性或一組屬性為關(guān)系的鍵。如:CREATETABLEMovies(titlechar(20),yearint,lengthint,genrechar(10),studioNamechar(30),producerCint,PRIMARYKEY(title,year));7.1鍵與外鍵Page3鍵key是最重要的約束。每個(gè)表都必須確定自己的鍵。每個(gè)表都可能有多個(gè)屬性集可作為鍵,稱為“候選鍵candidatekey”。一個(gè)表只能確定一個(gè)主鍵(PrimaryKey)。若某個(gè)屬性說(shuō)明為Unique,則它是一個(gè)候選鍵。若關(guān)系的某個(gè)屬性說(shuō)明為外鍵,則該屬性出現(xiàn)的值,一定會(huì)在另一個(gè)關(guān)系的主鍵中出現(xiàn)。7.1鍵與外鍵Page47.1鍵與外鍵外鍵約束聲明隱含兩層意思:①被引用的另一個(gè)關(guān)系的屬性必須是主鍵②外鍵屬性取值必須屬于被引用的另一個(gè)關(guān)系的主鍵屬性的值。Page5舉例學(xué)籍管理數(shù)據(jù)庫(kù)Page6聲明外鍵的方法和聲明主鍵的方法一樣,聲明外鍵的方法也有兩種。①如果外鍵是單個(gè)屬性,則可以在此屬性的名字和類型之后,聲明其引用某個(gè)表的某個(gè)屬性。格式如下:REFERENCES<表名>(<屬性名>)Page7舉例電影數(shù)據(jù)庫(kù)模式如下:Movies(title,year,length,genre,studioName,producerC)

名稱年份長(zhǎng)度(分鐘)流派電影公司名稱導(dǎo)演證書(shū)號(hào)MovieStar(name,address,gender,birthdate)

姓名住址性別生日StarsIn(movieTitle,movieYear,starName)

影片名稱年份主演姓名MovieExec(name,address,cert,netWorth)

導(dǎo)演姓名住址導(dǎo)演證書(shū)號(hào)凈資產(chǎn)Studio(name,address,presC)

電影公司名稱地址經(jīng)理證書(shū)號(hào)要聲明StarsIn表中的starName屬性對(duì)MovieStar表的name屬性的引用完整性約束,聲明方法如下:Page8舉例CREATETABLEStarsIn(movieTitlechar(20),movieYearint,starNamechar(12)REFERENCESMovieStar(name),PRIMARYKEY(movieTitle,movieYear,starName));Page9舉例CREATETABLEStarsIn(movieTitlechar(20),movieYearint,starNamechar(12)REFERENCESMovieStar(name),PRIMARYKEY(movieTitle,movieYear,starName));如果在StarsIn表中插入周星馳參演少林足球信息(周星馳未在MovieStar中出現(xiàn)),能否插入?INSERTINTOStarsInVALUES('少林足球',2001,'周星馳');不能,因?yàn)檫`反了在starName屬性上定義的引用完整性約束。Page10舉例CREATETABLEStarsIn(movieTitlechar(20),movieYearint,starNamechar(12)REFERENCESMovieStar(name),PRIMARYKEY(movieTitle,movieYear,starName));如果在StarsIn表中插入徐帆參演唐山大地震的信息(徐帆在MovieStar)中出現(xiàn),能否插入?INSERTINTOStarsInVALUES('唐山大地震',2001,'徐帆');能,因?yàn)椴贿`反在starName屬性上定義的引用完整性約束。Page11聲明外鍵的方法和聲明主鍵的方法一樣,聲明外鍵的方法也有兩種。②如果外鍵是由兩個(gè)屬性以上的屬性組成,則要在CREATETABLE語(yǔ)句中專門追加一個(gè)聲明,格式如下:FOREIGNKEY(<屬性名列表>)REFERENCES<表名>(<屬性名列表>)Page12舉例電影數(shù)據(jù)庫(kù)模式如下:Movies(title,year,length,genre,studioName,producerC)

名稱年份長(zhǎng)度(分鐘)流派電影公司名稱導(dǎo)演證書(shū)號(hào)MovieStar(name,address,gender,birthdate)

姓名住址性別生日StarsIn(movieTitle,movieYear,starName)

影片名稱年份主演姓名MovieExec(name,address,cert,netWorth)

導(dǎo)演姓名住址導(dǎo)演證書(shū)號(hào)凈資產(chǎn)Studio(name,address,presC)

電影公司名稱地址經(jīng)理證書(shū)號(hào)要聲明StarsIn表中的movieTitle,movieYear屬性對(duì)Movies表的title,year屬性的引用完整性約束。Page13舉例CREATETABLEStarsIn(movieTitlechar(20),movieYearint,starNamechar(12)REFERENCESMovieStar(name),PRIMARYKEY(movieTitle,movieYear,starName),FOREIGNKEY(movieTitle,movieYear)REFERENCESMovies(title,year));聲明StarsIn表中的movieTitle,movieYear屬性對(duì)Movies表的title,year屬性的引用完整性約束的方法如下:Page14舉例此時(shí),如果在StarsIn表中插入徐帆參演唐山大地震的信息(未出現(xiàn)在Movies中),能否插入,為什么?INSERTINTOStarsInVALUES('唐山大地震',2001,'徐帆');不能,雖然不違反在starName屬性上定義的引用完整性約束。但是違反了在movieTitle和movieYear屬性上定義的引用完整性約束。Page15外鍵約束聲明是否可定義一個(gè)表參照自己?可以。例如:salesman(empid,idno,name,managerid,deptid,…)外鍵是否可取NULL值?可以。Page16維護(hù)引用完整性數(shù)據(jù)庫(kù)更新時(shí)如何保證參照完整性?

有三種可選策略,以保證參照完整性:1Restrict限制(缺省)2Cascade級(jí)聯(lián)3SetNull置空Page17Restrict限制(缺省)以StarsIn(movieTitle,MovieYear,…)參照Movie(title,year,…)為例:對(duì)于StarsIn(參照表),下面操作被拒絕:insert語(yǔ)句中movieTitle和MovieYear值不是Movie中已有的一個(gè)主鍵值。update語(yǔ)句中改變movieTitle和MovieYear值為不是Movie中已有的主鍵值。對(duì)于Movie(被參照表),Restrict拒絕以下操作:delete語(yǔ)句刪除一個(gè)被StarsIn參照的元組。update語(yǔ)句修改一個(gè)被StarsIn參照的title和year主鍵值。Page18Cascade級(jí)聯(lián)影響被參照表的delete和update操作。以StarsIn(movieTitle,MovieYear,…)參照Movie(title,year,…)為例:當(dāng)Movie(被參照表)delete刪除某個(gè)元組時(shí),StarsIn(參照表)中所有參照元組被自動(dòng)刪除。當(dāng)Movie(被參照表)update修改某個(gè)元組的title或year值時(shí),StarsIn(參照表)中所有參照元組被自動(dòng)修改。Page19SetNull置空影響被參照表的delete和update操作。以Movie(title,year,…,ProducerC#)參照MovieExec(name,…,cert#,…)為例:首先ProducerC#應(yīng)允許NULL。當(dāng)MovieExec(被參照表)delete刪除某個(gè)元組時(shí),Movie(參照表)中所有參照元組的ProducerC#被置空。當(dāng)MovieExec(被參照表)update修改某個(gè)元組的cert#時(shí),Movie(參照表)中所有參照元組的ProducerC#被置空。Page20維護(hù)引用完整性策略的語(yǔ)法這些策略可在說(shuō)明外鍵的同時(shí)描述。

references<被參照表>(屬性表)[Action]

其中:

Action:ON{Update|Delete}{Restrict|Cascade|SetNull}Page21例子CREATETABLEStudio(nameVARCHAR(30)NOTNULL,addressVARCHAR(255),presC#INT,

PRIMARYKEY(Name),

FOREIGNKEY(presC#)ReferencesMovieExec(cert#)

ONDELETESETNULL

ONUPDATECASCADE);注意:對(duì)于一個(gè)外鍵,Update和Delete可分別采用不同的策略。Page22“懸掛元組”danglingtuples什么是“懸掛元組”danglingtuples?對(duì)于參照關(guān)系A(chǔ),外鍵值未出現(xiàn)在被參照表中的元組,即違背參照完整性的元組。如何避免出現(xiàn)“懸掛元組”?1Restrict策略:在參照關(guān)系中對(duì)產(chǎn)生懸掛元組的操作予以禁止。2Cascade策略:自動(dòng)刪除或修改產(chǎn)生出來(lái)的懸掛元組。3SetNull策略:產(chǎn)生出來(lái)的每個(gè)懸掛元組的外鍵值置空NULL,使其不參照任何元組。Page23延遲約束檢查假設(shè)施瓦辛格卸任加州州長(zhǎng)后,建立一個(gè)電影公司,公司名稱為L(zhǎng)aVista,他作為公司的經(jīng)理,則InsertintoStudioValues('LaVista','NewYork',23456)則數(shù)據(jù)插入有一些麻煩,原因是假設(shè)23456是最新頒發(fā)的證書(shū)。InsertintoStudio(name,address)Values('LaVista','NewYork')將證書(shū)號(hào)插入MovieExec關(guān)系后,修改UpdateStudioSETpresC#=23456Wherename='LaVista'Page24延遲約束檢查當(dāng)如果發(fā)生循環(huán)約束(circularconstraint)時(shí),上述的安排也不能解決問(wèn)題。例:如果電影制片人被約束為電影公司經(jīng)理,則要聲明cent#是引用Studio(presC#)的外鍵。于是presC#必須聲明為UNIQUE。這樣就不能進(jìn)行插入操作。解決方法:1.必須將兩個(gè)插入操作組成一個(gè)單一的事務(wù)。2.需要有一種方法通知DBMS不要檢查約束,直到整個(gè)事務(wù)完成執(zhí)行并提交為止。Page25延遲約束檢查在任何的約束聲明后可有DEFERRABLE或NOTDEFERRABLE(缺省值)選項(xiàng)。如果沒(méi)有明確寫(xiě)明則表示進(jìn)行更新操作時(shí),立即檢查該約束。但如果約束被聲明為DEFERRABLE,則約束檢查將推遲到當(dāng)前事務(wù)完成時(shí)進(jìn)行。保留字DEFERRABLE后面有兩個(gè)選項(xiàng):INITIALLYDEFERRED:檢查僅推遲到事務(wù)提交前執(zhí)行INITIALLYIMMERDIATE:檢查在每個(gè)語(yǔ)句后立即執(zhí)行對(duì)于推遲約束檢查,有兩點(diǎn)要記?。喝魏晤愋偷募s束都可以命名。如果約束有名字,則可以用SQL語(yǔ)句將該約束從立即檢查改為推遲檢查。Page26練習(xí)P.188/7.1.1/b)CreateTableMovies(titleChar(30),yearINT,….producerC#INTReferencesMovieExec(cert#)OnDeleteSetNULLOnUpdateSetNULLPrimaryKey(title,year));Page27SQL的CREATETABLE語(yǔ)句中還可以聲明兩種其他約束:①在單一屬性上的約束;②在整個(gè)元組上的約束。7.2.1非空值約束7.2.2基于屬性的CHECK約束7.2.3基于元組的CHECK約束7.2屬性和元組上的約束Page28屬性值約束限制某些屬性的值在特定范圍內(nèi).這類約束可用下列方式表達(dá):⑴在關(guān)系式定義中給出屬性的約束。⑵在整個(gè)元組上的約束。該約束是關(guān)系模式的一部分,不與任何屬性相關(guān)。Page29非空約束如何說(shuō)明某屬性非空NOTNULL?在createtable指令中,屬性說(shuō)明之后加NOTNULL;若不顯式說(shuō)明,該屬性隱含為允許空值。說(shuō)明非空屬性有何效果?⑴不能用update修改其值為NULL。⑵insert時(shí)必須指定一個(gè)非空值。⑶不能使用外鍵的SetNull策略。注意:主鍵屬性和unique屬性隱含非空;允許為空的屬性不可能是主鍵或unique。Page30舉例CREATETABLEStarsIn(movieTitlechar(20)NOTNULL,movieYearintNOTNULL,starNamechar(12)REFERENCESMovieStar(name)

NOTNULL,PRIMARYKEY(movieTitle,movieYear,starName),FOREIGNKEY(movieTitle,movieYear)REFERENCESMovies(title,year));聲明非空值約束的方法如下:Page31基于屬性的Check約束如何限制某屬性的值在特定范圍?在屬性說(shuō)明之后,增加check(條件),屬性的值應(yīng)使條件為真。條件的語(yǔ)法與Where子句的條件一樣。當(dāng)insert和update使屬性值改變時(shí),執(zhí)行check檢驗(yàn),拒絕導(dǎo)致屬性值不一致的更新。Page32例子設(shè)有關(guān)系模式:

Studio(name,address,presC#)

要求其證書(shū)號(hào)必須至少為6位數(shù)字,則可寫(xiě)出約束:

presC#INTREFERENCESMovieExec(cert#)CHECK(presC#>=10000000)設(shè)有關(guān)系模式:

MovieStar(name,address,gender,birthday)

要求其性別只能為'F'

和'M',則可寫(xiě)出約束:

genderCHAR(1)CHECK(genderIN('F','M'))Page33基于屬性的Check約束何時(shí)檢查check條件?只有當(dāng)該表執(zhí)行insert或update時(shí)才檢測(cè)check條件。注意:check條件中可包含其它關(guān)系的屬性,但應(yīng)避免(除了是子查詢的From子句中出現(xiàn)的關(guān)系)。例如,設(shè)有關(guān)系

Studio(name,address,presC#)

其關(guān)系中presC#值必須在關(guān)系

MovieExec(name,address,cert#,networth)

的cert#之中出現(xiàn),則在定義中給出約束:

presC#INTCHECK(presC#IN(SELECTcert#FROMMovieExec))

修改或刪除cert#的值,使某個(gè)presC#對(duì)應(yīng)的鍵值不在MovieExec中是可能的。Page34基于元組的Check約束對(duì)某個(gè)表中元組的約束而不是對(duì)某個(gè)屬性的約束。例如:在關(guān)系模式

MovieStar(name,address,gender,birthday)

中要求每個(gè)元組的審核:如果影星為男性,則他的名字不能以’Ms.’開(kāi)頭。在定義表的性質(zhì)時(shí)增加如下約束:

CHECK(gender='F'ORnameNOTLIKE'Ms.%')何時(shí)檢查check條件?只有當(dāng)該表執(zhí)行insert或update時(shí)才檢測(cè)check條件。注意:如果在表中既有屬性check也有元組check,則先檢測(cè)屬性。Page35基于元組和基于屬性約束的比較如果元組上的約束涉及該元組的多個(gè)屬性,那么就必須作為基于元組的約束。如果約束僅涉及元組的一個(gè)屬性,那么可以作為基于元組或基于屬性的約束。約束檢查基于屬性的約束:條件檢查是一樣的?;谠M的約束:比基于屬性的約束更頻繁的被檢查。Page36練習(xí)P.192/7.2.3/a)CreateTableStarsIn(….starnameChar(30)Check(starnameIn(SelectnameFromMovieStarWhereYear(birthdate)<movieYear))….);Page3738在SQL中提供了增加、刪除和修改約束的方式。7.3.1給約束命名7.3.2修改表上的約束7.3修改約束397.3.1給約束命名修改或刪除約束是通過(guò)約束的名字進(jìn)行的。創(chuàng)建約束時(shí)用戶可以給約束命名,否則DBMS會(huì)給約束起一個(gè)名字。用戶給約束命名的方式:在約束前面加保留字CONSTRAINT和該約束的名字。40舉例CREATETABLEMovieStar(namechar(12)CONSTRAINTNameIsKeyPRIMARYKEY,addresschar(30),genderchar(2)CONSTRAINTNoAndroCHECK(genderIN('M','F')),birthdatedate,

CONSTRAINTRightTitleCHECK(gender='F'ORnameNOTLIKE'Ms.%'));417.3.2修改表上的約束通過(guò)ALTERTABLE語(yǔ)句對(duì)約束進(jìn)行修改ALTERTABLE語(yǔ)句有多種方式影響約束:①用保留字DROP和要?jiǎng)h除的約束的名字可以刪除約束;②用保留字ADD,后跟要添加的約束實(shí)現(xiàn)約束添加。42舉例刪除MovieStar表中的約束。ALTERTABLEMovieStarDROPCONSTRAINTNameIsKey;ALTERTABLEMovieStarDROPCONSTRAINTNoAndro;ALTERTABLEMovieStarDROPCONSTRAINTRightTitle;43舉例在MovieStar表中添加約束。ALTERTABLEMovieStarADDCONSTRAINTNameIsKeyPRIMARYKEY(name);ALTERTABLEMovieStarADDCONSTRAINTNoAndroCHECK(genderIN('M','F'));ALTERTABLEMovieStarADDCONSTRAINTRightTitleCHECK(gender='F'ORnameNOTLIKE'Ms.%');SQL標(biāo)準(zhǔn)提出了一種強(qiáng)制任何條件的簡(jiǎn)單的斷言形式,與check類似,但其用于關(guān)系之間的約束。斷言的定義為

CREATEASSERTION<斷言名>CHECK(<條件>)當(dāng)建立斷言時(shí),斷言的條件必須是真,并且要永遠(yuǎn)保持為真。任何引起斷言條件為假的數(shù)據(jù)庫(kù)更新都被拒絕。7.4斷言Page44斷言使用斷言要寫(xiě)什么?在寫(xiě)斷言條件時(shí)所引用的任何屬性都必須標(biāo)明。何時(shí)檢查斷言的check條件?當(dāng)任何提及的表執(zhí)行delete,insert或update時(shí)檢測(cè)check條件。刪除斷言

DROPASSERTION<斷言名>Page45例子假定希望其凈資產(chǎn)值少于10000000的人不能成為電影公司經(jīng)理。

CREATEASSERTIONRichPresCHECK(NOTEXISTS(SELECT*FROMStudio,MovieExecWHEREpresC#=cert#ANDnetworth<10000000))注意與約束的區(qū)別:

CREATETABLEStudio(nameCHAR(30)PRIMARYKEY,addressVARCHAR(255),presC#INTREFERENCESMovieExec(cert#),CHECK(presC#NOTIN(SELECTcert#FROMMovieExecWHEREnetworth<10000000)))

Page46例子聲明對(duì)一個(gè)給定電影公司,其所有電影的總長(zhǎng)度不能超過(guò)10000分鐘。用斷言實(shí)現(xiàn)

CREATEASSERTIONSumLengthCHECK(10000>=ALL(SELECTSUM(length)FROMMoviesGroupBystudioname));基于元組的Check約束:

CHECK(10000>=ALL(SELECTSUM(length)FROMMoviesGroupBystudioname));

Page47約束的比較下面表格列出了基于屬性的檢查約束、基于元組的檢查約束和斷言之間的主要區(qū)別。約束類型聲明的位置動(dòng)作的時(shí)間確保成立?基于屬性的CHECK屬性對(duì)關(guān)系插入元組或?qū)傩孕薷娜绻亲硬樵?,則不能確保基于元組的CHECK關(guān)系模式元素對(duì)關(guān)系插入元組或?qū)傩孕薷娜绻亲硬樵?,則不能確保斷言數(shù)據(jù)庫(kù)模式元素對(duì)任何提及的關(guān)系改變是Page48練習(xí)P.196/7.4.1/b)CreateAssertionCheck(NotExists(SelectmakerFromProductNaturalJoinPCWherespeed>All(SelectL2.speedFromProductP2,LaptopL2WhereP2.maker=makerANDP2.model=L2.model)));

Page49觸發(fā)器是什么?基于特定事件觸發(fā)的特定的約束檢驗(yàn)。一個(gè)觸發(fā)器trigger是存儲(chǔ)在某個(gè)表中的一個(gè)命名的數(shù)據(jù)庫(kù)對(duì)象。當(dāng)該表進(jìn)行某種數(shù)據(jù)更新時(shí),將自動(dòng)觸發(fā)一組SQL語(yǔ)句的執(zhí)行。注意:各種商業(yè)數(shù)據(jù)庫(kù)可能使用不同語(yǔ)法。7.5觸發(fā)器Page50觸發(fā)器(trigger)觸發(fā)器與約束不同:僅當(dāng)數(shù)據(jù)庫(kù)程序員聲明的事件發(fā)生時(shí),觸發(fā)器被激活。所允許的事件種類通常是對(duì)某個(gè)特定關(guān)系的插入、刪除或修改。當(dāng)觸發(fā)器被事件激活時(shí),觸發(fā)器測(cè)試觸發(fā)條件。如果條件不成立,則相應(yīng)該事件的觸發(fā)器不做任何事情。如果觸發(fā)器滿足聲明的條件,則與該觸發(fā)器相連的動(dòng)作由DBMS執(zhí)行。Page51事件-條件-動(dòng)作規(guī)則Event事件:數(shù)據(jù)更新指令:insert/delete/updateCondition條件:當(dāng)事件發(fā)生后,檢查條件是否滿足:若不滿足,則不執(zhí)行動(dòng)作。若滿足,則執(zhí)行一組動(dòng)作之后狀態(tài)轉(zhuǎn)移。Action動(dòng)作:一組SQL指令,通常是更新操作Old狀態(tài)New狀態(tài)Event/Condition[Action]Page52SQL中的觸發(fā)器特征動(dòng)作可以在觸發(fā)事件之前或之后被執(zhí)行。在被觸發(fā)的事件中,動(dòng)作既可指向被插入、刪除、修改元組的新值,也可以指向其舊值。更新事件可以被局限到某個(gè)特定的屬性或某一些屬性。條件由WHEN短語(yǔ)給出。僅僅當(dāng)規(guī)則被觸發(fā),并且觸發(fā)事件的發(fā)生使條件成立時(shí),動(dòng)作才被執(zhí)行。程序員可以選擇動(dòng)作執(zhí)行的方式:一次只對(duì)一個(gè)更新元組(行級(jí)觸發(fā)器)

,或者一次針對(duì)在數(shù)據(jù)庫(kù)操作中被改變的所有元組(語(yǔ)句級(jí)觸發(fā)器)。Page5354示例7.131)CREATETRIGGERNetWorthTrigger2)AFTERUPDATEOFnetWorthONMovieExec3)REFERENCING4)OLDROWASOldTuple,5)NEWROWASNewTuple6)FOREACHROW7)WHEN(OldTWorth>NewTWorth)8)UPDATEMovieExec9)SETnetWorth=OldTWorthl0)WHEREcert#=NewTuple.cert#;觸發(fā)聲明指出觸發(fā)事件并告訴觸發(fā)器在觸發(fā)事件之前還是之后使用數(shù)據(jù)庫(kù)狀態(tài)允許觸發(fā)器的條件和動(dòng)作引用正被修改的元組。本例該子句允許給在改變之前和之后的元組命名該觸發(fā)器是每修改一個(gè)元組執(zhí)行一次的方式——行級(jí)觸發(fā)器觸發(fā)條件動(dòng)作部分55觸發(fā)器設(shè)計(jì)的選項(xiàng)1AFTER:條件測(cè)試和動(dòng)作將在觸發(fā)事件之后的數(shù)據(jù)庫(kù)狀態(tài)上被執(zhí)行。BEFORE:WHEN條件將在觸發(fā)事件執(zhí)行之前的數(shù)據(jù)庫(kù)狀態(tài)上測(cè)試。如果條件是真,則在該狀態(tài)上執(zhí)行觸發(fā)器的動(dòng)作最后執(zhí)行喚醒觸發(fā)器的事件,不管條件是否仍為真INSTEADOF:將在8.2.3節(jié)中討論,它與視圖的修改有關(guān)。56觸發(fā)器設(shè)計(jì)的選項(xiàng)2UPDATEOF<屬性(組)>短語(yǔ)是UPDATE事件的可選項(xiàng)若給出該選項(xiàng),那么它定義的事件僅僅是OF保留字后列出的屬性(組)的修改。INSERTDELETEOF短語(yǔ)在INSERT或DELETE事件中不可使用,因?yàn)檫@兩個(gè)事件都是作用在整個(gè)元組上。57觸發(fā)器設(shè)計(jì)的選項(xiàng)3WHEN短語(yǔ)是可選項(xiàng)如果該短語(yǔ)缺省,則只要觸發(fā)器被喚醒,都要執(zhí)行動(dòng)作。若有該短語(yǔ),則僅當(dāng)WHEN后的條件為真時(shí)執(zhí)行動(dòng)作。58觸發(fā)器設(shè)計(jì)的選項(xiàng)4觸發(fā)器的動(dòng)作部分可以由單個(gè)或任意多個(gè)SQL語(yǔ)句組成。這些語(yǔ)句需由BEGIN…END括起,并且語(yǔ)句之間用分號(hào)分隔。59觸發(fā)器設(shè)計(jì)的選項(xiàng)5FOREACHROW:行級(jí)觸發(fā)器行級(jí)觸發(fā)器觸發(fā)事件是修改舊元組:修改之前的元組,用OLDROWAS短語(yǔ)命名新元組:修改之后的元組,用NEWROWAS短語(yǔ)命名行級(jí)觸發(fā)器觸發(fā)事件是插入舊元組:OLDROWAS不可使用新元組:使用NEWROWAS短語(yǔ)命名被插入的元組行級(jí)觸發(fā)器觸發(fā)事件是刪除舊元組:OLDROWAS被用于命名被刪除的元組新元組:NEWROWAS不可使用60觸發(fā)器設(shè)計(jì)的選項(xiàng)6FOREACHSTATEMENT:語(yǔ)句級(jí)觸發(fā)器[默認(rèn)]一旦有合適類型的語(yǔ)句被執(zhí)行,語(yǔ)句級(jí)觸發(fā)器就被執(zhí)行,而不問(wèn)它實(shí)際上會(huì)影響多少元組(0個(gè)、1個(gè)或多個(gè))例如:如果用SQL更新語(yǔ)句更新整個(gè)表語(yǔ)句級(jí)的修改觸發(fā)器將只執(zhí)行一次元組級(jí)觸發(fā)器將對(duì)要修改的元組一次一個(gè)地執(zhí)行。61觸發(fā)器設(shè)計(jì)的選項(xiàng)7語(yǔ)句級(jí)觸發(fā)器中不能直接引用舊的和新的元組任何觸發(fā)器(元組級(jí)或語(yǔ)句級(jí))都可引用舊元組(刪除的元組或更新的元組的舊版本)的關(guān)系和新元組(插入元組或更新元組的新版本)的關(guān)系聲明方式OLDTABLEASOldStuffNEWTABLEASNewSuff62關(guān)于OldStuff和NewSuff的說(shuō)明語(yǔ)句級(jí)觸發(fā)器觸發(fā)事件是修改NewStuff和OldStuff中分別是被更新元組的新版本和舊版本語(yǔ)句級(jí)觸發(fā)器觸發(fā)事件是刪除刪除元組是OldStuff,不能聲明NewStuff語(yǔ)句級(jí)觸發(fā)器觸發(fā)事件是插入插入的元組是NewStuff,不能聲明OldStuff63示例7.14假定要阻止電影制作人的平均凈資產(chǎn)值降到$500000對(duì)關(guān)系MovieExec(

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論