數(shù)據(jù)庫第7章約束和觸發(fā)器_第1頁
數(shù)據(jù)庫第7章約束和觸發(fā)器_第2頁
數(shù)據(jù)庫第7章約束和觸發(fā)器_第3頁
數(shù)據(jù)庫第7章約束和觸發(fā)器_第4頁
數(shù)據(jù)庫第7章約束和觸發(fā)器_第5頁
已閱讀5頁,還剩70頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、第7章 約束和觸發(fā)器主講人:駱炎民Email: 2主要內(nèi)容7.1 鍵和外鍵 7.2 屬性和元組上的約束 7.3 修改約束 7.4 斷言 7.5 觸發(fā)器 SQL提供了各種技術(shù)把完整性約束作為數(shù)據(jù)庫模式的一部分。鍵約束,它將一個(gè)或一組屬性聲明為一個(gè)關(guān)系的鍵。SQL支持引用完整性,稱為“外鍵約束” ,指一個(gè)關(guān)系中的一個(gè)或一組屬性的值也必須在另一個(gè)關(guān)系的一個(gè)或一組屬性的值中出現(xiàn)。SQL也允許屬性上、元組上和關(guān)系之間的約束。關(guān)系之間的約束稱為“斷言”?!坝|發(fā)器”是主動(dòng)元素的一種形式,它在某個(gè)特定事件發(fā)生時(shí)被調(diào)用,例如對(duì)一個(gè)特定關(guān)系的插入事件。3主動(dòng)(active)元素主動(dòng)元素是一個(gè)表達(dá)式或語句,只需編寫

2、一次存儲(chǔ)在數(shù)據(jù)庫中,然后在適當(dāng)?shù)臅r(shí)間被執(zhí)行。主動(dòng)元素的執(zhí)行可以是由于某個(gè)特定事件引發(fā),如對(duì)關(guān)系插入元組,或者是當(dāng)修改數(shù)據(jù)庫的值引起某個(gè)邏輯值為真等。4SQL中完整性約束的幾種方法鍵約束 參照完整性約束域的約束 基于屬性/元組的CHECK約束斷言 (整個(gè)關(guān)系或關(guān)系間的約束) 觸發(fā)器(編程者指定觸發(fā)時(shí)刻 一組命令)51. SQL中的鍵約束和單值約束鍵約束(主鍵約束)用 PRIMARY KEY 表示 (唯一 非空)單值約束(可用于標(biāo)識(shí)候選鍵)用 UNIQUE 表示 (唯一 可空)基本表中只能有一個(gè) 主鍵可以有多個(gè)UNIQUE 說明6(1)主鍵的定義主鍵由關(guān)系的一個(gè)或多個(gè)屬性組成在建表時(shí)說明法1:在列

