《SQL Server 2005基礎(chǔ)教程及上機(jī)指導(dǎo)》第7章 觸發(fā)器_第1頁
《SQL Server 2005基礎(chǔ)教程及上機(jī)指導(dǎo)》第7章 觸發(fā)器_第2頁
《SQL Server 2005基礎(chǔ)教程及上機(jī)指導(dǎo)》第7章 觸發(fā)器_第3頁
《SQL Server 2005基礎(chǔ)教程及上機(jī)指導(dǎo)》第7章 觸發(fā)器_第4頁
《SQL Server 2005基礎(chǔ)教程及上機(jī)指導(dǎo)》第7章 觸發(fā)器_第5頁
已閱讀5頁,還剩83頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第7章觸發(fā)器7.1觸發(fā)器簡介7.2觸發(fā)器的工作原理7.3創(chuàng)建和管理觸發(fā)器7.4上機(jī)實(shí)驗(yàn)習(xí)題

觸發(fā)器是一種特殊類型的存儲(chǔ)過程,它并不同于第6章中所介紹過的存儲(chǔ)過程。觸發(fā)器主要是通過事件自動(dòng)觸發(fā)而被執(zhí)行的,而存儲(chǔ)過程是通過存儲(chǔ)過程名字來顯式調(diào)用的。在以下各節(jié)中我們將對觸發(fā)器的概念、功能以及使用方法作詳細(xì)介紹。

本章學(xué)習(xí)目標(biāo):

(1)掌握創(chuàng)建、修改和刪除觸發(fā)器的方法。

(2)充分理解觸發(fā)器的工作原理以及inserted表和deleted表的使用方法。

(3)能夠靈活運(yùn)用觸發(fā)器來解決實(shí)際問題。

觸發(fā)器實(shí)際上就是一種特殊類型的存儲(chǔ)過程,它的特殊性就體現(xiàn)在:它是在執(zhí)行某些特定的T-SQL語句時(shí)自動(dòng)被觸發(fā)而執(zhí)行的,這些特定的T-SQL語句通常包括INSERT、DELETE和UPDATE等。7.1觸?發(fā)?器?簡?介

1.觸發(fā)器的主要功能

可以利用觸發(fā)器來完成很多功能,常見的如下:

(1)對數(shù)據(jù)庫進(jìn)行強(qiáng)化約束,完成比約束更復(fù)雜的數(shù)據(jù)約束。

(2)執(zhí)行級聯(lián)操作。觸發(fā)器可以監(jiān)視數(shù)據(jù)庫內(nèi)的操作,并自動(dòng)地級聯(lián)影響整個(gè)數(shù)據(jù)庫的相關(guān)數(shù)據(jù)。

(3)進(jìn)行存儲(chǔ)過程的嵌套調(diào)用。觸發(fā)器本身就是一種存儲(chǔ)過程,而存儲(chǔ)過程是可以嵌套使用的,所以觸發(fā)器也可以調(diào)用一個(gè)或多個(gè)存儲(chǔ)過程。

2.觸發(fā)器對數(shù)據(jù)庫完整性的擴(kuò)展

MicrosoftSQLServer2005提供了兩種主要機(jī)制來強(qiáng)制執(zhí)行業(yè)務(wù)規(guī)則和數(shù)據(jù)完整性:約束和觸發(fā)器。

約束和觸發(fā)器在特殊情況下各有優(yōu)點(diǎn)。觸發(fā)器的主要優(yōu)點(diǎn)在于它們可以包含使用T-SQL代碼的復(fù)雜處理邏輯。因此,觸發(fā)器可以支持約束的所有功能;但觸發(fā)器對于給定的功能并不總是最好的方法。實(shí)體完整性總應(yīng)在最低級別上通過索引進(jìn)行強(qiáng)制,這些索引應(yīng)是PRIMARYKEY和UNIQUE約束的一部分,或者是獨(dú)立于約束而創(chuàng)建的。域完整性應(yīng)通過CHECK約束進(jìn)行強(qiáng)制,而引用完整性(RI)則應(yīng)通過FOREIGNKEY約束進(jìn)行強(qiáng)制,假設(shè)這些約束的功能滿足應(yīng)用程序的功能需求。

3.觸發(fā)器種類

SQLServer2005包括兩大類觸發(fā)器:數(shù)據(jù)操作語言(DataManipulationLanguage,DML)觸發(fā)器和數(shù)據(jù)定義語言(DataDefinitionLanguage,DDL)觸發(fā)器。

