




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、1第第7章章 約束和觸發(fā)器約束和觸發(fā)器第7章 約束和觸發(fā)器2SQL中約束種類(lèi)中約束種類(lèi)n數(shù)據(jù)庫(kù)設(shè)計(jì)質(zhì)量體現(xiàn)為約束數(shù)據(jù)庫(kù)設(shè)計(jì)質(zhì)量體現(xiàn)為約束constraints所提供的可靠性保障。約束以表達(dá)式或所提供的可靠性保障。約束以表達(dá)式或語(yǔ)句的形式存儲(chǔ)在數(shù)據(jù)庫(kù)中。約束是一語(yǔ)句的形式存儲(chǔ)在數(shù)據(jù)庫(kù)中。約束是一種主動(dòng)性種主動(dòng)性(active)元素,當(dāng)數(shù)據(jù)庫(kù)特定元素,當(dāng)數(shù)據(jù)庫(kù)特定狀態(tài)發(fā)生改變時(shí)自動(dòng)運(yùn)行。狀態(tài)發(fā)生改變時(shí)自動(dòng)運(yùn)行。nSQL2提供部分完整性約束:鍵、參照完提供部分完整性約束:鍵、參照完整性、域約束、元組約束等。整性、域約束、元組約束等。nSQL3提供觸發(fā)器提供觸發(fā)器trigger機(jī)制:由特定機(jī)制:由特定
2、事件觸發(fā)某種主動(dòng)性元素。事件觸發(fā)某種主動(dòng)性元素。 第7章 約束和觸發(fā)器37.1 鍵和外鍵鍵和外鍵第7章 約束和觸發(fā)器4鍵與外鍵鍵與外鍵n鍵鍵key是最重要的約束。每個(gè)表都必須確定自是最重要的約束。每個(gè)表都必須確定自己的鍵。己的鍵。n每個(gè)表都可能有多個(gè)屬性集可作為鍵,稱(chēng)為每個(gè)表都可能有多個(gè)屬性集可作為鍵,稱(chēng)為“候選鍵候選鍵candicate key”。n一個(gè)表只能確定一個(gè)主鍵一個(gè)表只能確定一個(gè)主鍵(Primary Key)。n若某個(gè)屬性說(shuō)明為若某個(gè)屬性說(shuō)明為Unique,則它是一個(gè)候選,則它是一個(gè)候選鍵。鍵。n若關(guān)系的某個(gè)屬性說(shuō)明為外鍵,則該屬性出現(xiàn)若關(guān)系的某個(gè)屬性說(shuō)明為外鍵,則該屬性出現(xiàn)的值,
3、一定會(huì)在另一個(gè)關(guān)系的主鍵中出現(xiàn)。的值,一定會(huì)在另一個(gè)關(guān)系的主鍵中出現(xiàn)。第7章 約束和觸發(fā)器5主鍵聲明主鍵聲明n如何說(shuō)明表中的主鍵?如何說(shuō)明表中的主鍵? SQL語(yǔ)言有兩種說(shuō)明主鍵的方式。語(yǔ)言有兩種說(shuō)明主鍵的方式。方式方式1:Create Table語(yǔ)句中,某屬性語(yǔ)句中,某屬性說(shuō)明之后加說(shuō)明之后加Primary Key方式方式2:屬性表之后,加:屬性表之后,加Primary Key(屬性屬性1,屬性,屬性2,)u若主鍵有多個(gè)屬性,則只能用方式若主鍵有多個(gè)屬性,則只能用方式2。uGUI操作方式更方便直觀。操作方式更方便直觀。第7章 約束和觸發(fā)器6用用UNIQUE聲明鍵聲明鍵n如何說(shuō)明表中的主鍵?如何
4、說(shuō)明表中的主鍵? SQL語(yǔ)言有兩種說(shuō)明主鍵的方式。語(yǔ)言有兩種說(shuō)明主鍵的方式。方式方式1:Create Table語(yǔ)句中,某屬性語(yǔ)句中,某屬性說(shuō)明之后加說(shuō)明之后加UNIQUE方式方式2:屬性表之后,加:屬性表之后,加UNIQUE(屬性屬性1,屬性,屬性2,)u若用若用UNIQUE說(shuō)明鍵有多個(gè)屬性,則只說(shuō)明鍵有多個(gè)屬性,則只能用方式能用方式2。uGUI操作方式更方便直觀操作方式更方便直觀第7章 約束和觸發(fā)器7例子例子n考慮關(guān)系考慮關(guān)系SalesMan的模式的模式(方式方式1) CREATE TABLE SalesMan( empid VARCHAR (10) PRIMARY KEY, idno V
5、ARCHAR (18) UNIQUE, name VARCHAR (30), gender CHAR(1), birthday DATE, address VARCHAR(255), phone VARCHAR(13) );第7章 約束和觸發(fā)器8例子例子n考慮關(guān)系考慮關(guān)系SalesMan的模式的模式(方式方式2) CREATE TABLE SalesMan( empid VARCHAR (10), idno VARCHAR (18), name VARCHAR (30), gender CHAR(1), birthday DATE, address VARCHAR(255), phone VA
6、RCHAR(13), PRIMARY KEY(empid), UNIQUE(idno) );第7章 約束和觸發(fā)器9主鍵和主鍵和Unique屬性之間有何區(qū)別和聯(lián)系屬性之間有何區(qū)別和聯(lián)系n一個(gè)表有且僅有一個(gè)主鍵;而一個(gè)表有且僅有一個(gè)主鍵;而Unique屬性可屬性可有多個(gè)或沒(méi)有。有多個(gè)或沒(méi)有。n主鍵是單個(gè)屬性,則該屬性隱含為主鍵是單個(gè)屬性,則該屬性隱含為Unique。n主鍵不允許有主鍵不允許有NULL值,屬性為值,屬性為Unique則允許則允許有有NULL值。值。n若主鍵是多個(gè)屬性,則每個(gè)屬性都不可能為若主鍵是多個(gè)屬性,則每個(gè)屬性都不可能為Unique。nDBMS對(duì)主鍵往往自動(dòng)賦予一些特征,如建立對(duì)
7、主鍵往往自動(dòng)賦予一些特征,如建立索引索引index等。等。第7章 約束和觸發(fā)器10強(qiáng)制鍵約束強(qiáng)制鍵約束n什么操作會(huì)導(dǎo)致違背鍵約束?什么操作會(huì)導(dǎo)致違背鍵約束?對(duì)表的對(duì)表的delete操作不會(huì)違背該表的鍵約操作不會(huì)違背該表的鍵約束。束。insert和和update可能違背該表的鍵約束??赡苓`背該表的鍵約束。nSQL實(shí)施主鍵約束即是在實(shí)施主鍵約束即是在insert和和update時(shí)檢驗(yàn)鍵值,避免空值或重復(fù)鍵時(shí)檢驗(yàn)鍵值,避免空值或重復(fù)鍵值。值。第7章 約束和觸發(fā)器11外鍵約束聲明外鍵約束聲明n如何說(shuō)明外鍵如何說(shuō)明外鍵 兩種兩種SQL方式:方式:方式方式1:某屬性之后加:某屬性之后加references
8、 (被參照屬性被參照屬性)。方式方式2:屬性表之后加:屬性表之后加foreign key references (被被參照屬性參照屬性)。 其中:被參照屬性應(yīng)是被參照表的其中:被參照屬性應(yīng)是被參照表的Primary Key或或unique屬性。屬性。第7章 約束和觸發(fā)器12例子例子n例:例:CREATE TABLE StarsIn( Movietitle VARCHAR(90) NOT NULL, Movieyear INT NOT NULL , StarName VARCHAR(30) NOT NULL, PRIMARY KEY (Movietitle, Movieyear, StarNam
9、e), FOREIGN KEY (Movietitle, Movieyear) References Movie(title, year), FOREIGN KEY StarName References Stars(name) );第7章 約束和觸發(fā)器13外鍵約束聲明外鍵約束聲明n是否可定義一個(gè)表參照自己?是否可定義一個(gè)表參照自己?可以??梢浴?例如:例如:salesman(empid, idno, name, managerid, deptid, )n外鍵是否可取外鍵是否可取NULL值?值?可以。可以。第7章 約束和觸發(fā)器14維護(hù)引用完整性維護(hù)引用完整性n數(shù)據(jù)庫(kù)更新時(shí)如何保證參照完整性數(shù)據(jù)
10、庫(kù)更新時(shí)如何保證參照完整性? 有三種可選策略,以保證參照完整性:有三種可選策略,以保證參照完整性:n1 Restrict限制限制(缺省缺省)n2 Cascade級(jí)聯(lián)級(jí)聯(lián)n3 Set Null置空置空第7章 約束和觸發(fā)器15Restrict限制限制(缺省缺省)n以以StarsIn(movieTitle,MovieYear, )參照參照Movie(title,year, ) 為例:為例:n對(duì)于對(duì)于StarsIn (參照表參照表),下面操作被拒絕:,下面操作被拒絕:ninsert語(yǔ)句中語(yǔ)句中movieTitle和和MovieYear值不值不是是Movie中已有的一個(gè)主鍵值。中已有的一個(gè)主鍵值。nup
11、date語(yǔ)句中改變語(yǔ)句中改變movieTitle和和MovieYear值為不是值為不是Movie中已有的主鍵值。中已有的主鍵值。n對(duì)于對(duì)于Movie(被參照表被參照表),Restrict拒絕以下操拒絕以下操作:作:ndelete語(yǔ)句刪除一個(gè)被語(yǔ)句刪除一個(gè)被StarsIn參照的元組。參照的元組。nupdate語(yǔ)句修改一個(gè)被語(yǔ)句修改一個(gè)被StarsIn參照的參照的title和和year主鍵值。主鍵值。第7章 約束和觸發(fā)器16Cascade級(jí)聯(lián)級(jí)聯(lián)n影響被參照表的影響被參照表的delete和和update操作。操作。n以以StarsIn(movieTitle,MovieYear, )參照參照Movi
12、e(title,year, ) 為例:為例:n當(dāng)當(dāng)Movie (被參照表被參照表)delete刪除某個(gè)元組刪除某個(gè)元組時(shí),時(shí),StarsIn (參照表參照表)中所有參照元組被自中所有參照元組被自動(dòng)刪除。動(dòng)刪除。n當(dāng)當(dāng)Movie (被參照表被參照表)update修改某個(gè)元組修改某個(gè)元組的的title或或year值時(shí),值時(shí),StarsIn (參照表參照表)中所中所有參照元組被自動(dòng)修改。有參照元組被自動(dòng)修改。第7章 約束和觸發(fā)器17Set Null置空置空n影響被參照表的影響被參照表的delete和和update操作。操作。n以以Movie(title,year, , ProducerC#)參照參照
13、MovieExec(name, ,cert#, )為例:為例:n首先首先ProducerC#應(yīng)允許應(yīng)允許NULL。n當(dāng)當(dāng)MovieExec (被參照表被參照表)delete刪除某個(gè)元組時(shí),刪除某個(gè)元組時(shí),Movie (參照表參照表)中所有參照元組的中所有參照元組的ProducerC#被被置空。置空。n當(dāng)當(dāng)MovieExec (被參照表被參照表)update修改某個(gè)元組的修改某個(gè)元組的cert#時(shí),時(shí),Movie (參照表參照表)中所有參照元組的中所有參照元組的ProducerC#被置空。被置空。第7章 約束和觸發(fā)器18維護(hù)引用完整性策略的語(yǔ)法維護(hù)引用完整性策略的語(yǔ)法n這些策略可在說(shuō)明外鍵的同時(shí)
14、描述。這些策略可在說(shuō)明外鍵的同時(shí)描述。 references (屬性屬性表表)Action 其中:其中: Action: ON Update | Delete Restrict | Cascade | Set Null 第7章 約束和觸發(fā)器19例子例子CREATE TABLE Movie( title VARCHAR(90) NOT NULL, year INT NOT NULL, length INT, colorIn CHAR(1) NOT NULL, producerC# INT, PRIMARY KEY (title,year), FOREIGN KEY producerC# Refe
15、rences MovieExec(cert#) ON DELETE CASCADE ON UPDATE CASCADE);u注意:對(duì)于一個(gè)外鍵,注意:對(duì)于一個(gè)外鍵,Update和和Delete可分別采用可分別采用不同的策略。不同的策略。第7章 約束和觸發(fā)器20“懸掛元組懸掛元組” dangling tuples n什么是什么是“懸掛元組懸掛元組” dangling tuples?對(duì)于參照關(guān)系對(duì)于參照關(guān)系A(chǔ),外鍵值未出現(xiàn)在被參照表中,外鍵值未出現(xiàn)在被參照表中的元組,即違背參照完整性的元組。的元組,即違背參照完整性的元組。n如何避免出現(xiàn)如何避免出現(xiàn)“懸掛元組懸掛元組”?1 Restrict策略:在
16、參照關(guān)系中對(duì)產(chǎn)生懸掛元組策略:在參照關(guān)系中對(duì)產(chǎn)生懸掛元組的操作予以禁止。的操作予以禁止。2 Cascade策略:自動(dòng)刪除或修改產(chǎn)生出來(lái)的策略:自動(dòng)刪除或修改產(chǎn)生出來(lái)的懸掛元組。懸掛元組。3 Set Null策略:產(chǎn)生出來(lái)的每個(gè)懸掛元組的外策略:產(chǎn)生出來(lái)的每個(gè)懸掛元組的外鍵值置空鍵值置空NULL,使其不參照任何元組。,使其不參照任何元組。第7章 約束和觸發(fā)器217.2 屬性和元組上的約束屬性和元組上的約束第7章 約束和觸發(fā)器22屬性值約束屬性值約束n限制某些屬性的值在特定范圍內(nèi)限制某些屬性的值在特定范圍內(nèi).n這類(lèi)約束可用下列方式表達(dá)這類(lèi)約束可用下列方式表達(dá):在關(guān)系式定義中給出屬性的約束。在關(guān)系式
17、定義中給出屬性的約束。在整個(gè)元組上的約束。該約束是關(guān)系模在整個(gè)元組上的約束。該約束是關(guān)系模式的一部分,不與任何屬性相關(guān)。式的一部分,不與任何屬性相關(guān)。第7章 約束和觸發(fā)器23非空約束非空約束n如何說(shuō)明某屬性非空如何說(shuō)明某屬性非空NOT NULL?在在create table指令中,屬性說(shuō)明之后加指令中,屬性說(shuō)明之后加NOT NULL;若不顯式說(shuō)明,該屬性隱含為允許空值。若不顯式說(shuō)明,該屬性隱含為允許空值。n說(shuō)明非空屬性有何效果?說(shuō)明非空屬性有何效果? 不能用不能用update修改其值為修改其值為NULL。 insert時(shí)必須指定一個(gè)非空值。時(shí)必須指定一個(gè)非空值。 不能使用外鍵的不能使用外鍵的S
18、et Null策略。策略。u注意:主鍵屬性和注意:主鍵屬性和unique屬性隱含非空;允屬性隱含非空;允許為空的屬性不可能是主鍵或許為空的屬性不可能是主鍵或unique。第7章 約束和觸發(fā)器24基于屬性的基于屬性的Check約束約束n如何限制某屬性的值在特定范圍?如何限制某屬性的值在特定范圍?在屬性說(shuō)明之后,增加在屬性說(shuō)明之后,增加check(條件條件),屬性的值應(yīng)使條件為真。屬性的值應(yīng)使條件為真。條件的語(yǔ)法與條件的語(yǔ)法與Where子句的條件一樣。子句的條件一樣。當(dāng)當(dāng)insert和和update使屬性值改變時(shí),執(zhí)使屬性值改變時(shí),執(zhí)行行check檢驗(yàn),拒絕預(yù)約屬性不一致的檢驗(yàn),拒絕預(yù)約屬性不一致
19、的更新。更新。第7章 約束和觸發(fā)器25例子例子n設(shè)有關(guān)系模式:設(shè)有關(guān)系模式: Stodio(name,address,presC#) 要求其證書(shū)號(hào)必須至少為位數(shù)字,則可寫(xiě)出約束:要求其證書(shū)號(hào)必須至少為位數(shù)字,則可寫(xiě)出約束: presC# INT REFERENCES MovieExec(cert#) CHECK(presC#=100000)n設(shè)有關(guān)系模式:設(shè)有關(guān)系模式: MovieStar(name,address,gender,birthday) 要求其性別只能為要求其性別只能為和和,則可寫(xiě)出約束:,則可寫(xiě)出約束: gender CHAR(1) CHECK(gender IN (,)第7章
20、約束和觸發(fā)器26基于屬性的基于屬性的Check約束約束n何時(shí)檢查何時(shí)檢查check條件?條件?只有當(dāng)該表執(zhí)行只有當(dāng)該表執(zhí)行insert或或update時(shí)才檢測(cè)時(shí)才檢測(cè)check條件。條件。u注意:注意:check條件中可包含其它關(guān)系的屬性,但應(yīng)避條件中可包含其它關(guān)系的屬性,但應(yīng)避免。免。例如,設(shè)有關(guān)系例如,設(shè)有關(guān)系 Stodio(name,address,presC#) 其關(guān)系中其關(guān)系中presC#值必須在關(guān)系值必須在關(guān)系 MovieExec(name,address,cert#,networth) 的的cert#之中出現(xiàn)約束,則在定義中給出約束:之中出現(xiàn)約束,則在定義中給出約束: presC
21、# INT CHECK(presC# IN(SELECT cert# FROM MovieExec) 修改或刪除修改或刪除cert#的值,使某個(gè)的值,使某個(gè)presC#對(duì)應(yīng)的鍵值不對(duì)應(yīng)的鍵值不在在MovieExec中是可能的。中是可能的。第7章 約束和觸發(fā)器27域約束域約束n域域domain 也稱(chēng)為用戶(hù)定義數(shù)據(jù)類(lèi)型也稱(chēng)為用戶(hù)定義數(shù)據(jù)類(lèi)型user-defined data type.n基于某種基本數(shù)據(jù)類(lèi)型且增加特定約束,基于某種基本數(shù)據(jù)類(lèi)型且增加特定約束,存于數(shù)據(jù)庫(kù)中,可供多個(gè)表使用。存于數(shù)據(jù)庫(kù)中,可供多個(gè)表使用。 例如:例如: CREATE DOMAIN sex integer NOT NUL
22、L DEFAULT 1 CHECK(VALUE IN(0,1) )第7章 約束和觸發(fā)器28基于元組的基于元組的Check約束約束n對(duì)某個(gè)表中元組的約束而不是對(duì)某個(gè)屬性的約束。對(duì)某個(gè)表中元組的約束而不是對(duì)某個(gè)屬性的約束。 例如:在關(guān)系模式例如:在關(guān)系模式 MovieStar(name,address,gender,birthday) 中要求每個(gè)元組的審核:如果影星為男性,則他的名中要求每個(gè)元組的審核:如果影星為男性,則他的名字不能與字不能與Ms.開(kāi)頭。開(kāi)頭。n在定義表的性質(zhì)時(shí)增加如下約束:在定義表的性質(zhì)時(shí)增加如下約束: CHECK(gender= F OR name NOT LIKE Ms.%)
23、n何時(shí)檢查何時(shí)檢查check條件?條件?只有當(dāng)該表執(zhí)行只有當(dāng)該表執(zhí)行insert或或update時(shí)才檢測(cè)時(shí)才檢測(cè)check條件。條件。u注意:如果在表中既有屬性注意:如果在表中既有屬性check也有元組也有元組check,則先檢測(cè)屬性。則先檢測(cè)屬性。第7章 約束和觸發(fā)器297.3 修改約束修改約束第7章 約束和觸發(fā)器30給約束命名給約束命名n為修改或刪除一個(gè)已經(jīng)存在的約束,約束必須有名字。為修改或刪除一個(gè)已經(jīng)存在的約束,約束必須有名字。為了命名,在約束前加保留字為了命名,在約束前加保留字CONSTRAINT和該約和該約束的名字。束的名字。例如:設(shè)有關(guān)系模式例如:設(shè)有關(guān)系模式 MovieStar
24、(name,address,gender,birthday)為其主鍵約束命名:為其主鍵約束命名: name CHAR(30) CONSTRAINT NameIsKey PRIMARY KEY為影星的性別約束命名:為影星的性別約束命名: gender CHAR(1) CONSTRAINT NoAndro CHECK(gender IN (,)第7章 約束和觸發(fā)器31修改表上的約束修改表上的約束n可用可用ALTER TABLE來(lái)修改約束。來(lái)修改約束。用保留字用保留字DROP和要?jiǎng)h除的約束名字來(lái)刪除約束。和要?jiǎng)h除的約束名字來(lái)刪除約束。用保留用保留ADD,后跟要添加的約束來(lái)實(shí)現(xiàn)約束的添加。,后跟要添加
25、的約束來(lái)實(shí)現(xiàn)約束的添加。例如:要?jiǎng)h除例如:要?jiǎng)h除MovieStar的主鍵約束的主鍵約束 ALTER TABLE MovieStar DROP NameIsKey 要添加要添加MovieStar的主鍵約束的主鍵約束 ALTER TABLE MovieStar ADD CONSTRAINT NameIsKey PRIMARY KEY(name)第7章 約束和觸發(fā)器32斷言斷言(Assertion)nSQL標(biāo)準(zhǔn)提出了一種強(qiáng)制任何條件的簡(jiǎn)標(biāo)準(zhǔn)提出了一種強(qiáng)制任何條件的簡(jiǎn)單的斷言形式,與單的斷言形式,與check類(lèi)似。類(lèi)似。n斷言的定義為斷言的定義為 CREATE ASSERTION CHECK()n當(dāng)建
26、立斷言時(shí),斷言的條件必須是真,當(dāng)建立斷言時(shí),斷言的條件必須是真,并且要永遠(yuǎn)保持為真。任何引起斷言條并且要永遠(yuǎn)保持為真。任何引起斷言條件為假的數(shù)據(jù)庫(kù)更新都被拒絕。件為假的數(shù)據(jù)庫(kù)更新都被拒絕。第7章 約束和觸發(fā)器33斷言斷言(Assertion)n斷言要寫(xiě)什么?斷言要寫(xiě)什么?在寫(xiě)斷言條件時(shí)所引用的任何屬性都必在寫(xiě)斷言條件時(shí)所引用的任何屬性都必須標(biāo)明。須標(biāo)明。n何時(shí)檢查斷言的何時(shí)檢查斷言的check條件?條件?只有當(dāng)該表執(zhí)行只有當(dāng)該表執(zhí)行insert或或update時(shí)才檢時(shí)才檢測(cè)測(cè)check條件。條件。n何時(shí)刪除斷言?何時(shí)刪除斷言?DROP ASSERTION 第7章 約束和觸發(fā)器34例子例子n假定
27、希望其凈資產(chǎn)值少于假定希望其凈資產(chǎn)值少于10000000的人不能成為制片廠經(jīng)理。的人不能成為制片廠經(jīng)理。 CREATE ASSERTION RichPres CHECK (NOT EXISTS (SELECT * FROM Studio,MovieExec WHERE presC#=cert# AND networth10000000 ) )注意與約束的區(qū)別:注意與約束的區(qū)別:CREATE TABLE Studio( name CHAR(30) PRIMARY KEY, address VARCHAR(255), presC# INT REFERENCES MovieExec(cert#),
28、CHECK (presC# NOT IN (SELECT cert# FROM MovieExec WHERE networth10000000) ) )第7章 約束和觸發(fā)器35約束的比較約束的比較n下面表格列出了基于屬性的檢查約束、基于元下面表格列出了基于屬性的檢查約束、基于元組的檢查約束和斷言之間的主要區(qū)別。組的檢查約束和斷言之間的主要區(qū)別。約束類(lèi)型約束類(lèi)型聲明的位置聲明的位置動(dòng)作的時(shí)間動(dòng)作的時(shí)間確保成立?確保成立?基于屬性的基于屬性的CHECK屬性屬性對(duì)關(guān)系插入元組對(duì)關(guān)系插入元組或?qū)傩孕薷幕驅(qū)傩孕薷娜绻亲硬樵?xún),如果是子查詢(xún),則不能確保則不能確?;谠M的基于元組的CHECK關(guān)系模式元素
29、關(guān)系模式元素對(duì)關(guān)系插入元組對(duì)關(guān)系插入元組或?qū)傩孕薷幕驅(qū)傩孕薷娜绻亲硬樵?xún),如果是子查詢(xún),則不能確保則不能確保斷言斷言數(shù)據(jù)庫(kù)模式元素?cái)?shù)據(jù)庫(kù)模式元素對(duì)任何提及的關(guān)對(duì)任何提及的關(guān)系改變系改變是是第7章 約束和觸發(fā)器367.4 觸發(fā)器觸發(fā)器第7章 約束和觸發(fā)器37觸發(fā)器觸發(fā)器(trigger)n基于特定事件觸發(fā)的特定的約束檢驗(yàn)?;谔囟ㄊ录|發(fā)的特定的約束檢驗(yàn)。u注意:各種商業(yè)數(shù)據(jù)庫(kù)可能使用不同語(yǔ)注意:各種商業(yè)數(shù)據(jù)庫(kù)可能使用不同語(yǔ)法。法。n觸發(fā)器是什么?觸發(fā)器是什么?一個(gè)觸發(fā)器一個(gè)觸發(fā)器trigger是存儲(chǔ)在某個(gè)表中的是存儲(chǔ)在某個(gè)表中的一個(gè)命名的數(shù)據(jù)庫(kù)對(duì)象。當(dāng)該表進(jìn)行某一個(gè)命名的數(shù)據(jù)庫(kù)對(duì)象。當(dāng)該表進(jìn)行
30、某種數(shù)據(jù)更新時(shí),將自動(dòng)觸發(fā)一組種數(shù)據(jù)更新時(shí),將自動(dòng)觸發(fā)一組SQL語(yǔ)語(yǔ)句的執(zhí)行。句的執(zhí)行。第7章 約束和觸發(fā)器38事件條件動(dòng)作規(guī)則事件條件動(dòng)作規(guī)則 nEvent事件:數(shù)據(jù)更新指令:事件:數(shù)據(jù)更新指令:insert / delete /updatenCondition條件:當(dāng)事件發(fā)生后,檢查條件是條件:當(dāng)事件發(fā)生后,檢查條件是否滿(mǎn)足:否滿(mǎn)足:若不滿(mǎn)足,則不執(zhí)行動(dòng)作而狀態(tài)轉(zhuǎn)移。若不滿(mǎn)足,則不執(zhí)行動(dòng)作而狀態(tài)轉(zhuǎn)移。若滿(mǎn)足,則執(zhí)行一組動(dòng)作之后狀態(tài)轉(zhuǎn)移。若滿(mǎn)足,則執(zhí)行一組動(dòng)作之后狀態(tài)轉(zhuǎn)移。nAction動(dòng)作:一組動(dòng)作:一組SQL指令,通常是更新操作指令,通常是更新操作 Old狀態(tài)New狀態(tài)Event/Con
31、ditionAction第7章 約束和觸發(fā)器39觸發(fā)器與約束不同觸發(fā)器與約束不同n當(dāng)數(shù)據(jù)庫(kù)程序員聲明的事件發(fā)生時(shí),觸當(dāng)數(shù)據(jù)庫(kù)程序員聲明的事件發(fā)生時(shí),觸發(fā)器被激活。事件可以是對(duì)某個(gè)特定關(guān)發(fā)器被激活。事件可以是對(duì)某個(gè)特定關(guān)系的插入、刪除或修改。系的插入、刪除或修改。n當(dāng)觸發(fā)器被事件激活時(shí),不是立即執(zhí)行,當(dāng)觸發(fā)器被事件激活時(shí),不是立即執(zhí)行,而是首先由觸發(fā)器測(cè)試觸發(fā)條件。如果而是首先由觸發(fā)器測(cè)試觸發(fā)條件。如果條件不成立,則響應(yīng)事件的觸發(fā)器不做條件不成立,則響應(yīng)事件的觸發(fā)器不做任何事情。任何事情。n如果觸發(fā)器聲明的條件滿(mǎn)足,則與觸發(fā)如果觸發(fā)器聲明的條件滿(mǎn)足,則與觸發(fā)器相連的動(dòng)作由器相連的動(dòng)作由DBMS執(zhí)
32、行。執(zhí)行。第7章 約束和觸發(fā)器40SQL中的觸發(fā)器特征中的觸發(fā)器特征n動(dòng)作可以在觸發(fā)事件之前或之后被執(zhí)行。動(dòng)作可以在觸發(fā)事件之前或之后被執(zhí)行。n在被觸發(fā)的事件中,動(dòng)作既可指向被插入、刪在被觸發(fā)的事件中,動(dòng)作既可指向被插入、刪除、修改元組的新值,也可以指向其舊值。除、修改元組的新值,也可以指向其舊值。n更新事件可以被局限到某個(gè)特定的屬性或某一更新事件可以被局限到某個(gè)特定的屬性或某一些屬性。些屬性。n條件由條件由WHEN短語(yǔ)給出。僅僅當(dāng)規(guī)則被觸發(fā),短語(yǔ)給出。僅僅當(dāng)規(guī)則被觸發(fā),并且觸發(fā)事件的發(fā)生使條件成立時(shí),動(dòng)作才被并且觸發(fā)事件的發(fā)生使條件成立時(shí),動(dòng)作才被執(zhí)行。執(zhí)行。n程序員可以選擇動(dòng)作執(zhí)行的聲明方
33、式:程序員可以選擇動(dòng)作執(zhí)行的聲明方式:n一次只對(duì)一個(gè)更新元組,或者一次只對(duì)一個(gè)更新元組,或者n一次針對(duì)在數(shù)據(jù)庫(kù)操作中被改變的所有元組。一次針對(duì)在數(shù)據(jù)庫(kù)操作中被改變的所有元組。第7章 約束和觸發(fā)器41觸發(fā)器的語(yǔ)法觸發(fā)器的語(yǔ)法 CREATE TRIGGER trigger-name ON table-name FOR trigger-event AS trigger-name:一個(gè)表可定義多個(gè)不重一個(gè)表可定義多個(gè)不重名的觸發(fā)器。名的觸發(fā)器。trigger-event: DELETE | INSERT | UPDATEAS:是觸發(fā)器要執(zhí)行的操作。:是觸發(fā)器要執(zhí)行的操作。 第7章 約束和觸發(fā)器42例子
34、例子n要求:每個(gè)銷(xiāo)售員只能屬于某一個(gè)部門(mén);部門(mén)要求:每個(gè)銷(xiāo)售員只能屬于某一個(gè)部門(mén);部門(mén)經(jīng)理只能由本部門(mén)中某個(gè)銷(xiāo)售員擔(dān)任。經(jīng)理只能由本部門(mén)中某個(gè)銷(xiāo)售員擔(dān)任。Salesman (empid, idno, name, gender, phone, deptid)Department (deptid, name, headerid)第7章 約束和觸發(fā)器43例子例子n僅靠外鍵建立的參照完整性,不能解決的問(wèn)題:僅靠外鍵建立的參照完整性,不能解決的問(wèn)題:1 當(dāng)當(dāng)update department set headerid = ? where deptid = ? 時(shí)時(shí) 不能保證新不能保證新headerid在在Salesman中是本部門(mén)成員。中是本部門(mén)成員。 例如:例如:update department set headerid = A0044 where deptid = 2; A0044是部門(mén)是部門(mén)1的成員卻擔(dān)任了部門(mén)的成員卻擔(dān)任了部門(mén)2的經(jīng)理。的經(jīng)理。 應(yīng)在其擔(dān)任部門(mén)應(yīng)在其擔(dān)任部門(mén)2經(jīng)理之前,先更新經(jīng)理之前,先更新salesman使其作使其作為部門(mén)為部門(mén)2的成員。的成員。 update salesman set
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 產(chǎn)業(yè)園區(qū)入駐合同協(xié)議
- 關(guān)于推進(jìn)跨部門(mén)合作項(xiàng)目的工作計(jì)劃
- 關(guān)于采購(gòu)流程的往來(lái)文書(shū)說(shuō)明
- 商務(wù)會(huì)議溝通要點(diǎn)及會(huì)議紀(jì)要模板
- 健康管理平臺(tái)的構(gòu)建及運(yùn)營(yíng)規(guī)劃
- 機(jī)器人智能化生產(chǎn)線建設(shè)委托代理合同
- 交通物流調(diào)度管理系統(tǒng)建設(shè)方案
- 房屋預(yù)約買(mǎi)賣(mài)合同
- 木材原木購(gòu)銷(xiāo)合同
- 2025年版《認(rèn)識(shí)大熊貓》課件發(fā)布
- 2025年安徽水利水電職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)適應(yīng)性測(cè)試題庫(kù)(含答案)
- 山東省青島市市北區(qū)2024-2025學(xué)年七年級(jí)上學(xué)期期末考試英語(yǔ)試題(含答案+解析)
- 餐飲及食品安全管理制度
- 湖北省襄陽(yáng)市襄州區(qū)2024-2025學(xué)年九年級(jí)上學(xué)期期末語(yǔ)文試題(含答案)
- 2025年安徽電氣工程職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)技能測(cè)試題庫(kù)及答案1套
- 2025年房屋交易代持策劃協(xié)議書(shū)
- 課題申報(bào)參考:“四新”建設(shè)背景下教育創(chuàng)新與課程數(shù)字化實(shí)踐研究
- 2025年煙臺(tái)汽車(chē)工程職業(yè)學(xué)院高職單招職業(yè)適應(yīng)性測(cè)試近5年常考版參考題庫(kù)含答案解析
- 2025年江蘇農(nóng)牧科技職業(yè)學(xué)院高職單招職業(yè)技能測(cè)試近5年??及鎱⒖碱}庫(kù)含答案解析
- 2024年長(zhǎng)沙衛(wèi)生職業(yè)學(xué)院高職單招職業(yè)技能測(cè)驗(yàn)歷年參考題庫(kù)(頻考版)含答案解析
- 2024年度國(guó)網(wǎng)營(yíng)銷(xiāo)安全(用電檢查)安全準(zhǔn)入客觀題備考試題庫(kù)(附答案)
評(píng)論
0/150
提交評(píng)論