3、出屬性時(shí),說明某個(gè)屬性為主鍵法2:加入額外說明,說明某個(gè)或一組屬性為主鍵7主鍵說明示例1 CREATE TABLE MovieStars( name CHAR(30) PRIMARY KEY, address VARCHAR(255), gender CHAR(1), birthdate DATETIME ); 法1: 單個(gè)屬性name為主鍵,主鍵約束出現(xiàn)在屬性說明中, PRIMARY KEY (name) ); 法2: 單獨(dú)說明屬性name為主鍵 8主鍵說明示例2CREATE TABLE Movies ( title VARCHAR(50), year CHAR(4), . producer

4、C# INT, PRIMARY KEY (title,year); 組合碼做主鍵,必須單獨(dú)說明9(2) 單值約束的定義示例 CREATE TABLE MovieStars( name CHAR(30) PRIMARY KEY, address VARCHAR(255), gender CHAR(1) UNIQUE , birthdate DATETIME ) ; UNIQUE (address) ; ,10PRIMARY KEY 與UNIQUE細(xì)微差別1. 外鍵只能參照某個(gè)關(guān)系的主鍵2. DBMS的實(shí)現(xiàn)常常:為主鍵建索引按主鍵排序112. 外鍵約束聲明外鍵:若關(guān)系R的一個(gè)屬性(組) X,不是R

5、的主鍵,而與另一個(gè)關(guān)系S的主鍵相對(duì)應(yīng),則稱X為關(guān)系R的外鍵稱R為參照關(guān)系、稱S為被參照關(guān)系。外鍵約束是一個(gè)斷言,它判定一個(gè)關(guān)系中的非空外鍵,必須在另一個(gè)關(guān)系的主鍵中出現(xiàn)。考慮如下關(guān)系 : Studios (name, address, presC# ) 參照關(guān)系 MovieExecs (name, address, cert# , netWorth) 被參照關(guān)系外鍵12(1) 聲明外鍵的兩種方法單一屬性作外鍵 在屬性定義后加 REFERENCES ()單獨(dú)說明一個(gè)或多個(gè)屬性為外鍵 FOREIGN KEY () REFERENCE ()13示例7.1Studio(name,address,pre

6、sC#) 參照關(guān)系 MovieExec(name,address,certs,netWorth) 被參照關(guān)系 要說明關(guān)系 Studio的外鍵是presC#,引用MovieExec的主鍵cert#屬性。直接聲明presC#引用cert#的語句如下: CREATE TABLE Studio ( 在屬性定義中說明外鍵 name CHAR(30) PRIMARY KEY, address VARCHAR(255), presC# INT REFERENCES MovieExec(cert#); CREATE TABLE Studio( 單獨(dú)說明外鍵 name CHAR(30) PRIMARY KEY,

7、 address VARCHAR(255), presC# INT, FOREIGN KEY (presC#) REFERENCES MovieExec(certS);外鍵為組合碼時(shí),必須單獨(dú)說明14(2) 維護(hù)引用完整性對(duì)于上例,DBMS將阻止如下行為對(duì)Studio插入一新元組,其presC#值非空,但是它不是MovieExec關(guān)系中任何元組的cert#值。修改Studio關(guān)系元組的presC#屬性為非空值,但是該值不是MovieExec關(guān)系中任何元組的cert#值。刪除MovieExec元組,該元組的cert#值非空,是一個(gè)或多個(gè)Studio元組的presC#值。修改MoivExec元組的

8、cert#值,而舊的cert#值是某電影公司的presC#值。這兩種更新是在聲明了外鍵約束的關(guān)系(Studio)上做的修改;別無選擇,系統(tǒng)必須拒絕這種違法修改。后兩種更新是在被引用關(guān)系(MovieExec)上做的修改;設(shè)計(jì)者可以有三個(gè)選擇:(a) 缺省原則(b) 級(jí)聯(lián)原則(c) 置空值原則15考慮兩組示例關(guān)系示例1: Students(Sno,Sname,Sage) (主表) SC(Sno,Cno,Grade) (子表) Courses(Cno,Cname,Ccredit) (主表)示例2: Eoyees(Eno,Ename,Eage,Dno) (子表) Departments(Dno,Dna

9、me,Phonempl) (主表)參照關(guān)系:子表(子記錄)被參照關(guān)系:主表(主記錄)1616方案1: 缺省原則-拒絕非法更新 a.插子記錄必須有對(duì)應(yīng)的主記錄 如果插入選課記錄(020506,25,90) 課程表中沒有25號(hào)課程 則禁止插入 1717 b. 改子記錄必須有對(duì)應(yīng)的主記錄 如果選課記錄改為(020506,25,90) 課程表中沒有25號(hào)課程 則禁止修改1818 c. 有子記錄時(shí)禁止刪除主記錄 有020506的選課記錄時(shí), 不許刪除Student中 020506的記錄 d.有子記錄時(shí)禁止修改主記錄 有020506的選課記錄 欲將Student表中的020506改為030712 則禁止修

10、改1919方案2: 級(jí)聯(lián)原則 在刪除和更新主表時(shí)對(duì)子表進(jìn)行級(jí)聯(lián)處理. a. 刪除主記錄 同時(shí)刪除子記錄 刪除Students中020506的記錄 同時(shí)刪除020506的所有選課記錄 2020 b.更新主記錄 同時(shí)更新子記錄 更新Students中020506的學(xué)號(hào)為030712 同時(shí)更新020506的所有選課記錄的 學(xué)號(hào)為0307122121方案3: 置空值原則 在刪除和更新主表時(shí)對(duì)子表進(jìn)行置空處理. a. 刪除主記錄 同時(shí)將子記錄外鍵改為NULL 刪除部門表中4號(hào)部門信息 同時(shí)將4號(hào)部門的20個(gè)職工記錄的部門號(hào) 置空 2222 b.更新主記錄 同時(shí)將子記錄外鍵改為NULL 修改部門表中4號(hào)部

11、號(hào)為14號(hào) 同時(shí)將4號(hào)部門的20個(gè)職工記錄的部門號(hào) 置空 23三個(gè)選項(xiàng)的聲明方法這些選項(xiàng)可獨(dú)立地選擇刪除和修改,并且它們同外鍵一起聲明。聲明的方法是在ON DELETE或ON UPDATE后面加上SET NULL或CASCADE選項(xiàng)。示例7.2: 1) CREATE TABLE Studio( 2) name CHAR(30)PRIMARY KEY, 3) address VARCHAR(255), 4) presC# INT REFERENCES MovieExec(cert#)5) ON DELETE SET NULL 6) ON UPDATE CASCADE); 24使用特點(diǎn)該例中置空原