DML觸發(fā)器在數(shù)據(jù)庫中發(fā)生數(shù)據(jù)操作語言(DML)事件時(shí)將啟用。DML事件包括在指定表或視圖中修改數(shù)據(jù)的INSERT語句、UPDATE語句或DELETE語句。DML觸發(fā)器可以查詢其他表,還可以包含復(fù)雜的T-SQL語句。觸發(fā)器和觸發(fā)它的語句可作為在觸發(fā)器內(nèi)回滾的單個(gè)事務(wù)對待。如果檢測到錯(cuò)誤,則整個(gè)事務(wù)自動(dòng)回滾。SQLServer2005的DML觸發(fā)器又可分為兩類:

(1)

After觸發(fā)器:這類觸發(fā)器在記錄已經(jīng)改變完之后(after)才會(huì)被激活執(zhí)行。

(2)

InsteadOf觸發(fā)器:這類觸發(fā)器一般用來取代原本的操作,在記錄變更之前發(fā)生。

DDL觸發(fā)器是SQLServer2005的新增功能。當(dāng)服務(wù)器或數(shù)據(jù)庫中發(fā)生數(shù)據(jù)定義語言(DDL)事件時(shí)將調(diào)用這些觸發(fā)器。

在創(chuàng)建和使用觸發(fā)器前,有必要先了解觸發(fā)器的工作原理,而了解觸發(fā)器工作原理的關(guān)鍵又在于了解兩個(gè)特殊的表:inserted表和deleted表。這兩個(gè)表是在運(yùn)行觸發(fā)器的時(shí)候臨時(shí)被創(chuàng)建的,而且是駐留在數(shù)據(jù)庫服務(wù)器的內(nèi)存中的。它們是由系統(tǒng)管理的邏輯表,而不是真正存儲(chǔ)在數(shù)據(jù)庫中的物理表,其具有以下幾個(gè)特點(diǎn):7.2觸發(fā)器的工作原理

(1)它們在結(jié)構(gòu)上和觸發(fā)器所在的表的結(jié)構(gòu)相同。

(2)它們只是臨時(shí)駐留在內(nèi)存里,當(dāng)觸發(fā)器的工作完成之后,這兩個(gè)表也將會(huì)從內(nèi)存中刪除。

(3)對于這兩個(gè)表,用戶只能夠引用它們的數(shù)據(jù),但沒有修改的權(quán)限。

假設(shè)某個(gè)表在INSERT、DELETE和UPDATE語句上定義了觸發(fā)器,那么下面分三種情況來講解inserted表和deleted表中的記錄。

當(dāng)執(zhí)行的是INSERT語句時(shí),inserted表里存放的是要插入的記錄,而deleted表中沒有記錄。

當(dāng)執(zhí)行的是DELETE語句時(shí),deleted表里存放的是要?jiǎng)h除的記錄,而inserted表中沒有記錄。

當(dāng)執(zhí)行的是UPDATE語句時(shí),可以將更新操作看成是有兩個(gè)操作組成:首先將要更新的記錄刪除,然后再根據(jù)要更新的數(shù)據(jù)生成一條新記錄插回表中,所以deleted表里存放的是更新前原來的記錄,而inserted表里存放的是已被更新后的記錄。

7.3.1創(chuàng)建觸發(fā)器的語法

創(chuàng)建觸發(fā)器的語句是CREATETRIGGER,具體語法如下:

CREATETRIGGERtrigger_name

ON{table|view}

[WITH<dml_trigger_option>[,...n]]

{FOR|AFTER|INSTEADOF}

7.3創(chuàng)建和管理觸發(fā)器

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

AS{sql_statement[;]}

其中各個(gè)參數(shù)的含義如下:

trigger_name:觸發(fā)器的名稱。每個(gè)trigger_name必須遵循標(biāo)識符規(guī)則。

table|view:對其執(zhí)行DML觸發(fā)器的表或視圖,有時(shí)稱為觸發(fā)器表或觸發(fā)器視圖。

AFTER:指定DML觸發(fā)器僅在觸發(fā)SQL語句中指定的所有操作都已成功執(zhí)行時(shí)才被激發(fā)。

INSTEADOF:指定DML觸發(fā)器是“代替”SQL語句執(zhí)行的,因此其優(yōu)先級高于觸發(fā)語句的操作。

