




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、第第10章章 存儲過程、觸發(fā)器存儲過程、觸發(fā)器n存儲過程、觸發(fā)器和游標(biāo)是存儲過程、觸發(fā)器和游標(biāo)是SQL ServerSQL Server數(shù)據(jù)庫的三個重要組成數(shù)據(jù)庫的三個重要組成部分。部分。SQL Server 2008SQL Server 2008使用它們從不同方面提高數(shù)據(jù)處理能使用它們從不同方面提高數(shù)據(jù)處理能力。力。n在在SQL Server 2008SQL Server 2008中,可以像其他程序設(shè)計語言一樣定義子中,可以像其他程序設(shè)計語言一樣定義子程序,稱為存儲過程程序,稱為存儲過程。運。運用用它可它可以創(chuàng)建健壯、安全且具有良好以創(chuàng)建健壯、安全且具有良好性能的數(shù)據(jù)庫,可以為用戶實性能的數(shù)
2、據(jù)庫,可以為用戶實現(xiàn)復(fù)現(xiàn)復(fù)雜的商業(yè)事務(wù)。雜的商業(yè)事務(wù)。n觸發(fā)器是一種特殊類型的存儲過程:它通過事件觸發(fā)而被自動觸發(fā)器是一種特殊類型的存儲過程:它通過事件觸發(fā)而被自動執(zhí)行。自動執(zhí)行意味著更少的手工操作以及更小的出錯機率。執(zhí)行。自動執(zhí)行意味著更少的手工操作以及更小的出錯機率。觸發(fā)器用于強制復(fù)雜的完整性檢查,審核更改,維護不規(guī)范的觸發(fā)器用于強制復(fù)雜的完整性檢查,審核更改,維護不規(guī)范的數(shù)據(jù)等等。數(shù)據(jù)等等。SQL Server 2008SQL Server 2008允許允許DMLDML語句和語句和DDLDDL語句創(chuàng)建觸發(fā)語句創(chuàng)建觸發(fā)器,可以引發(fā)器,可以引發(fā)AFTERAFTER或者或者INSTEAD OF
3、INSTEAD OF觸發(fā)事件。觸發(fā)事件。n游標(biāo)主要用于實現(xiàn)一些不能使用面向集合的語句實現(xiàn)的操作。游標(biāo)主要用于實現(xiàn)一些不能使用面向集合的語句實現(xiàn)的操作。通過游標(biāo),通過游標(biāo),SQL ServerSQL Server提供了一個對結(jié)果集進行逐行處理的能提供了一個對結(jié)果集進行逐行處理的能力??梢园延螛?biāo)看為一種特殊的指針,它可以指向結(jié)果集中的力??梢园延螛?biāo)看為一種特殊的指針,它可以指向結(jié)果集中的任意位置,在查詢數(shù)據(jù)的同時對數(shù)據(jù)進行處理。任意位置,在查詢數(shù)據(jù)的同時對數(shù)據(jù)進行處理。本章學(xué)習(xí)目標(biāo):本章學(xué)習(xí)目標(biāo):n了解存儲過程、觸發(fā)器和游標(biāo)的基本概念與特點了解存儲過程、觸發(fā)器和游標(biāo)的基本概念與特點n掌握存儲過程的
4、基本類型和相關(guān)操作掌握存儲過程的基本類型和相關(guān)操作n掌握觸發(fā)器的類型與相關(guān)操作掌握觸發(fā)器的類型與相關(guān)操作10.1 10.1 存儲過程存儲過程n存儲過程是一組完成特定功能的存儲過程是一組完成特定功能的SQL SQL 語句集合,經(jīng)編語句集合,經(jīng)編譯后存儲在數(shù)據(jù)庫中。譯后存儲在數(shù)據(jù)庫中。n存儲過程作為一個單元進行處理并以一個名稱來標(biāo)識存儲過程作為一個單元進行處理并以一個名稱來標(biāo)識。它能向用戶返回數(shù)據(jù)、向數(shù)據(jù)庫表中寫入或修改數(shù)。它能向用戶返回數(shù)據(jù)、向數(shù)據(jù)庫表中寫入或修改數(shù)據(jù)、執(zhí)行系統(tǒng)函數(shù)和進行管理操作。據(jù)、執(zhí)行系統(tǒng)函數(shù)和進行管理操作。n用戶通過指定存儲過程的名字并給出參數(shù)(如果該存用戶通過指定存儲過程
5、的名字并給出參數(shù)(如果該存儲過程帶有參數(shù))來執(zhí)行它。儲過程帶有參數(shù))來執(zhí)行它。存儲過程的優(yōu)點:存儲過程的優(yōu)點:n1. 1. 減少網(wǎng)絡(luò)流量:減少網(wǎng)絡(luò)流量:存儲過程在數(shù)據(jù)庫服務(wù)器端執(zhí)行,只向客存儲過程在數(shù)據(jù)庫服務(wù)器端執(zhí)行,只向客戶端返回執(zhí)行結(jié)果。因此可以將在網(wǎng)絡(luò)中要發(fā)送的數(shù)百行代碼,戶端返回執(zhí)行結(jié)果。因此可以將在網(wǎng)絡(luò)中要發(fā)送的數(shù)百行代碼,編寫為一條存儲過程,這樣客戶端只需要提交存儲過程的名稱編寫為一條存儲過程,這樣客戶端只需要提交存儲過程的名稱和參數(shù),即可實現(xiàn)相應(yīng)功能,節(jié)省了網(wǎng)絡(luò)流量,提高了執(zhí)行的和參數(shù),即可實現(xiàn)相應(yīng)功能,節(jié)省了網(wǎng)絡(luò)流量,提高了執(zhí)行的效率。此外,由于所有的操作都在服務(wù)器端完成,避免
6、了在客效率。此外,由于所有的操作都在服務(wù)器端完成,避免了在客戶端和服務(wù)器端之間的多次往返。存儲過程只需要將最終結(jié)果戶端和服務(wù)器端之間的多次往返。存儲過程只需要將最終結(jié)果通過網(wǎng)絡(luò)傳輸?shù)娇蛻舳?。通過網(wǎng)絡(luò)傳輸?shù)娇蛻舳?。n2. 2. 提高系統(tǒng)性能提高系統(tǒng)性能:一般:一般T-SQLT-SQL語句每執(zhí)行一次就需要編譯一次,語句每執(zhí)行一次就需要編譯一次,而存儲過程只在創(chuàng)建時進行編譯,被編譯后存放在數(shù)據(jù)庫服務(wù)而存儲過程只在創(chuàng)建時進行編譯,被編譯后存放在數(shù)據(jù)庫服務(wù)器的過程高速緩存中,當(dāng)使用時,服務(wù)器不必再重新分析和編器的過程高速緩存中,當(dāng)使用時,服務(wù)器不必再重新分析和編譯它們。因此,當(dāng)對數(shù)據(jù)庫進行復(fù)雜操作時(如
7、對多個表進行譯它們。因此,當(dāng)對數(shù)據(jù)庫進行復(fù)雜操作時(如對多個表進行UPDATEUPDATE、INSERTINSERT或或DELETEDELETE操作時),可將這些復(fù)雜操作用存儲操作時),可將這些復(fù)雜操作用存儲過程封裝起來與數(shù)據(jù)庫提供的事務(wù)處理結(jié)合一起使用,節(jié)省了過程封裝起來與數(shù)據(jù)庫提供的事務(wù)處理結(jié)合一起使用,節(jié)省了分析、解析和優(yōu)化代碼所需的分析、解析和優(yōu)化代碼所需的CPUCPU資源和時間。資源和時間。存存儲過程的優(yōu)點:儲過程的優(yōu)點:n3. 3. 安全性高安全性高:使用存儲過程可以完成所有數(shù)據(jù)庫操作,并且:使用存儲過程可以完成所有數(shù)據(jù)庫操作,并且可授予沒有直接執(zhí)行存儲過程中語句的權(quán)限的用戶,也可
8、執(zhí)可授予沒有直接執(zhí)行存儲過程中語句的權(quán)限的用戶,也可執(zhí)行該存儲過程的權(quán)限。另外可以防止用戶直接訪問表,強制行該存儲過程的權(quán)限。另外可以防止用戶直接訪問表,強制用戶使用存儲過程執(zhí)行特定的任務(wù)。用戶使用存儲過程執(zhí)行特定的任務(wù)。n4. 4. 可重用性:可重用性:存儲過程只需創(chuàng)建并存儲在數(shù)據(jù)庫中,以后即存儲過程只需創(chuàng)建并存儲在數(shù)據(jù)庫中,以后即可任意在程序中調(diào)用該過程。存儲過程可獨立于程序源代碼可任意在程序中調(diào)用該過程。存儲過程可獨立于程序源代碼而單獨修改,減少數(shù)據(jù)庫開發(fā)人員的工作量。而單獨修改,減少數(shù)據(jù)庫開發(fā)人員的工作量。n5 5. . 可自動完成需要預(yù)先執(zhí)行的任務(wù)可自動完成需要預(yù)先執(zhí)行的任務(wù):存儲過
9、程可以在系統(tǒng)啟:存儲過程可以在系統(tǒng)啟動時自動執(zhí)行,完成一些需要預(yù)先執(zhí)行的任務(wù),而不必在系動時自動執(zhí)行,完成一些需要預(yù)先執(zhí)行的任務(wù),而不必在系統(tǒng)啟動后再進行人工操作。統(tǒng)啟動后再進行人工操作。存儲過程的類型存儲過程的類型1. 1. 系統(tǒng)存儲過程系統(tǒng)存儲過程 系統(tǒng)存儲過程是系統(tǒng)已定義好的完成特定功能的存儲過系統(tǒng)存儲過程是系統(tǒng)已定義好的完成特定功能的存儲過程,用戶可直接調(diào)用。系統(tǒng)存儲過程以程,用戶可直接調(diào)用。系統(tǒng)存儲過程以sp_sp_為前綴。為前綴。2. 2. 用戶自定義存儲過程用戶自定義存儲過程 用戶自定義存儲過程在用戶數(shù)據(jù)庫中創(chuàng)建,通常與數(shù)據(jù)用戶自定義存儲過程在用戶數(shù)據(jù)庫中創(chuàng)建,通常與數(shù)據(jù)庫對象進
10、行交互,用于完成特定數(shù)據(jù)庫操作任務(wù),可以庫對象進行交互,用于完成特定數(shù)據(jù)庫操作任務(wù),可以接受和返回用戶提供的參數(shù),名稱不能以接受和返回用戶提供的參數(shù),名稱不能以sp_sp_為前綴。為前綴。n1. 1. 使用使用SQL Server Management StudioSQL Server Management Studio創(chuàng)建存儲創(chuàng)建存儲過程過程n2.2.使用使用CREATE PROCEDURECREATE PROCEDURE語句創(chuàng)建存儲過程,語語句創(chuàng)建存儲過程,語法格式為法格式為:CREATE PROCEDURE procedure_name parameter data_type = def
11、aultOUTPUT ,n AS sql_statement n 110.1.1 10.1.1 創(chuàng)建存儲過程創(chuàng)建存儲過程 其中:其中:qparameterparameter:過程中的參數(shù)。在該語句中可以聲明過程中的參數(shù)。在該語句中可以聲明一個或多個參數(shù)。用戶必須在執(zhí)行過程時提供每個一個或多個參數(shù)。用戶必須在執(zhí)行過程時提供每個所聲明參數(shù)的值,使用所聲明參數(shù)的值,使用 符號作為第一個字符來指符號作為第一個字符來指定參數(shù)名稱。定參數(shù)名稱。 qdata_typedata_type:參數(shù)的數(shù)據(jù)類型。參數(shù)的數(shù)據(jù)類型。qD Defaultefault:參數(shù)的默認(rèn)值。參數(shù)的默認(rèn)值。qOUTPUTOUTPUT:
12、表明參數(shù)是返回參數(shù)。表明參數(shù)是返回參數(shù)?!纠?創(chuàng)建一個存儲過程創(chuàng)建一個存儲過程stud_degreestud_degree,用于檢索所有學(xué)生的,用于檢索所有學(xué)生的成績記錄,包括學(xué)號、姓名、課程名和分?jǐn)?shù)。成績記錄,包括學(xué)號、姓名、課程名和分?jǐn)?shù)。解:對應(yīng)的程序如下:解:對應(yīng)的程序如下:CREATE PROCEDURE CREATE PROCEDURE stud_degreestud_degree ASAS SELECT SELECT student.student.學(xué)號學(xué)號, ,姓名姓名, ,課程名課程名, ,分?jǐn)?shù)分?jǐn)?shù) FROM FROM student,course,scorestudent
13、,course,score WHERE student. WHERE student.學(xué)號學(xué)號=score.=score.學(xué)號學(xué)號 AND course. AND course.課程號課程號=score.=score.課程號課程號 ORDER BY student.ORDER BY student.學(xué)號學(xué)號n執(zhí)行存儲過程使用執(zhí)行存儲過程使用EXECUTEEXECUTE語句,其格式如下:語句,其格式如下: EXEC UTE return_status = procedure_name parameter = value | variable OUTPUT | DEFAULT , n 10.1.2
14、 10.1.2 執(zhí)行存儲過程執(zhí)行存儲過程 q各個參數(shù)的含義:各個參數(shù)的含義:l return_statusreturn_status 保存存儲過程的返回狀態(tài)保存存儲過程的返回狀態(tài)lprocedure_nameprocedure_name 調(diào)用的存儲過程的名稱調(diào)用的存儲過程的名稱lparameter parameter 過程參數(shù)過程參數(shù)lValue Value 過程參數(shù)的值過程參數(shù)的值lvariable variable 用來保存參數(shù)或返回參數(shù)的變量用來保存參數(shù)或返回參數(shù)的變量lOUTPUTOUTPUT 指定存儲過程必須返回的一個參數(shù)指定存儲過程必須返回的一個參數(shù)lDEFAULT DEFAULT
15、 默認(rèn)參數(shù)值默認(rèn)參數(shù)值n在調(diào)用存儲過程時的兩種傳遞參數(shù)的方式:在調(diào)用存儲過程時的兩種傳遞參數(shù)的方式:q方式一:方式一: EXEC EXEC 存儲過程名存儲過程名 實參列表實參列表q方式二:方式二: EXEC EXEC 存儲過程名存儲過程名 參數(shù)參數(shù)1=1=值值1,1,參數(shù)參數(shù)2=2=值值2,2,【例例】 執(zhí)行存儲過程執(zhí)行存儲過程maxdegreemaxdegree并查看輸出的結(jié)果。并查看輸出的結(jié)果。 create procedure maxderee create procedure maxderee as as begin begin select max(degree) as select
16、 max(degree) as 最高分最高分 from score from score end end執(zhí)行執(zhí)行maxdegreemaxdegree存儲過程的程序如下:存儲過程的程序如下:EXEC maxdegreeEXEC maxdegree其執(zhí)行結(jié)果如圖所示:其執(zhí)行結(jié)果如圖所示: n1. 1. 使用參數(shù)使用參數(shù)帶參數(shù)的存儲過程的一般格式如下:帶參數(shù)的存儲過程的一般格式如下:CREATE PROCEDURE CREATE PROCEDURE 存儲過程名存儲過程名( ( 參數(shù)列表參數(shù)列表 ) )AS SQLAS SQL語句語句10.1.3 10.1.3 存儲過程的參數(shù)存儲過程的參數(shù)【例例】 設(shè)
17、計一個存儲過程設(shè)計一個存儲過程maxnomaxno,以學(xué)號為參數(shù),輸出指定,以學(xué)號為參數(shù),輸出指定學(xué)號學(xué)生的所有課程中最高分和對應(yīng)的課程名及成績。學(xué)號學(xué)生的所有課程中最高分和對應(yīng)的課程名及成績。解:解:CREATE PROCEDURE CREATE PROCEDURE maxnomaxno(no char(10) (no char(10) ASAS SELECT s. SELECT s.學(xué)號學(xué)號,s.,s.姓名姓名,c.,c.課程名課程名,sc.,sc.分?jǐn)?shù)分?jǐn)?shù) FROM student FROM student s,courses,course c,scorec,score scsc WHE
18、RE s. WHERE s.學(xué)號學(xué)號=no AND s.=no AND s.學(xué)號學(xué)號=sc.=sc.學(xué)號學(xué)號 AND c. AND c.課程號課程號=sc.=sc.課程號課程號 AND sc. AND sc.分?jǐn)?shù)分?jǐn)?shù)= = (SELECT MAX( (SELECT MAX(分?jǐn)?shù)分?jǐn)?shù)) FROM score WHERE ) FROM score WHERE 學(xué)號學(xué)號=no)=no)GOGO采用方式一執(zhí)行存儲過程采用方式一執(zhí)行存儲過程maxnomaxno的程序如下:的程序如下:EXEC EXEC maxnomaxno 103 103采用方式二執(zhí)行存儲過程采用方式二執(zhí)行存儲過程maxnomaxno的
19、程序如下:的程序如下:EXEC EXEC maxnomaxno no=103 no=103n2. 2. 使用默認(rèn)參數(shù)使用默認(rèn)參數(shù)q在設(shè)計存儲過程時,可以為參數(shù)提供一個默認(rèn)值,在設(shè)計存儲過程時,可以為參數(shù)提供一個默認(rèn)值,默認(rèn)值必須為常量或者默認(rèn)值必須為常量或者NULLNULL。其一般格式如下:。其一般格式如下:CREATE PROCEDURE CREATE PROCEDURE 存儲過程名存儲過程名( ( 參數(shù)參數(shù)1=1=默認(rèn)值默認(rèn)值1, 1, 參參數(shù)數(shù)2=2=默認(rèn)值默認(rèn)值2, )2, )AS SQLAS SQL語句語句q在調(diào)用存儲過程時,如果不指定對應(yīng)的實參值,則在調(diào)用存儲過程時,如果不指定對應(yīng)
20、的實參值,則自動用對應(yīng)的默認(rèn)值代替。自動用對應(yīng)的默認(rèn)值代替。【例例】 設(shè)計一個存儲過程設(shè)計一個存儲過程maxnomaxno,以學(xué)號為參數(shù),輸出指定,以學(xué)號為參數(shù),輸出指定學(xué)號學(xué)生的所有課程中最高分和對應(yīng)的課程名,學(xué)號默認(rèn)值為學(xué)號學(xué)生的所有課程中最高分和對應(yīng)的課程名,學(xué)號默認(rèn)值為101101。解:解:CREATE PROCEDURE maxno1(no CREATE PROCEDURE maxno1(no intint=101) =101) AS AS SELECT s. SELECT s.學(xué)號學(xué)號,s.,s.姓名姓名,c.,c.課程名課程名,sc.,sc.分?jǐn)?shù)分?jǐn)?shù) FROM student F
21、ROM student s,courses,course c,scorec,score scsc WHERE s. WHERE s.學(xué)號學(xué)號=no AND s.=no AND s.學(xué)號學(xué)號=sc.=sc.學(xué)號學(xué)號 AND c. AND c.課程號課程號=sc.=sc.課程號課程號 AND sc. AND sc.分?jǐn)?shù)分?jǐn)?shù)= = (SELECT MAX( (SELECT MAX(分?jǐn)?shù)分?jǐn)?shù)) FROM score WHERE ) FROM score WHERE 學(xué)號學(xué)號=no)=no)當(dāng)不指定實參調(diào)用當(dāng)不指定實參調(diào)用maxno1maxno1存儲過程時,其結(jié)果如圖所示:存儲過程時,其結(jié)果如圖所示:
22、當(dāng)指定實參為當(dāng)指定實參為105105調(diào)用調(diào)用maxno1maxno1存儲過程時,其結(jié)果如圖所:存儲過程時,其結(jié)果如圖所:n3. 3. 使用返回參數(shù)使用返回參數(shù) 在創(chuàng)建存儲過程時,可以定義返回參數(shù)。在執(zhí)在創(chuàng)建存儲過程時,可以定義返回參數(shù)。在執(zhí)行存儲過程時,可以將結(jié)果給返回參數(shù)。返回參行存儲過程時,可以將結(jié)果給返回參數(shù)。返回參數(shù)用數(shù)用OUTPUTOUTPUT進行說明。進行說明?!纠?創(chuàng)建一個存儲過程創(chuàng)建一個存儲過程averageaverage,它返回兩個參數(shù),它返回兩個參數(shù)st_namest_name和和st_avgst_avg,分別代表了姓名和平均分。并編寫,分別代表了姓名和平均分。并編寫T
23、-T-SQLSQL語句執(zhí)行該存儲過程和查看輸出的結(jié)果。語句執(zhí)行該存儲過程和查看輸出的結(jié)果。解:建立存儲過程解:建立存儲過程averageaverage的程序如下:的程序如下:CREATE PROCEDURE averageCREATE PROCEDURE average( ( st_nost_no intint, , st_namest_name char(8) char(8) OUTPUTOUTPUT, , st_avgst_avg float float OUTPUTOUTPUT) AS) AS SELECT SELECT st_namest_name=student.=student.姓
24、名姓名,st_avgst_avg=AVG(score.=AVG(score.分?jǐn)?shù)分?jǐn)?shù)) ) FROM FROM student,scorestudent,score WHERE student. WHERE student.學(xué)號學(xué)號=score.=score.學(xué)號學(xué)號 GROUP BY student.GROUP BY student.學(xué)號學(xué)號,student.,student.姓名姓名 HAVING student.HAVING student.學(xué)號學(xué)號=st_nost_no執(zhí)行該存儲過程,來查詢學(xué)號為執(zhí)行該存儲過程,來查詢學(xué)號為“105”105”的學(xué)生姓名和平均分:的學(xué)生姓名和平均分:DE
25、CLARE DECLARE st_namest_name char(10) char(10)DECLARE DECLARE st_avgst_avg float floatEXEC average 105,st_name EXEC average 105,st_name OUTPUTOUTPUT, , st_avgst_avg OUTPUTOUTPUTSELECT SELECT 姓名姓名=st_namest_name,平均分平均分=st_avgst_avgn4. 4. 存儲過程的返回值存儲過程的返回值q存儲過程在執(zhí)行后都會返回一個整型值(稱為存儲過程在執(zhí)行后都會返回一個整型值(稱為“返返回代碼
26、回代碼”),指示存儲過程的執(zhí)行狀態(tài)。),指示存儲過程的執(zhí)行狀態(tài)。q如果執(zhí)行成功,返回如果執(zhí)行成功,返回0 0;否則返回;否則返回-1-1-99-99之間的數(shù)之間的數(shù)值(例如值(例如-1-1表示找不到對象,表示找不到對象,-2-2表示數(shù)據(jù)類型錯誤表示數(shù)據(jù)類型錯誤,-5-5表示語法錯誤等)。表示語法錯誤等)。q也可以使用也可以使用RETURNRETURN語句指定一個返回值。語句指定一個返回值?!纠?編寫一個程序,創(chuàng)建存儲過程編寫一個程序,創(chuàng)建存儲過程test_rettest_ret,根據(jù)輸入,根據(jù)輸入的參數(shù)來判斷返回值。的參數(shù)來判斷返回值。解:建立存儲過程解:建立存儲過程test_rettes
27、t_ret如下:如下:CREATE PROC ret(id int = 0)CREATE PROC ret(id int = 0) IF id=0 IF id=0 RETURN 0 RETURN 0 IF id0 IF id0 RETURN 1000 RETURN 1000 IF id0 IF id0 RETURN -1000 RETURN -1000 執(zhí)行以上存儲過程:執(zhí)行以上存儲過程:declare r intdeclare r intexec r=ret 1exec r=ret 1print rprint r運行結(jié)果:運行結(jié)果:10.1.4 10.1.4 查看、修改和刪除存儲過程查看、修
28、改和刪除存儲過程n使用使用SQL ServerSQL Server管理控制器查看或修改存儲過管理控制器查看或修改存儲過程程n使用使用sp_helptextsp_helptext存儲過程來查看存儲過程的定存儲過程來查看存儲過程的定義信息義信息n使用使用SQL ServerSQL Server管理控制器刪除存儲過程管理控制器刪除存儲過程n使用使用DROP PROCEDUREDROP PROCEDURE刪除存儲過程刪除存儲過程【例例】 使用相關(guān)系統(tǒng)存儲過程查看存儲過程使用相關(guān)系統(tǒng)存儲過程查看存儲過程stud_degreestud_degree的的相關(guān)內(nèi)容。相關(guān)內(nèi)容。解:對應(yīng)的程序如下:解:對應(yīng)的程序
29、如下:USE schoolUSE schoolGOGOEXEC sp_helptext stud_degreeEXEC sp_helptext stud_degree10.2 10.2 觸發(fā)器觸發(fā)器n觸發(fā)器是一種特殊類型的存儲過程。觸發(fā)器可包含復(fù)觸發(fā)器是一種特殊類型的存儲過程。觸發(fā)器可包含復(fù)雜的雜的T-SQLT-SQL語句。觸發(fā)器不能通過名稱被直接調(diào)用,語句。觸發(fā)器不能通過名稱被直接調(diào)用,也不允許設(shè)置參數(shù)。它是在插入、刪除和修改指定表也不允許設(shè)置參數(shù)。它是在插入、刪除和修改指定表中的數(shù)據(jù)時觸發(fā)執(zhí)行。中的數(shù)據(jù)時觸發(fā)執(zhí)行。n觸發(fā)器可以強制執(zhí)行一定的業(yè)務(wù)規(guī)則,以保持?jǐn)?shù)據(jù)完觸發(fā)器可以強制執(zhí)行一定的業(yè)務(wù)
30、規(guī)則,以保持?jǐn)?shù)據(jù)完整性、檢查數(shù)據(jù)有效性、實現(xiàn)數(shù)據(jù)庫管理任務(wù)和一些整性、檢查數(shù)據(jù)有效性、實現(xiàn)數(shù)據(jù)庫管理任務(wù)和一些附加功能。附加功能。n對于數(shù)據(jù)庫中約束所不能保證的復(fù)雜的參照完整性和對于數(shù)據(jù)庫中約束所不能保證的復(fù)雜的參照完整性和數(shù)據(jù)的一致性可使用觸發(fā)器來實現(xiàn)。數(shù)據(jù)的一致性可使用觸發(fā)器來實現(xiàn)。10.2.1 10.2.1 觸發(fā)器概述觸發(fā)器概述1. 1. 觸發(fā)器的功能觸發(fā)器的功能q在在SQL ServerSQL Server內(nèi)部,觸發(fā)器被看作是存儲過程,它與存內(nèi)部,觸發(fā)器被看作是存儲過程,它與存儲過程所經(jīng)歷的處理過程類似。但是觸發(fā)器沒有輸入?yún)^程所經(jīng)歷的處理過程類似。但是觸發(fā)器沒有輸入?yún)?shù)和輸出參數(shù),
31、因而不能被顯示調(diào)用。它作為語句的執(zhí)數(shù)和輸出參數(shù),因而不能被顯示調(diào)用。它作為語句的執(zhí)行結(jié)果自動引發(fā),而存儲過程則是通過存儲過程名稱而行結(jié)果自動引發(fā),而存儲過程則是通過存儲過程名稱而被直接調(diào)用。被直接調(diào)用。q觸發(fā)器與表緊密相連,當(dāng)用戶對表進行諸如觸發(fā)器與表緊密相連,當(dāng)用戶對表進行諸如UPDATEUPDATE、INSERTINSERT和和DELETEDELETE這些操作時,系統(tǒng)會自動執(zhí)行觸發(fā)器所這些操作時,系統(tǒng)會自動執(zhí)行觸發(fā)器所定義的定義的SQLSQL語句,從而確保對數(shù)據(jù)的處理符合由這些語句,從而確保對數(shù)據(jù)的處理符合由這些SQL SQL 語句所定義的規(guī)則。語句所定義的規(guī)則。 q強化約束:觸發(fā)器能夠?qū)?/p>
32、現(xiàn)比強化約束:觸發(fā)器能夠?qū)崿F(xiàn)比CHECK CHECK 語句更為復(fù)雜的約束:語句更為復(fù)雜的約束:l觸發(fā)器可以很方便地引用其他表的列,去進行邏輯上的觸發(fā)器可以很方便地引用其他表的列,去進行邏輯上的檢查;檢查;l觸發(fā)器是在觸發(fā)器是在CHECKCHECK之后執(zhí)行的;之后執(zhí)行的;l觸發(fā)器可以插入,刪除,更新多行。觸發(fā)器可以插入,刪除,更新多行。q跟蹤變化:觸發(fā)器可以偵測數(shù)據(jù)庫內(nèi)的操作從而禁止數(shù)據(jù)跟蹤變化:觸發(fā)器可以偵測數(shù)據(jù)庫內(nèi)的操作從而禁止數(shù)據(jù)庫中未經(jīng)許可的更新和變化,確保輸入表中的數(shù)據(jù)的有效庫中未經(jīng)許可的更新和變化,確保輸入表中的數(shù)據(jù)的有效性。例如在庫存系統(tǒng)中,觸發(fā)器可以檢測到當(dāng)實際庫存下性。例如在庫
33、存系統(tǒng)中,觸發(fā)器可以檢測到當(dāng)實際庫存下降到了需要再進貨的臨界量,就給出管理員相應(yīng)提示信息降到了需要再進貨的臨界量,就給出管理員相應(yīng)提示信息或自動生成給供應(yīng)商的訂單;或自動生成給供應(yīng)商的訂單;q級聯(lián)運行:觸發(fā)器可以偵測數(shù)據(jù)庫內(nèi)的操作,并自動地級級聯(lián)運行:觸發(fā)器可以偵測數(shù)據(jù)庫內(nèi)的操作,并自動地級聯(lián)影響整個數(shù)據(jù)庫的不同表中的各項內(nèi)容。如:設(shè)置一個聯(lián)影響整個數(shù)據(jù)庫的不同表中的各項內(nèi)容。如:設(shè)置一個觸發(fā)器,當(dāng)觸發(fā)器,當(dāng)studentstudent表中刪除一個學(xué)號信息時,對應(yīng)的表中刪除一個學(xué)號信息時,對應(yīng)的scorescore表中相應(yīng)的學(xué)號信息也被刪除;表中相應(yīng)的學(xué)號信息也被刪除;q調(diào)用存儲過程:為了響應(yīng)
34、數(shù)據(jù)庫更新,觸發(fā)器可以調(diào)用一調(diào)用存儲過程:為了響應(yīng)數(shù)據(jù)庫更新,觸發(fā)器可以調(diào)用一個或多個存儲過程。個或多個存儲過程。2. 2. 觸發(fā)器的種類觸發(fā)器的種類nSQL Server 2008SQL Server 2008支持兩種類型的觸發(fā)器:支持兩種類型的觸發(fā)器:DMLDML觸發(fā)器和觸發(fā)器和DDLDDL觸發(fā)器。觸發(fā)器。qDMLDML觸發(fā)器觸發(fā)器:如果用戶要通過數(shù)據(jù)操作語言:如果用戶要通過數(shù)據(jù)操作語言 (DML)(DML)編輯編輯數(shù)據(jù),則執(zhí)行數(shù)據(jù),則執(zhí)行 DML DML 觸發(fā)器。觸發(fā)器。DML DML 事件是針對表或視圖事件是針對表或視圖的的 INSERTINSERT、UPDATEUPDATE和和DEL
35、ETE DELETE 語句,即語句,即DMLDML觸發(fā)器在數(shù)觸發(fā)器在數(shù)據(jù)修改時被執(zhí)行。系統(tǒng)將觸發(fā)器和觸發(fā)它的語句作為可據(jù)修改時被執(zhí)行。系統(tǒng)將觸發(fā)器和觸發(fā)它的語句作為可在觸發(fā)器內(nèi)回滾的單個事務(wù)對待。如果檢測到錯誤(例在觸發(fā)器內(nèi)回滾的單個事務(wù)對待。如果檢測到錯誤(例如,磁盤空間不足),則整個事務(wù)自動回滾;如,磁盤空間不足),則整個事務(wù)自動回滾;qDDLDDL觸發(fā)器:觸發(fā)器:為了響應(yīng)各種數(shù)據(jù)定義語言為了響應(yīng)各種數(shù)據(jù)定義語言 (DDL) (DDL) 事件而事件而激發(fā)。激發(fā)。DDLDDL事件主要與以關(guān)鍵字事件主要與以關(guān)鍵字 CREATECREATE、ALTER ALTER 和和 DROP DROP 開頭
36、的開頭的 T-SQL T-SQL 語句對應(yīng)。它們可以用于在數(shù)據(jù)庫語句對應(yīng)。它們可以用于在數(shù)據(jù)庫中執(zhí)行管理任務(wù),例如,審核以及規(guī)范數(shù)據(jù)庫操作。中執(zhí)行管理任務(wù),例如,審核以及規(guī)范數(shù)據(jù)庫操作。10.2.2 DML10.2.2 DML觸發(fā)器的創(chuàng)建和應(yīng)用觸發(fā)器的創(chuàng)建和應(yīng)用n1. DML1. DML觸發(fā)器的分類觸發(fā)器的分類qAFTERAFTER觸發(fā)器:觸發(fā)器:這類觸發(fā)器是在記錄已經(jīng)被改變完,相這類觸發(fā)器是在記錄已經(jīng)被改變完,相關(guān)事務(wù)提交后,才會被觸發(fā)執(zhí)行。主要是用于記錄變更關(guān)事務(wù)提交后,才會被觸發(fā)執(zhí)行。主要是用于記錄變更后的處理或檢查,一旦發(fā)現(xiàn)錯誤,可以用后的處理或檢查,一旦發(fā)現(xiàn)錯誤,可以用ROLLBAC
37、K ROLLBACK TRANSACTIONTRANSACTION語句來回滾本次的操作。對同一個表達(dá)操語句來回滾本次的操作。對同一個表達(dá)操作,可定義多個作,可定義多個AFTERAFTER觸發(fā)器,并定義各種觸發(fā)器執(zhí)行觸發(fā)器,并定義各種觸發(fā)器執(zhí)行的先后順序。的先后順序。qINSTEAD OFINSTEAD OF觸發(fā)器:觸發(fā)器:這類觸發(fā)器并不去執(zhí)行其所定義的這類觸發(fā)器并不去執(zhí)行其所定義的操作(操作(INSERTINSERT、UPDATEUPDATE、DELETEDELETE),而去執(zhí)行觸發(fā)器本),而去執(zhí)行觸發(fā)器本身所定義的操作。這類觸發(fā)器一般是用來取代原本的操身所定義的操作。這類觸發(fā)器一般是用來取代
38、原本的操作,在記錄變更之前被觸發(fā)的。作,在記錄變更之前被觸發(fā)的。n2. 2. 觸發(fā)器中的邏輯(虛擬)表觸發(fā)器中的邏輯(虛擬)表q當(dāng)表被修改,無論是插入、修改還是刪除,被操作的記當(dāng)表被修改,無論是插入、修改還是刪除,被操作的記錄會保存在兩個系統(tǒng)的邏輯表中,這兩個邏輯表是錄會保存在兩個系統(tǒng)的邏輯表中,這兩個邏輯表是insertedinserted(插入)表和(插入)表和deleteddeleted(刪除)表。(刪除)表。q這兩個表是建在數(shù)據(jù)庫服務(wù)器的內(nèi)存中的,是由系統(tǒng)管這兩個表是建在數(shù)據(jù)庫服務(wù)器的內(nèi)存中的,是由系統(tǒng)管理的邏輯表,而不是真正存儲在數(shù)據(jù)庫中的物理表。對理的邏輯表,而不是真正存儲在數(shù)據(jù)庫
39、中的物理表。對于這兩個表,用戶只有讀取的權(quán)限,沒有修改的權(quán)限。于這兩個表,用戶只有讀取的權(quán)限,沒有修改的權(quán)限。當(dāng)觸發(fā)器的工作完成之后,這兩個表將會從內(nèi)存中刪除。當(dāng)觸發(fā)器的工作完成之后,這兩個表將會從內(nèi)存中刪除。qinsertedinserted表里存放的是新插入的記錄:對于表里存放的是新插入的記錄:對于INSERTINSERT操作來說,操作來說,INSERTINSERT觸發(fā)器執(zhí)行,新的記錄插入到觸發(fā)器表和觸發(fā)器執(zhí)行,新的記錄插入到觸發(fā)器表和insertedinserted表表中。在進行中。在進行INSERTINSERT和和UPDATEUPDATE觸發(fā)器時,觸發(fā)器時,insertedinsert
40、ed表中有數(shù)表中有數(shù)據(jù),而在據(jù),而在DELETEDELETE觸發(fā)器中觸發(fā)器中insertedinserted表是空的。表是空的。qDeletedDeleted表里存放的是已從表中刪除的記錄:對于表里存放的是已從表中刪除的記錄:對于DELETEDELETE操操作來說,作來說,DELETEDELETE觸發(fā)器執(zhí)行,被刪除的舊記錄存放到觸發(fā)器執(zhí)行,被刪除的舊記錄存放到DeletedDeleted表中。表中。qUPDATEUPDATE操作等價于插入一條新記錄,同時刪除舊記錄。對于操作等價于插入一條新記錄,同時刪除舊記錄。對于UPDATEUPDATE操作來說,操作來說,UPDATEUPDATE觸發(fā)器執(zhí)行,
41、表中原記錄被移動到觸發(fā)器執(zhí)行,表中原記錄被移動到DeletedDeleted表中(更新完后即被刪除),修改后的記錄插入到表中(更新完后即被刪除),修改后的記錄插入到InsertedInserted表中。表中。qinsertedinserted和和deleteddeleted表的結(jié)構(gòu)與觸發(fā)器所在數(shù)據(jù)表的結(jié)構(gòu)是表的結(jié)構(gòu)與觸發(fā)器所在數(shù)據(jù)表的結(jié)構(gòu)是完全一致的。它們的操作和普通表的操作也一致。例如,若完全一致的。它們的操作和普通表的操作也一致。例如,若要檢索要檢索 deleted deleted 表中的所有值,則使用語句:表中的所有值,則使用語句: SELECT SELECT * * FROM dele
42、ted FROM deletedn3. 3. 創(chuàng)建創(chuàng)建DMLDML觸發(fā)器的語法規(guī)則觸發(fā)器的語法規(guī)則q創(chuàng)建創(chuàng)建DMLDML觸發(fā)器的語法規(guī)則如下:觸發(fā)器的語法規(guī)則如下:CREATE TRIGGER CREATE TRIGGER 觸發(fā)器名稱觸發(fā)器名稱ON table | view ON table | view FOR |AFTER | INSTEAD OF FOR |AFTER | INSTEAD OF INSERT , UPDATE , INSERT , UPDATE , DELETE DELETE AS AS SQLSQL語句語句,nnu其中:其中: AFTERAFTER 指定觸發(fā)器只有在觸發(fā)
43、指定觸發(fā)器只有在觸發(fā) SQL SQL 語句中指定的所有語句中指定的所有操作都已成功執(zhí)行后才激發(fā)。所有的引用級聯(lián)操操作都已成功執(zhí)行后才激發(fā)。所有的引用級聯(lián)操作和約束檢查也必須成功完成后,才能執(zhí)行此觸作和約束檢查也必須成功完成后,才能執(zhí)行此觸發(fā)器。如果僅指定發(fā)器。如果僅指定 FOR FOR 關(guān)鍵字,則關(guān)鍵字,則 AFTER AFTER 是默是默認(rèn)設(shè)置。認(rèn)設(shè)置。 INSTEAD OFINSTEAD OF 指定執(zhí)行觸發(fā)器而不是執(zhí)行觸發(fā)指定執(zhí)行觸發(fā)器而不是執(zhí)行觸發(fā) SQL SQL 語句,從語句,從而替代觸發(fā)語句的操作。而替代觸發(fā)語句的操作?!纠?使用使用SSMSSSMS在在studentstuden
44、t表上創(chuàng)建一個觸發(fā)器表上創(chuàng)建一個觸發(fā)器trigoptrigop,其,其功能是在用戶插入、修改或刪除該表中行中輸出所有的行。功能是在用戶插入、修改或刪除該表中行中輸出所有的行。 CREATE TRIGGER CREATE TRIGGER tr1tr1ON student AFTER INSERT,DELETE,UPDATEON student AFTER INSERT,DELETE,UPDATEAS AS BEGINBEGINSET NOCOUNT ONSET NOCOUNT ONSELECT SELECT * * FROM student FROM studentENDENDGOGO在觸發(fā)器在
45、觸發(fā)器tr1tr1創(chuàng)建創(chuàng)建完畢,當(dāng)對完畢,當(dāng)對studentstudent表進行記錄插入、修改表進行記錄插入、修改或刪除操作時,觸發(fā)器或刪除操作時,觸發(fā)器tr1tr1都會都會被自動執(zhí)行。被自動執(zhí)行。例如,執(zhí)行以下語句:例如,執(zhí)行以下語句:INSERT student INSERT student VALUES(1, VALUES(1,劉明劉明,男男,1991-12-12,1035),1991-12-12,1035)當(dāng)當(dāng)向向studentstudent表中插入一個記錄時自動執(zhí)行觸發(fā)器表中插入一個記錄時自動執(zhí)行觸發(fā)器tr1tr1輸出輸出其其所有記錄,輸出結(jié)果如圖所示,從中看到新記錄已經(jīng)插入到所有記
46、錄,輸出結(jié)果如圖所示,從中看到新記錄已經(jīng)插入到studentstudent表中了。表中了。 例:創(chuàng)建觸發(fā)器例:創(chuàng)建觸發(fā)器stu_deletestu_delete,實現(xiàn)如下功能:當(dāng)按照學(xué)號刪,實現(xiàn)如下功能:當(dāng)按照學(xué)號刪除除studentstudent表中的某學(xué)生記錄后,對應(yīng)的該學(xué)生在表中的某學(xué)生記錄后,對應(yīng)的該學(xué)生在scorescore表表中的記錄也被自動刪除中的記錄也被自動刪除。T-SQLT-SQL語句為:語句為:CREATE TRIGGER CREATE TRIGGER stu_Deletestu_Delete ON student ON studentFOR DELETEFOR DELET
47、EASASDELETE FROM score WHERE DELETE FROM score WHERE snosno=(SELECT =(SELECT snosno FROM FROM deleted)deleted)在在studentstudent表中執(zhí)行數(shù)據(jù)刪除語句:表中執(zhí)行數(shù)據(jù)刪除語句:DELETE FROM student WHERE DELETE FROM student WHERE snosno=20070102=20070102 執(zhí)行上述語句設(shè)定的觸發(fā)器被觸發(fā),執(zhí)行上述語句設(shè)定的觸發(fā)器被觸發(fā),scorescore表中的相應(yīng)數(shù)據(jù)表中的相應(yīng)數(shù)據(jù)被自動刪除??赏ㄟ^查詢被自動刪除??赏?/p>
48、過查詢studentstudent表和表和scorescore表刪除前后的該表刪除前后的該生記錄進行觸發(fā)器的驗證。生記錄進行觸發(fā)器的驗證。n上面例題的執(zhí)行過程如下:上面例題的執(zhí)行過程如下:(1 1)當(dāng)系統(tǒng)接收到一個要執(zhí)行)當(dāng)系統(tǒng)接收到一個要執(zhí)行studentstudent表刪除操作表刪除操作的的T-SQLT-SQL語句時,系統(tǒng)將要刪除的記錄存放在刪除表語句時,系統(tǒng)將要刪除的記錄存放在刪除表DeletedDeleted中;中;(2 2)把數(shù)據(jù)表)把數(shù)據(jù)表studentstudent中的相應(yīng)記錄刪除;中的相應(yīng)記錄刪除;(3 3)刪除操作激活了事先編制的)刪除操作激活了事先編制的AFTERAFTER
49、觸發(fā)器,系觸發(fā)器,系統(tǒng)執(zhí)行統(tǒng)執(zhí)行AFTERAFTER觸發(fā)器中觸發(fā)器中ASAS后的后的T-SQLT-SQL語句;語句;(4 4)觸發(fā)器執(zhí)行完畢之后,刪除內(nèi)存中的)觸發(fā)器執(zhí)行完畢之后,刪除內(nèi)存中的DeletedDeleted表,結(jié)束整個操作。若觸發(fā)器語句執(zhí)行失敗,則整表,結(jié)束整個操作。若觸發(fā)器語句執(zhí)行失敗,則整個過程回滾,恢復(fù)到初始狀態(tài)。個過程回滾,恢復(fù)到初始狀態(tài)。【例例】 在數(shù)據(jù)庫在數(shù)據(jù)庫testtest中建立一個表中建立一個表table10table10,在該表上創(chuàng),在該表上創(chuàng)建一個觸發(fā)器建一個觸發(fā)器trigtesttrigtest。在。在table10table10表中插入、修改和刪除記表中
50、插入、修改和刪除記錄時,自動顯示表中的所有記錄。并用相關(guān)數(shù)據(jù)進行測試。錄時,自動顯示表中的所有記錄。并用相關(guān)數(shù)據(jù)進行測試。解:創(chuàng)建表和觸發(fā)器的語句如下:解:創(chuàng)建表和觸發(fā)器的語句如下:USE testUSE testGOGOCREATE TABLE table10CREATE TABLE table10 -創(chuàng)建表創(chuàng)建表table10table10( (c1 c1 intint, ,c2 char(30)c2 char(30)GOGOCREATE TRIGGER CREATE TRIGGER trigtesttrigtest -創(chuàng)建觸發(fā)器創(chuàng)建觸發(fā)器trigtesttrigtestON table1
51、0 AFTER INSERT,UPDATE,DELETE ON table10 AFTER INSERT,UPDATE,DELETE ASASSELECT SELECT * * FROM table10 FROM table10GOGO在執(zhí)行下面的語句時:在執(zhí)行下面的語句時:USE testUSE testINSERT Table10 VALUES(1,Name1)INSERT Table10 VALUES(1,Name1)GOGO結(jié)果會顯示出結(jié)果會顯示出table10table10表中的行如圖所示:表中的行如圖所示: 在執(zhí)行下面的語句時:在執(zhí)行下面的語句時:USE testUSE testU
52、PDATE Table10 SET c2=Name2 WHERE c1=1UPDATE Table10 SET c2=Name2 WHERE c1=1GOGO結(jié)果會顯示出結(jié)果會顯示出table10table10表中的記錄行如圖所示:表中的記錄行如圖所示:【例例】 下面一段下面一段T-SQLT-SQL語句說明語句說明insertedinserted表和表和deleteddeleted表表的作用。的作用。CREATE TRIGGER CREATE TRIGGER trigtesttrigtest ON table10 AFTER INSERT,UPDATE,DELETE ON table10 AF
53、TER INSERT,UPDATE,DELETEASAS PRINT inserted PRINT inserted表表: SELECT SELECT * * FROM inserted FROM inserted PRINT deleted PRINT deleted表表: SELECT SELECT * * FROM deleted FROM deletedGOGO如果此時執(zhí)行下面的如果此時執(zhí)行下面的INSERTINSERT語句:語句:INSERT table10 VALUES(2,Name3INSERT table10 VALUES(2,Name3)其執(zhí)行結(jié)果如圖所示:其執(zhí)行結(jié)果如圖所示
54、:如果此時接著執(zhí)行下面的如果此時接著執(zhí)行下面的UPDATEUPDATE語句:語句:UPDATE table10 SET c2=Name4 WHERE c1=2UPDATE table10 SET c2=Name4 WHERE c1=2其執(zhí)行結(jié)果如圖所示其執(zhí)行結(jié)果如圖所示: : 如果此時接著執(zhí)行下面的如果此時接著執(zhí)行下面的DELETEDELETE語句:語句:DELETE table10 WHERE c1=2DELETE table10 WHERE c1=2其執(zhí)行結(jié)果如如圖所示:其執(zhí)行結(jié)果如如圖所示:【例例】 建立一個觸發(fā)器建立一個觸發(fā)器tntn,當(dāng)向,當(dāng)向studentstudent表中插入數(shù)據(jù)
55、時,表中插入數(shù)據(jù)時,如果出現(xiàn)姓名重復(fù)的情況,則回滾該事務(wù)。如果出現(xiàn)姓名重復(fù)的情況,則回滾該事務(wù)。解:創(chuàng)建觸發(fā)器解:創(chuàng)建觸發(fā)器trignametrigname的程序如下:的程序如下:CREATE TRIGGER tnCREATE TRIGGER tn ON student AFTER INSERT ON student AFTER INSERT ASASBEGINBEGINDECLARE name char(10)DECLARE name char(10)SELECT name=inserted.SELECT name=inserted.姓名姓名 FROM insertedFROM insert
56、edIF EXISTS(SELECT IF EXISTS(SELECT 姓名姓名 FROM student FROM student WHERE WHERE 姓名姓名=name)=name)BEGINBEGINRAISERROR(RAISERROR(姓名重復(fù)姓名重復(fù), ,不能插入不能插入,16,1),16,1)ROLLBACKROLLBACKENDENDENDEND執(zhí)行以下程序:執(zhí)行以下程序:INSERT INTO student(INSERT INTO student(學(xué)號學(xué)號, ,姓名姓名, ,性別性別) ) VALUES(102, VALUES(102,王麗王麗,女女)出現(xiàn)如圖所示的消息
57、,提示插入的記錄出錯。出現(xiàn)如圖所示的消息,提示插入的記錄出錯。 再打開再打開studentstudent表,從中看到,由于進行了事務(wù)回滾,表,從中看到,由于進行了事務(wù)回滾,所以并不會真正向所以并不會真正向studentstudent表中插入學(xué)號為表中插入學(xué)號為102102的新記錄。的新記錄。 【例例】 建立一個觸發(fā)器建立一個觸發(fā)器tsts,當(dāng)向,當(dāng)向studentstudent表中插入數(shù)據(jù)時,表中插入數(shù)據(jù)時,如果出現(xiàn)性別不正確的情況,不回滾該事務(wù),只提示錯誤消息。如果出現(xiàn)性別不正確的情況,不回滾該事務(wù),只提示錯誤消息。解:創(chuàng)建觸發(fā)器解:創(chuàng)建觸發(fā)器trignsextrignsex的程序如下:的程
58、序如下:CREATE TRIGGER CREATE TRIGGER tstsON student AFTER INSERTON student AFTER INSERTASASDECLARE s1 char(1)DECLARE s1 char(1)SELECT s1=SELECT s1=性別性別 FROM INSERTEDFROM INSERTEDIF s1IF s1男男 OR s1 OR s1女女 RAISERROR(RAISERROR(性別只能取男或女性別只能取男或女,16,1),16,1)GOGO當(dāng)執(zhí)行以下程序:當(dāng)執(zhí)行以下程序:INSERT student VALUES(2,INSERT
59、 student VALUES(2,許濤許濤,M,1992-10-16,1035),M,1992-10-16,1035)出現(xiàn)如圖所示的消息,提示插入的記錄出錯。出現(xiàn)如圖所示的消息,提示插入的記錄出錯。 再打開再打開studentstudent表,從中看到,由于沒有進行事務(wù)回滾,表,從中看到,由于沒有進行事務(wù)回滾,盡管要插入的記錄不正確,但仍然插入到盡管要插入的記錄不正確,但仍然插入到studentstudent表中了。表中了。 【例例】 建立一個修改觸發(fā)器建立一個修改觸發(fā)器trignotrigno,該觸發(fā)器防止用戶,該觸發(fā)器防止用戶修改表修改表studentstudent的學(xué)號。的學(xué)號。解:創(chuàng)
60、建觸發(fā)器解:創(chuàng)建觸發(fā)器trignnotrignno的程序如下:的程序如下:CREATE TRIGGER CREATE TRIGGER trignotrigno ON student ON student AFTER UPDATE AFTER UPDATEASAS IF UPDATE( IF UPDATE(學(xué)號學(xué)號) )BEGINBEGIN RAISERROR( RAISERROR(不能修改學(xué)號不能修改學(xué)號,16,2),16,2) ROLLBACK ROLLBACKENDENDGOGO當(dāng)執(zhí)行以下程序:當(dāng)執(zhí)行以下程序:UPDATE student SET UPDATE student SET 學(xué)號
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 死亡分配協(xié)議書范本
- 水費減免協(xié)議書范本
- 有效催收協(xié)議書范本
- 交通協(xié)議書范文模板
- 稅務(wù)委托繳費協(xié)議書
- 養(yǎng)育子女協(xié)議書范本
- 兄弟房屋捐贈協(xié)議書
- 業(yè)務(wù)合作欠款協(xié)議書
- 施工船舶租賃協(xié)議書
- 情侶協(xié)議書模板鏈接
- 電纜溝、電纜管、電纜井專項施工方案
- 2024年公務(wù)員考試中財務(wù)知識的考察試題及答案
- 《人工智能技術(shù)基礎(chǔ)》課件-第六章 知識圖譜
- 2025年山東省濟南市市中區(qū)中考物理一模試卷(無答案)
- (三模)吉林市2025屆高三第三次模擬測試 英語試卷(含答案詳解)
- 2024-2030年中國驅(qū)蚊用品行業(yè)市場深度分析及投資策略研究報告
- 廣東省深圳市寶安區(qū)10校聯(lián)考2023-2024學(xué)年八年級下學(xué)期4月期中物理試題(含答案)
- 2024年遼寧沈陽地鐵集團有限公司所屬公司招聘筆試真題
- 2024年中國移動招聘筆試真題
- 2025年安陽職業(yè)技術(shù)學(xué)院單招職業(yè)技能測試題庫及答案一套
- DL∕T 1751-2017 燃?xì)?蒸汽聯(lián)合循環(huán)機組余熱鍋爐運行規(guī)程
評論
0/150
提交評論