12、則使刪除具有更多的含義,而級(jí)聯(lián)原則更適于修改。電影公司經(jīng)理退休時(shí),電影公司仍然存在,其經(jīng)理屬性值在經(jīng)理沒有確定前要取空值。電影公司經(jīng)理證書號(hào)的修改更像是辦事員的變更。此時(shí)人員繼續(xù)存在,而且將是該電影公司的經(jīng)理,因此Studio中presC#屬性值也應(yīng)該隨著改變25(3) 延遲約束檢查問題:循環(huán)約束 Studio (name, address, presC#)電影公司信息 MovieExec (name, address, cert#, netWorth)制片人信息同時(shí)給出兩個(gè)外鍵約束:聲明presC#是Studio的外鍵,參照關(guān)系MovieExec的主鍵certs聲明cert#是MovieEx

13、ec 的外鍵,參照關(guān)系Studio的屬性presC#造成循環(huán)約束26示例7.3如果一個(gè)新制片人要新建一個(gè)電影公司,并擔(dān)任電影公司的經(jīng)理。如果先在關(guān)系Studio中插入電影公司的信息,則由于Studio 外鍵presC#參照的MovieExec 關(guān)系中的certs屬性尚未存在,從而違反外鍵約束。相反如果先在關(guān)系MovieExec中插入制片人信息,則由于MovieExec外鍵certs參照的Studio關(guān)系中的presC#屬性尚未存在,從而也違反外鍵約束。27解決辦法首先,必須將兩個(gè)插入操作(一個(gè)插入Studio,另一個(gè)插入MovieExec)組成一個(gè)單一事務(wù)。然后,需要有一種方法通知DBMS不要

14、檢查其約束,直到整個(gè)事務(wù)完成執(zhí)行并要提交為止。即延遲約束檢查。28延遲約束檢查的設(shè)置任何約束的聲明后面可以有兩個(gè)選項(xiàng)NOT DEFERRABLE (缺省值)每次執(zhí)行一條數(shù)據(jù)庫更新語句時(shí),如果該更新可能違反外鍵約束,則隨后立即檢查該約束。DEFERRABLE約束檢查可以推遲到當(dāng)前事務(wù)完成時(shí)進(jìn)行。DEFERRABLE后也可以有兩個(gè)選項(xiàng)INITIALLY DEFERRED:檢查被推遲到事務(wù)提交前執(zhí)行INITIALLY IMMEDIATE:檢查在每個(gè)語句后立即被執(zhí)行(缺省)29區(qū)分DEFERRABLE INITIALLY IMMEDIATE默認(rèn)檢查在每個(gè)語句后立即被執(zhí)行。但在需要的時(shí)候,可以隨時(shí)將約束