{[DELETE][,][INSERT][,][UPDATE]}:指定數(shù)據(jù)修改語句,這些語句可在DML觸發(fā)器對此表或視圖進(jìn)行嘗試時(shí)激活該觸發(fā)器。在觸發(fā)器定義中必須至少指定一個(gè)選項(xiàng),允許使用上述選項(xiàng)的任意順序組合。

sql_statement:觸發(fā)條件和操作,觸發(fā)器條件指定其他標(biāo)準(zhǔn),用于確定嘗試的DML或DDL語句是否導(dǎo)致執(zhí)行觸發(fā)器操作。7.3.2觸發(fā)器的創(chuàng)建與使用

1.INSERT觸發(fā)器

首先創(chuàng)建一個(gè)INSERT觸發(fā)器,用于對插入TestInformation表的記錄進(jìn)行檢查,規(guī)定Score字段的值只能處于0~100之間,如果不符合這個(gè)條件,將回滾事務(wù)(ROLLBACKTRANSACTION),并且給出錯(cuò)誤信息,具體代碼如代碼清單7-1所示。

上面的代碼所創(chuàng)建的觸發(fā)器名稱為“CheckScore”,它是一個(gè)INSERT觸發(fā)器(FORINSERT),當(dāng)對TestInformation表執(zhí)行INSERT語句時(shí),觸發(fā)器就會(huì)被觸發(fā)而執(zhí)行。

首先聲明了一個(gè)整型變量@score,用來存放所插入記錄的Score字段的值,接下來的語句值得注意:

SELECT@score=ScoreFROMinserted

這里FROMinserted子句中所指定的就是在7.2節(jié)中所介紹的inserted表,所插入的記錄會(huì)復(fù)制一份副本在inserted表中,然后就可以對它進(jìn)行引用。在IF語句中,判斷所插入記錄的Score字段值是否處于0~100之間,如果不是,將采取的方法是:利用ROLLBACKTRANSACTION語句將事務(wù)回滾到插入記錄前的狀態(tài)。

在這里解釋一下事務(wù)的概念,事務(wù)是單個(gè)的工作單元。如果某一事務(wù)成功,則在該事務(wù)中進(jìn)行的所有數(shù)據(jù)修改均會(huì)提交,成為數(shù)據(jù)庫中的永久組成部分。如果事務(wù)遇到錯(cuò)誤且必須取消或回滾,則所有數(shù)據(jù)修改均被清除。其實(shí),在觸發(fā)器中,ROLLBACKTRANSACTION語句的使用非常普遍。當(dāng)調(diào)用ROLLBACKTRANSACTION語句時(shí),就會(huì)將本次事務(wù)中所做的更改全部取消,在這里也就是將已經(jīng)插入到TestInformation表中的記錄予以清除。接下來使用語句RAISERROR('成績的有效范圍是--100',16,1)給出錯(cuò)誤信息,RAISERROR的功能是將系統(tǒng)錯(cuò)誤或警告消息返回到應(yīng)用程序中。

運(yùn)行上述代碼之后,就可以看到CheckScore觸發(fā)器了,如圖7-1所示。

圖7-1新創(chuàng)建的CheckScore觸發(fā)器

測試觸發(fā)器的執(zhí)行效果時(shí),將執(zhí)行兩條INSERT語句(記?。河|發(fā)器是沒有顯式的調(diào)用命令,而是由相應(yīng)的語句觸發(fā)的,CheckScore觸發(fā)器是INSERT觸發(fā)器,是由INSERT語句觸發(fā)),一條包含正確的數(shù)據(jù),另一條的數(shù)據(jù)并不符合條件,比較兩條語句的執(zhí)行結(jié)果,具體代碼如代碼清單7-2所示,執(zhí)行結(jié)果如圖7-2所示。

圖7-2執(zhí)行兩條INSERT語句的不同結(jié)果從圖7-2可以看到,兩條INSERT語句返回的消息是不同的,第一條INSERT語句成功地被執(zhí)行了,返回了“1行受影響”的消息,而第二條INSERT語句所插入的記錄的Score值為105,所以操作被回滾,并得到了預(yù)期的錯(cuò)誤消息“成績的有效范圍是--100”。同時(shí)打開TestInformation表來驗(yàn)證結(jié)果,可以在圖7-3中看到最后的一條記錄正是剛剛插入的記錄。