15、檢查延后。在這種情況下該選項(xiàng)非常有用:多數(shù)時(shí)候需要在每個(gè)語句后立即檢查約束,但偶爾有一批工作需要將約束檢查延后。NOT DEFERRABLE永遠(yuǎn)無法將約束檢查延后至事務(wù)提交時(shí)30延遲約束檢查示例CREATE TABLE Studio ( name CHAR(30)PRIMARY KEY, address VARCHAR(255), presC# INT UNIQUE REFERENCES MovieExec(cert#) DEFERRABLE INITIALLY DEFERRED ); 31延遲約束檢查修改任何類型的約束都可以命名假設(shè)將上例的參照完整性約束命名為MyConstraint,則可以

16、用如下SQL語句將該約束從延遲約束檢查改為立即檢查:SET CONSTRAINT MyConstraint IMMEDIATE ;32主要內(nèi)容7.1 鍵和外鍵 7.2 屬性和元組上的約束 7.3 修改約束 7.4 斷言 7.5 觸發(fā)器 33屬性和元組上的約束在SQL的CREATE TABLE語句中可以聲明兩種約束:在單一屬性上的約束在整個(gè)元組上的約束341. 非空值約束CREATE TABLE Studio ( name CHAR(30) PRIMARY KEY, address VARCHAR(255), presC# INT REFERENCES MovieExec(cert#) NOT

17、NULL);對(duì)Studio關(guān)系插入元組時(shí),不能只給出名字和地址,presC#的值不許為NULL置空值原則此處不能用。因?yàn)樵撛瓌t通知系統(tǒng),當(dāng)違反外鍵約束時(shí)要將PresC#值置空。352. 基于屬性的CHECK約束建表時(shí) 某個(gè)屬性定義后 CHECK() 是該屬性的每個(gè)值都應(yīng)滿足的,原則上可以是任何WHERE子句中允許的描述。36示例7.6-1約束證書號(hào)必須至少有6位數(shù)字CREATE TABLE Studio ( name CHAR(30) PRIMARY KEY, address VARCHAR(255), presC# INT REFERENCES MovieExec(cert#) CHECK(

18、presC#=100000);37示例7.6-2約束gender屬性的值只能取F和MCREATE TABLE MovieStars( name CHAR(30) PRIMARY KEY, address VARCHAR(255), gender CHAR(1) CHECK (gender IN (F,M), birthdate DATETIME);38CHECK約束中的如果CHECK約束中的要引用其他關(guān)系或其他屬性,則必須在中給出子查詢。其引用的“其他關(guān)系”必須是子查詢FROM子句中出現(xiàn)的關(guān)系其引用的“其他屬性”必須是子查詢FROM子句中關(guān)系的屬性(即使該關(guān)系是被檢查屬性所在的關(guān)系也須如此)。

19、39CHECK約束的使用基于屬性的CHECK約束是在元組為該屬性獲得新值(修改/插入) 時(shí)被檢查。在修改的情況下,是對(duì)新值而非舊值進(jìn)行約束檢查。如果新值違反約束,則該修改被拒絕。如果數(shù)據(jù)庫的修改沒有改變與約束相關(guān)的屬性,則不進(jìn)行基于屬性的CHECK約束檢查40示例7.7例7.7 假設(shè)用基于屬性的CHECK約束模擬引用完整性約束,要求被引用值必須存在。下面是模擬 Studio (name, address, presC#)關(guān)系中presC#值必須在關(guān)系MovieExec (name, address, cert#, netWorth)的cert#之中出現(xiàn)的錯(cuò)誤嘗試。41示例7.7(續(xù))CREAT

20、E TABLE Studios( name CHAR(30) PRIMARY KEY, address VARCHAR (255), presC# INT CHECK ( presC# IN (SELECT cert# FROM MovieExecs);插入、更新Studios時(shí) 系統(tǒng)進(jìn)行檢驗(yàn) 阻止不合理的數(shù)據(jù)進(jìn)入但刪除MovieExecs中元組時(shí),不做此校驗(yàn),可能使Studio表中出現(xiàn)若干元組,找不到相應(yīng)的cert#423. 基于元組的CHECK約束基于元組的CHECK約束:建表時(shí)在中也可用CHECK 可以是WHERE子句中出現(xiàn)的任何表達(dá)式。表達(dá)式被解釋為關(guān)系R元組上的條件。關(guān)系R的屬性都可

21、以直接出現(xiàn)在該表達(dá)式中。這一點(diǎn)與“基于屬性的CHECK約束” (其他屬性只能通過子查詢引用)不同。43基于元組的CHECK約束的使用涉及整個(gè)元組而不僅針對(duì)某一個(gè)屬性每次向R插入元組以及當(dāng)R的元組被修改時(shí),都要檢查基于元組的CHECK約束條件。違規(guī)的插入或修改語句都將被拒絕?;谠M的CHECK約束對(duì)其他關(guān)系不可見如果條件在子查詢中提及其他關(guān)系,而那個(gè)關(guān)系的改變將使關(guān)系R的某些元組對(duì)條件的計(jì)算結(jié)果為假, CHECK不能阻止這種改變。類似基于屬性的CHECK約束44示例約束男影星姓名前不能加 Ms. CREATE TABLE MovieStars( name CHAR(30) PRIMARY KE

22、Y, address VARCHAR(255) , gender CHAR(1) CHECK (gender IN (F,M) ) , birthdate DATETIME , CHECK (gender=F OR name NOT LIKE Ms.%)454. 基于元組和基于屬性的約束的比較如果元組上的約束涉及該元組的多個(gè)屬性,則它必須作為基于元組的約束。如果約束僅涉及元組的一個(gè)屬性,那么可以作為基于元組或基于屬性的約束。基于元組的約束將比基于屬性的約束更頻繁地被檢查只要該元組的任一個(gè)屬性被改變,而不是僅當(dāng)在約束中提及的屬性改變時(shí)都要檢查。46主要內(nèi)容7.1 鍵和外鍵 7.2 屬性和元組上的

23、約束 7.3 修改約束 7.4 斷言 7.5 觸發(fā)器 471. 給約束命名為了修改或刪除一個(gè)已存在的約束,約束必須有名字CREATE TABLE MovieStars( name CHAR(30) CONSTRAINT NameIsKey PRIMARY KEY, address VARCHAR(255), gender CHAR(1) CONSTRAINT NoAndro CHECK (gender IN (F,M), birthdate DATETIME, CONSTRAINT RightTitle CHECK(GENDER=F OR name NOT LIKE Ms.%);482. 修改

24、表上的約束修改延遲約束檢查SET CONSTRAINT MyConstraint DEFERRED / IMMEDIATE刪除約束ALTER TABLE MovieStar DROP CONSTRAINT NamelsKey;ALTER TABLE MovieStar DROP CONSTRAINT NoAndro;ALTER TABLE MovieStar DROP CONSTRAINT RiShtTitle;49添加約束ALTER TABLE MovieStar ADD CONSTRAINT NamelsKey PRIMARY KEY(name);ALTER TABLE MovieStar

25、 ADD CONSTRAINT NoAndro CHECK(gender IU(F,M); ALTER TABLE MovieStar ADD CONSTRAINT RightTitle CHECK(gender=F OR name NOT LIKE Ms.%);這些約束都是基于元組而不是基于屬性的檢查,不能將其恢復(fù)到基于屬性的約束。50主要內(nèi)容7.1 鍵和外鍵 7.2 屬性和元組上的約束 7.3 修改約束 7.4 斷言 7.5 觸發(fā)器 511. 創(chuàng)建斷言斷言的形式CREATE ASSERTlON CHECK()斷言建立時(shí),斷言的條件必須是真,且要永遠(yuǎn)保持是真。任何引起斷言條件為假的數(shù)據(jù)庫更新

26、都被拒絕。約束的檢查可以一直延期到事務(wù)提交前。如果對(duì)斷言也這樣做,到事務(wù)結(jié)束前它可能暫時(shí)變成假值。 已經(jīng)介紹過的其他類型CHECK約束,如果涉及子查詢,可以在某些條件下避免操作被拒絕。522. 使用斷言基于元組的CHECK約束和斷言約束在書寫方式上有差別。基于元組的檢查能直接引用在它聲明中出現(xiàn)的關(guān)系的屬性。斷言沒有如此特權(quán)。斷言條件中引用的任何屬性都必須要介紹,特別是要提及在select-from-where表達(dá)式中的關(guān)系。53示例7.13希望其凈資產(chǎn)值少于S10 000 000的人不能成為電影公司經(jīng)理。即聲明經(jīng)理凈資產(chǎn)值少于$10000000的電影公司集合是空。MovieExec (name

27、, address, cert#, netWorth)Studio (name, address, presC#)CREATE ASSERTION RichPres CHECK (NOT EXISTS ( SELECT S FROM Studio,MovieExec WHERE presC#=cert# AND netWorth10000000 ); CREATE TABLE Studios( name CHAR(30) PRIMARY KEY, address VARCHAR (255), presC# INT REFERENCES MovieExec(cert#), CHECK ( pre

28、sC# NOT IN (SELECT cert# FROM MovieExecs WHERE netWorth= ALL (SELECT SUM(length) FROM Movies GROUP BY studioName) ); CHECK(10000 = ALL (SELECT SUM(1ength) FROM Movies GROUP DY studioName);必須=刪除元組時(shí)仍有可能違反該約束P21455CHECK 約束與斷言的區(qū)別約束類型聲明的位置動(dòng)作的時(shí)間確保成立?基于屬性的CHECK屬性對(duì)關(guān)系插入元組或?qū)傩孕薷臅r(shí)如果是子查詢,則不能確?;谠M的CHECK關(guān)系模式 元素對(duì)關(guān)

29、系插入元組或?qū)傩孕薷臅r(shí)如果是子查詢,則不能確保斷言數(shù)據(jù)庫模式元素對(duì)任何涉及的關(guān)系做改變時(shí)是563.刪除斷言DROP ASSERTION 57主要內(nèi)容7.1 鍵和外鍵 7.2 屬性和元組上的約束 7.3 修改約束 7.4 斷言 7.5 觸發(fā)器 58觸發(fā)器也稱事件-條件-動(dòng)作規(guī)則(event-condition-action-rule: ECA)觸發(fā)器與前面已介紹的幾種約束有如下三點(diǎn)不同僅當(dāng)數(shù)據(jù)庫程序員聲明的事件發(fā)生時(shí),觸發(fā)器被激活。 如插入、刪除、修改或事務(wù)的結(jié)束等當(dāng)觸發(fā)器被事件激活時(shí),觸發(fā)器測(cè)試觸發(fā)的條件。如果條件不成立,則響應(yīng)該事件的觸發(fā)器不做任何事情。 如果觸發(fā)器聲明的條件滿足,則與該觸發(fā)

30、器相連的動(dòng)作由DBMS執(zhí)行。動(dòng)作可以是任何數(shù)據(jù)庫操作序列,包括與觸發(fā)事件毫無關(guān)聯(lián)的操作。59SQL觸發(fā)器語句的主要特征1.觸發(fā)器的條件檢查和動(dòng)作可在觸發(fā)事件執(zhí)行前的數(shù)據(jù)庫的狀態(tài)上或在觸發(fā)動(dòng)作被執(zhí)行后的狀態(tài)上執(zhí)行。2.條件和動(dòng)作可引用元組的舊值和或觸發(fā)事件中更新的元組的新值。3.更新事件可被局限到某個(gè)特定的屬性或某些屬性。4.程序員可選擇動(dòng)作執(zhí)行的方式:a)一次只對(duì)一個(gè)更新元組(行級(jí)觸發(fā)器) b)一次針對(duì)在數(shù)據(jù)庫操作中被改變的所有元組 (語句級(jí)觸發(fā)器)60示例7.151) CREATE TRIGGER NetWorthTrigger2) AFTER UPDATE OF netWorth ON M

31、ovieExec3) REFERENCING4) OLD ROW AS OldTuple,5) NEW ROW AS NewTuDle6) FOR EACH ROW7) WHEN ( Worth Worth)8) UPDATE MovieExec9) SET netWorth= Worthl0) WHERE cert#=NewTuple.cert#; 觸發(fā)聲明指出觸發(fā)事件并告訴觸發(fā)器在觸發(fā)事件之前還是之后使用數(shù)據(jù)庫狀態(tài)允許觸發(fā)器的條件和動(dòng)作引用正被修改的元組。本例該子句允許給在改變之前和之后的元組命名該觸發(fā)器是每修改一個(gè)元組執(zhí)行一次的方式行級(jí)觸發(fā)器觸發(fā)條件動(dòng)作部分61觸發(fā)器設(shè)計(jì)的選項(xiàng)1AFTE