圖7-3第一條INSERT語句成功把記錄插入TestInformation表

再如向TestInformation表插入記錄的時(shí)候,除了進(jìn)行Score的判斷之外,還要根據(jù)所插入記錄的StudentID字段的值,到student表中去檢查一個(gè)字段IsLost,這個(gè)字段是字符型數(shù)據(jù),表示的是這個(gè)學(xué)生是否已經(jīng)退學(xué)。如果它的值為“是”,則這個(gè)學(xué)生已經(jīng)退學(xué),如果為“否”,則這個(gè)學(xué)生是在讀的。很明顯,當(dāng)這個(gè)學(xué)生是在讀學(xué)生時(shí),就允許記錄被插入到TestInformation表,否則將回滾事務(wù)。

在這種情況下,通過在TestInformation表建立約束的方法是無法實(shí)現(xiàn)這種邏輯判斷的,因?yàn)榧s束只能指定表內(nèi)的數(shù)據(jù),無法引用另外表的數(shù)據(jù)。而觸發(fā)器可以完成比約束更復(fù)雜的數(shù)據(jù)約束,根據(jù)上述的邏輯創(chuàng)建觸發(fā)器CheckIsLost,具體代碼如代碼清單7-3所示。

在上面的代碼中,判斷所插入記錄的學(xué)生是否已經(jīng)退學(xué)時(shí),聲明了兩個(gè)變量@studentID和@isLost,其中@studentID用來存放所插入的新記錄的學(xué)號,@isLost用來存放根據(jù)@studentID變量的值查找到的學(xué)生是否已經(jīng)退學(xué)的信息。

@studentID的值從inserted表由下面的語句獲得:

SELECT@studentID=StudentIDFROMinserted

而@isLost的值從student表由下面的語句獲得:

SELECT@isLost=IsLostFROMstudentWHEREstudentID=@ststudent接下來仍然執(zhí)行兩條INSERT語句,比較兩條語句的執(zhí)行結(jié)果,具體代碼如代碼清單7-4所示,執(zhí)行結(jié)果如圖7-4所示。

圖7-4執(zhí)行兩條INSERT語句的不同結(jié)果

從圖7-4可以看到,兩條INSERT語句返回的消息是不同的,第一條INSERT語句成功地被執(zhí)行了,返回了“1行受影響”的消息,而第二條INSERT語句所插入的記錄的StudentID值為“20020866”,而在Student表StudentID值為“20020866”的記錄的IsLost字段值為“是”,所以操作被回滾,并得到了預(yù)期的錯(cuò)誤消息“該生已經(jīng)退學(xué)!

”。

2.UPDATE觸發(fā)器

上面的兩個(gè)例子介紹了怎樣創(chuàng)建INSERT觸發(fā)器,接下來介紹UPDATE觸發(fā)器。

UPDATE觸發(fā)器是當(dāng)對表執(zhí)行UPDATE語句完畢后被觸發(fā)執(zhí)行的,在UPDATE觸發(fā)器中可以同時(shí)利用inserted表和deleted表的記錄??紤]下面的情況,TestInformation表中存放有代表級別的Degree字段和代表學(xué)分的字段Credit,而且Credit字段的值與Degree有關(guān)。當(dāng)對TestInformation表進(jìn)行修改Degree字段之后,若成績合格(60分以上),如果是一級,獲得的學(xué)分就是1分;如果是二級,獲得的學(xué)分就是4分。當(dāng)我們修改TestInformation表中的記錄時(shí),要根據(jù)所修改的情況修改相應(yīng)的學(xué)分,具體代碼如代碼清單7-5所示。

在上面的代碼中,首先聲明了4個(gè)變量,其中@infoID用來存放deleted表中記錄的InfoID值,(請記住deleted表中的記錄是修改前的記錄),以便以后找出這個(gè)記錄并重新設(shè)置Credit的值,另外@score、@degree和@credit3個(gè)變量是用來存放修改之后記錄的相應(yīng)字段值,并用兩條SELECT語句向4個(gè)變量賦值。利用IF語句分如下兩種情況討論:

(1)成績不合格的情況。若成績不合格,但學(xué)分(Credit)不等于0,則將Credit字段設(shè)置為0。

(2)成績合格的情況,又分如下兩種情況。

如果是“一級”,但學(xué)分(Credit)不等于1,則將Credit字段設(shè)置為1。