32、R:條件測(cè)試和動(dòng)作將在觸發(fā)事件之后的數(shù)據(jù)庫狀態(tài)上被執(zhí)行。BEFORE:WHEN條件將在觸發(fā)事件執(zhí)行之前的數(shù)據(jù)庫狀態(tài)上測(cè)試。如果條件是真,則在該狀態(tài)上執(zhí)行觸發(fā)器的動(dòng)作最后執(zhí)行喚醒觸發(fā)器的事件,不管條件是否仍為真INSTEAD OF:將在8.2.3節(jié)中討論,它與視圖的修改有關(guān)。62觸發(fā)器設(shè)計(jì)的選項(xiàng)2UPDATEOF 短語是UPDATE事件的可選項(xiàng)若給出該選項(xiàng),那么它定義的事件僅僅是OF保留字后列出的屬性(組)的修改。INSERTDELETEOF短語在INSERT或DELETE事件中不可使用,因?yàn)檫@兩個(gè)事件都是作用在整個(gè)元組上。63觸發(fā)器設(shè)計(jì)的選項(xiàng)3WHEN短語是可選項(xiàng)如果該短語缺省,則只要觸發(fā)器被

33、喚醒,都要執(zhí)行動(dòng)作。若有該短語,則僅當(dāng)WHEN后的條件為真時(shí)執(zhí)行動(dòng)作。64觸發(fā)器設(shè)計(jì)的選項(xiàng)4觸發(fā)器的動(dòng)作部分可以由單個(gè)或任意多個(gè)SQL語句組成。這些語句需由BEGINEND括起,并且語句之間用分號(hào)分隔。 65觸發(fā)器設(shè)計(jì)的選項(xiàng)5FOR EACH ROW:行級(jí)觸發(fā)器行級(jí)觸發(fā)器觸發(fā)事件是修改舊元組:修改之前的元組,用OLD ROW AS短語命名新元組:修改之后的元組,用NEW ROW AS短語命名行級(jí)觸發(fā)器觸發(fā)事件是插入舊元組: OLD ROW AS不可使用新元組:使用NEW ROW AS短語命名被插入的元組行級(jí)觸發(fā)器觸發(fā)事件是刪除舊元組: OLD ROW AS被用于命名被刪除的元組新元組: NEW