如果是“二級”,但學(xué)分(Credit)不等于4,則將Credit字段設(shè)置為4。

運(yùn)行上述代碼后,UpdateTestInformation觸發(fā)器即被創(chuàng)建。測試觸發(fā)器的功能時(shí),先找到一個(gè)成績合格并且級別為“一級”的記錄,它的InfoID字段的值為22,將它的級別修改為“二級”,測試的具體代碼如代碼清單7-6所示。

執(zhí)行這段測試代碼之后,其返回消息如圖7-5所示。

圖中,只執(zhí)行了一條UPDATE語句卻返回了兩條“1行受影響”的消息。這是因?yàn)樵跍y試代碼中,確實(shí)只有一條UPDATE語句,但執(zhí)行完這條UPDATE語句之后,接著會(huì)引起UpdateTestInformation觸發(fā)器的執(zhí)行,在觸發(fā)器的執(zhí)行過程中,判斷到成績合格并且為二級,就會(huì)又執(zhí)行一條UPDATE語句,將學(xué)分字段Credit的值改為4,所以最后總共返回了兩條“1行受影響”的消息。此時(shí)可以打開TestInformation表查看InfoID為22的記錄,級別已被改為“二級”,同時(shí)由于觸發(fā)器的作用,Credit也已經(jīng)被改為4,如圖7-6所示。圖7-5測試代碼的返回消息

圖7-6UPDATE觸發(fā)器自動(dòng)修改Credit字段值為4

從這個(gè)例子中可以看到,通過利用觸發(fā)器,使得數(shù)據(jù)庫能自動(dòng)維護(hù)數(shù)據(jù)的一致性,這也是觸發(fā)器的主要功能之一。

3.DELETE觸發(fā)器

DELETE觸發(fā)器是執(zhí)行完DELETE語句后被觸發(fā)的,在DELETE觸發(fā)器中可以利用deleted表中的記錄。

DELETE觸發(fā)器的常用功能之一就是防止刪除符合指定的某種條件的記錄,比如對于TestInformation表,如果某條記錄的Score字段的值不是NULL,則不能將它刪除(即只能刪除Score字段的值是NULL的缺考的考生信息),可以用觸發(fā)器來進(jìn)行這個(gè)限制,具體代碼如代碼清單7-7所示。

上述代碼用另外一種方式使用deleted表,即使用了EXISTS子句,該子句的含義是判斷后面括號里的SELECT語句是否有符合條件的記錄。在這里,如果有記錄返回,所刪除的記錄不是NULL,則要回滾事務(wù),同時(shí)給出錯(cuò)誤信息。

首先執(zhí)行上述代碼創(chuàng)建觸發(fā)器,然后執(zhí)行代碼清單7-8所示的測試代碼,返回消息如圖7-7所示。

圖7-7DELETE觸發(fā)器的效果

在測試代碼中要?jiǎng)h除的兩條記錄中,InfoID=19的記錄Score為NULL,所以第一條DELETE語句能夠成功地被執(zhí)行,返回“1行受影響”的信息;而InfoID=20的記錄Score不是NULL,所以第2條DELETE語句回滾,并給出“在讀的學(xué)生信息不能刪除”的錯(cuò)誤信息。7.3.3修改與刪除觸發(fā)器

創(chuàng)建觸發(fā)器之后,由于各種原因,有時(shí)候還需要對觸發(fā)器進(jìn)行修改,或者將不需要的觸發(fā)器刪除。

1.修改觸發(fā)器

修改觸發(fā)器可以使用ALTERTRIGGER語句,語法如下:

ALTERTRIGGERschema_name.trigger_name

ON(table|view)

(FOR|AFTER|INSTEADOF)

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

[NOTFORREPLICATION]

AS

{sql_statement}

上述語法結(jié)構(gòu)中,很多參數(shù)的含義與在7.3.1節(jié)“創(chuàng)建觸發(fā)器的語法”中所介紹的相同,這里就不再重復(fù)了。比如,由于現(xiàn)在考試規(guī)定有所調(diào)整,單科的滿分為150分,則需要對前面所建立的觸發(fā)器CheckScore進(jìn)行修改,具體代碼如代碼清單7-9所示。

執(zhí)行上述代碼后,則觸發(fā)器已經(jīng)被修改成允許成績處于0~150之間了,然后執(zhí)行代碼清單7-10所示的測試代碼,發(fā)現(xiàn)代碼能成功運(yùn)行,返回消息如圖7-8所示。

此時(shí)打開TestInformation表,可以看到剛插進(jìn)去的記錄,如圖7-9所示。

圖7-8代碼能成功運(yùn)行

圖7-9插入成績大于100的記錄

2.刪除觸發(fā)器

當(dāng)不需要觸發(fā)器時(shí),可以利用DROPTRIGGER語句將它從數(shù)據(jù)庫中刪除,具體語法為

DROPTRIGGERtrigger_name

語法很簡單,現(xiàn)在將刪除前面所創(chuàng)建的觸發(fā)器CheckIsLost,具體代碼如代碼清單7-11所示。

執(zhí)行上述代碼后,觸發(fā)器CheckIsLost就被刪除了。7.3.4使用管理控制臺(tái)管理觸發(fā)器

在上面的幾個(gè)小節(jié)中,都是通過代碼來介紹創(chuàng)建、修改和刪除觸發(fā)器的方法,還有一種方法就是通過管理控制臺(tái)的可視化界面來操作。

可以在對象資源管理器中展開節(jié)點(diǎn)“WestSVR”|“數(shù)據(jù)庫”|“WxdStudent|表|TestInformation|觸發(fā)器”,就可以看到當(dāng)前屬于TestInformation表的觸發(fā)器,在相應(yīng)的觸發(fā)器(如UpdateTestInformation)上單擊鼠標(biāo)右鍵,彈出快捷菜單,如圖7-10所示。

圖7-10利用可視化界面進(jìn)行操作

該快捷菜單中包含了“新建觸發(fā)器…”、“修改”和“刪除”等菜單,它們可以實(shí)現(xiàn)和用代碼來完成的相同的功能,由于篇幅關(guān)系,這里不再詳述。

在本章的實(shí)驗(yàn)中,利用在第3章實(shí)驗(yàn)中所創(chuàng)建的兩張表Teachers2008和Course2008,因?yàn)樗鼈兊臄?shù)據(jù)在第3章實(shí)驗(yàn)中已經(jīng)被改變,所以在本章實(shí)驗(yàn)前需要重新創(chuàng)建。重新創(chuàng)建這兩張表的代碼參見代碼清單3-52,可按以下步驟運(yùn)行這段代碼:7.4上機(jī)實(shí)驗(yàn)

進(jìn)入“MicrosoftSQLServerManagementStudio”界面,選擇“文件”|“打開”|“文件…”,在彈出的“打開文件”對話框中定位到隨本書配套資源中的代碼文件“3-52.sql”,然后單擊“連接”,就會(huì)在所打開的代碼窗口中顯示出代碼清單3-52的代碼,單擊工具欄中的,這樣Teachers2008和Course2008就會(huì)被重新創(chuàng)建并恢復(fù)最原始的數(shù)據(jù)了。

1.實(shí)驗(yàn)一:創(chuàng)建和使用簡單觸發(fā)器

1)實(shí)驗(yàn)要求

(1)熟悉創(chuàng)建觸發(fā)器的語法。

(2)對創(chuàng)建、修改和刪除觸發(fā)器有初步的認(rèn)識。

2)實(shí)驗(yàn)?zāi)康?/p>

掌握觸發(fā)器的基本操作。

3)實(shí)驗(yàn)步驟

進(jìn)入“MicrosoftSQLServerManagementStudio”界面,在對象資源管理器中展開節(jié)點(diǎn)“WestSVR”|“數(shù)據(jù)庫”,單擊選中數(shù)據(jù)庫節(jié)點(diǎn)“WxdStudent”,再單擊工具欄按鈕

“ ”,在所打開的查詢窗口中完成以下任務(wù):

(1)在Teachers2008表上創(chuàng)建一個(gè)觸發(fā)器Insert_Teachers2008,功能是每當(dāng)給Teachers2008表中插入一條記錄時(shí),顯示“記錄插入成功”的提示信息,并顯示所插入的記錄。

在代碼窗口中輸入代碼清單7-12所示的代碼并運(yùn)行,即可創(chuàng)建觸發(fā)器,如果展開“WxdStudent”|“表”|“dbo.Teachers2008”|“觸發(fā)器”節(jié)點(diǎn),則可看到觸發(fā)器Insert_Teachers2008,如圖7-11所示。

圖7-11觸發(fā)器Insent_Teachers2008