34、 ROW AS不可使用66觸發(fā)器設(shè)計(jì)的選項(xiàng)6FOR EACH STATEMENT:語句級(jí)觸發(fā)器默認(rèn)一旦有合適類型的語句被執(zhí)行,語句級(jí)觸發(fā)器就被執(zhí)行,而不問它實(shí)際上會(huì)影響多少元組(0個(gè)、1個(gè)或多個(gè))例如:如果用SQL更新語句更新整個(gè)表語句級(jí)的修改觸發(fā)器將只執(zhí)行一次元組級(jí)觸發(fā)器將對(duì)要修改的元組一次一個(gè)地執(zhí)行。67觸發(fā)器設(shè)計(jì)的選項(xiàng)7語句級(jí)觸發(fā)器中不能直接引用舊的和新的元組任何觸發(fā)器(元組級(jí)或語句級(jí))都可引用舊元組(刪除的元組或更新的元組的舊版本)的關(guān)系和新元組(插入元組或更新元組的新版本)的關(guān)系聲明方式OLD TABLE AS OldStuffNEW TABLE AS NewSuff68關(guān)于OldS

35、tuff和NewSuff的說明語句級(jí)觸發(fā)器觸發(fā)事件是修改NewStuff和OldStuff中分別是被更新元組的新版本和舊版本語句級(jí)觸發(fā)器觸發(fā)事件是刪除刪除元組是OldStuff,不能聲明NewStuff語句級(jí)觸發(fā)器觸發(fā)事件是插入插入的元組是NewStuff,不能聲明OldStuff69示例7.14假定要阻止電影制作人的平均凈資產(chǎn)值降到$500000對(duì)關(guān)系MovieExec (name, address, cert#, netWorth)的netWorth列做插入、刪除或修改時(shí)可能會(huì)違反上述約束注意:可在一個(gè)語句中插入、刪除或修改MovieExec的許多元組。修改期間平均凈資產(chǎn)值可暫低于$500

36、 000 ;當(dāng)所有變更結(jié)束時(shí),其凈資產(chǎn)值將超過$500 000約束要做的工作:若語句執(zhí)行結(jié)束后,凈資產(chǎn)值仍低于$500 000,則整組更新操作被拒絕。70示例7.14(續(xù))對(duì)于關(guān)系MovieExec的插入、刪除和修改這三個(gè)事件有必要分別寫一個(gè)觸發(fā)器。下面只給出了修改事件的觸發(fā)器。插入和刪除事件的觸發(fā)器與此類似。71示例7.14(續(xù)) 1) CREATE TRIGGER AvgNetWorthTrigger 2) AFTER UPDATE OF netWorth ON MovieExec 3) REFERENCING 4) OLD TABLE AS OldStuff, 5) NEW TABLE AS NewStuff 6) FOR EACH STATEMENT 7

溫馨提示

  • 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)論