(2)向Teachers2008表中插入一條記錄并進(jìn)行測試。

在代碼窗口中輸入代碼清單7-13所示的代碼并運(yùn)行,運(yùn)行結(jié)果如圖7-12和圖7-13所示。(注意:由于返回的消息是在“消息”框顯示,而所顯示的記錄是在“結(jié)果”框顯示,因此這里用了兩張圖來顯示運(yùn)行效果。)

圖7-12返回的消息

圖7-13顯示所插入的記錄

(3)修改觸發(fā)器Insert_Teachers2008,使得返回的消息不是在“消息”框顯示,而是和所顯示的記錄一起在“結(jié)果”框顯示(提示:可以同樣用SELECT語句來顯示消息)。

在代碼窗口中輸入代碼清單7-14所示的代碼并運(yùn)行,運(yùn)行結(jié)果如圖7-14所示。

圖7-14消息和記錄都顯示在“結(jié)果”框

(4)刪除觸發(fā)器,然后再插入一條記錄,觀察結(jié)果。

在代碼窗口中輸入代碼清單7-15所示的代碼并運(yùn)行,運(yùn)行結(jié)果如圖7-15所示??梢钥吹剑瑒h除了觸發(fā)器之后再插入記錄,既沒有提示消息,也不再顯示所插入的記錄,只有系統(tǒng)的默認(rèn)消息“(1行受影響)”。

圖7-15運(yùn)行結(jié)果

2.實(shí)驗(yàn)二:觸發(fā)器的應(yīng)用

1)實(shí)驗(yàn)要求

(1)熟悉inserted表和deleted表。

(2)靈活運(yùn)用觸發(fā)器解決實(shí)際問題。

2)實(shí)驗(yàn)?zāi)康?/p>

掌握觸發(fā)器的運(yùn)用技巧。

3)實(shí)驗(yàn)步驟

進(jìn)入“MicrosoftSQLServerManagementStudio”界面,在對象資源管理器中展開節(jié)點(diǎn)“WestSVR”|“數(shù)據(jù)庫”,單擊選中數(shù)據(jù)庫節(jié)點(diǎn)“WxdStudent”,再單擊工具欄按鈕

“ ”,在所打開的查詢窗口中完成以下任務(wù):

(1)創(chuàng)建Course2008表的觸發(fā)器Insert_Course2008,功能是每當(dāng)給Course2008表中插入一條記錄的時(shí)候,檢查所插入的TeacherID的值是否在Teachers2008表中存在,如不存在則給出錯(cuò)誤信息“該教師不存在!

”,并回滾事務(wù)。

在代碼窗口中輸入代碼清單7-16所示的代碼并運(yùn)行,即可創(chuàng)建Insert_Course2008觸發(fā)器。

(2)添加兩條插入記錄的語句并對觸發(fā)器Insert_Course2008進(jìn)行測試,觀察結(jié)果。

在代碼窗口中輸入代碼清單7-17所示的代碼并運(yùn)行,運(yùn)行結(jié)果如圖7-16所示,其中第一條語句成功執(zhí)行,而第二條語句彈出錯(cuò)誤信息。

圖7-16測試觸發(fā)器Insert_Course2008

(3)創(chuàng)建Course2008表的觸發(fā)器Insert_Update_Course2008,功能是每當(dāng)給Course2008表中插入一條記錄或者修改Course2008表的記錄時(shí)進(jìn)行檢查,保證“手機(jī)維修”課程的授課教師的職稱是“高級講師”。

在代碼窗口中輸入代碼清單7-18所示的代碼并運(yùn)行。

(4)添加兩條插入記錄的語句并對觸發(fā)器Insert_Update_Course2008進(jìn)行測試,觀察結(jié)果。

在代碼窗口中輸入代碼清單7-19所示的代碼并運(yùn)行,運(yùn)行結(jié)果如圖7-17所示。

圖7-17測試觸發(fā)器Insert_Update_Course2008

(5)創(chuàng)建Teachers2008表的觸發(fā)器Delete_Teachers2008,功能是每當(dāng)刪除Teachers2008表的一條記錄時(shí)就進(jìn)行檢查,確認(rèn)被刪除的記錄沒有在Course2008表中被引用。

在代碼窗口中輸入代碼清單7-20所示的代碼并運(yùn)行,即可創(chuàng)建Insert_

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(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ǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論