11存儲過程、觸發(fā)器_第1頁
11存儲過程、觸發(fā)器_第2頁
11存儲過程、觸發(fā)器_第3頁
11存儲過程、觸發(fā)器_第4頁
11存儲過程、觸發(fā)器_第5頁
已閱讀5頁,還剩50頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、 預(yù)編譯 數(shù)據(jù)庫對象 在使用在使用Transact-SQL語言編程的過程語言編程的過程 中,我們可以將某些需要多次調(diào)用的實現(xiàn)某個中,我們可以將某些需要多次調(diào)用的實現(xiàn)某個 特定任務(wù)的代碼段編寫成一個過程,將其保存特定任務(wù)的代碼段編寫成一個過程,將其保存 在數(shù)據(jù)庫中,并由在數(shù)據(jù)庫中,并由SQL Server服務(wù)器通過過服務(wù)器通過過 程名來調(diào)用它們,這些過程就叫做存儲過程程名來調(diào)用它們,這些過程就叫做存儲過程 (也稱為子程序)。(也稱為子程序)。 存儲過程在第一次執(zhí)行時進行語法檢查和存儲過程在第一次執(zhí)行時進行語法檢查和 編譯,編譯好的版本存儲在高速緩存中,用于編譯,編譯好的版本存儲在高速緩存中,用于

2、 后續(xù)調(diào)用,下次調(diào)用時可以直接執(zhí)行。后續(xù)調(diào)用,下次調(diào)用時可以直接執(zhí)行。 9.1.2 9.1.2 存儲過程的類型存儲過程的類型 SQL ServerSQL Server支持支持五種類型五種類型的存儲過程。的存儲過程。 (1 1)系統(tǒng)存儲過程)系統(tǒng)存儲過程 系統(tǒng)存儲過程是在系統(tǒng)存儲過程是在SQL ServerSQL Server中執(zhí)行管理活動的中執(zhí)行管理活動的 一類特殊的存儲過程(由系統(tǒng)提供)。系統(tǒng)存儲過程一類特殊的存儲過程(由系統(tǒng)提供)。系統(tǒng)存儲過程 創(chuàng)建和存儲于系統(tǒng)數(shù)據(jù)庫創(chuàng)建和存儲于系統(tǒng)數(shù)據(jù)庫mastermaster中,其前綴是中,其前綴是sp_ sp_ 。 系統(tǒng)存儲過程可以在任何的數(shù)據(jù)庫中執(zhí)

3、行卻不需要引系統(tǒng)存儲過程可以在任何的數(shù)據(jù)庫中執(zhí)行卻不需要引 用數(shù)據(jù)庫名用數(shù)據(jù)庫名master master 。我們可以通過系統(tǒng)存儲過程訪問。我們可以通過系統(tǒng)存儲過程訪問 和更新系統(tǒng)表。和更新系統(tǒng)表。 (2 2)用戶定義(本地)存儲過程)用戶定義(本地)存儲過程 用戶定義存儲過程是用戶在自己的數(shù)據(jù)庫中創(chuàng)建用戶定義存儲過程是用戶在自己的數(shù)據(jù)庫中創(chuàng)建 的存儲過程,完成特定數(shù)據(jù)庫操作任務(wù),其名稱不能的存儲過程,完成特定數(shù)據(jù)庫操作任務(wù),其名稱不能 加加sp_sp_前綴。前綴。 (3 3)臨時)臨時存儲過程存儲過程 臨時存儲過程屬于本地存儲過程,在存儲臨時存儲過程屬于本地存儲過程,在存儲 過程名稱前帶有過

4、程名稱前帶有# #或或#。其中,前綴為。其中,前綴為# #的表示的表示 私有存儲過程,只有創(chuàng)建私有存儲過程的連接私有存儲過程,只有創(chuàng)建私有存儲過程的連接 能夠執(zhí)行該存儲過程(即只能在一個用戶會話能夠執(zhí)行該存儲過程(即只能在一個用戶會話 中使用),并且存儲過程在連接關(guān)閉時自動被中使用),并且存儲過程在連接關(guān)閉時自動被 刪除。前綴為刪除。前綴為#的表示全局存儲過程,任何連的表示全局存儲過程,任何連 接都可以執(zhí)行該存儲過程(即可以在所有用戶接都可以執(zhí)行該存儲過程(即可以在所有用戶 會話中使用),當創(chuàng)建全局存儲過程的連接關(guān)會話中使用),當創(chuàng)建全局存儲過程的連接關(guān) 閉并且所有當前正在執(zhí)行該全局存儲過程的

5、連閉并且所有當前正在執(zhí)行該全局存儲過程的連 接都完成之后被自動刪除。接都完成之后被自動刪除。 (4 4)擴展存儲過程擴展存儲過程 擴展存儲過程是擴展存儲過程是SQL ServerSQL Server環(huán)境之外可以動環(huán)境之外可以動 態(tài)裝載和執(zhí)行的動態(tài)鏈接庫(態(tài)裝載和執(zhí)行的動態(tài)鏈接庫(DLLDLL)。擴展存儲過)。擴展存儲過 程的前綴是程的前綴是xp_xp_。 (5 5)遠程存儲過程遠程存儲過程 遠程存儲過程是指從遠程服務(wù)器(非本地遠程存儲過程是指從遠程服務(wù)器(非本地 SQL ServerSQL Server服務(wù)器)上的存儲過程。服務(wù)器)上的存儲過程。 部分語法格式如下:部分語法格式如下: CREA

6、TE PROCEDURE procedure_name CREATE PROCEDURE procedure_name parameter data_type = default parameter data_type = default OUTPUTOUTPUT ,.n WITH ,.n WITH RECOMPILE | ENCRYPTION | RECOMPILE, RECOMPILE | ENCRYPTION | RECOMPILE, ENCRYPTIONENCRYPTION AS sql_statement .nAS sql_statement .n 2. 2. 使用使用Transac

7、t-SQLTransact-SQL語句創(chuàng)建存儲過程語句創(chuàng)建存儲過程 procedure_nameprocedure_name:表示存儲過程名。存儲過表示存儲過程名。存儲過 程名必須遵循標識符命名規(guī)則。程名必須遵循標識符命名規(guī)則。 parameter parameter :表示存儲過程中使用的參數(shù)。表示存儲過程中使用的參數(shù)。 參數(shù)名必須遵循標識符命名規(guī)則。參數(shù)僅具有局參數(shù)名必須遵循標識符命名規(guī)則。參數(shù)僅具有局 部作用,因此,不同的存儲過程可以使用相同的部作用,因此,不同的存儲過程可以使用相同的 參數(shù)名。一個存儲過程中可以聲名一個或多個參參數(shù)名。一個存儲過程中可以聲名一個或多個參 數(shù),最多可達數(shù),

8、最多可達10241024個。定義時沒有個。定義時沒有OUTPUTOUTPUT關(guān)鍵關(guān)鍵 字的參數(shù)為輸入?yún)?shù),在存儲過程執(zhí)行時,除了字的參數(shù)為輸入?yún)?shù),在存儲過程執(zhí)行時,除了 有缺省值的輸入?yún)?shù)以外,所有聲明的輸入?yún)?shù)有缺省值的輸入?yún)?shù)以外,所有聲明的輸入?yún)?shù) 都必須提供值。都必須提供值。 主要參數(shù)含義:主要參數(shù)含義: data_typedata_type:表示參數(shù)的數(shù)據(jù)類型。存儲過程表示參數(shù)的數(shù)據(jù)類型。存儲過程 中聲明的參數(shù)可以使用所有的數(shù)據(jù)類型。中聲明的參數(shù)可以使用所有的數(shù)據(jù)類型。 defaultdefault:表示參數(shù)的缺省值。如果一個參數(shù)表示參數(shù)的缺省值。如果一個參數(shù) 具有缺省值,則存儲過

9、程執(zhí)行時可以不為其指定具有缺省值,則存儲過程執(zhí)行時可以不為其指定 值,如果指定值,則該值就取代缺省值。缺省值值,如果指定值,則該值就取代缺省值。缺省值 必須是常量或者空值,如果存儲過程中使用必須是常量或者空值,如果存儲過程中使用LIKELIKE 關(guān)鍵字,缺省值中可以包含通配符(關(guān)鍵字,缺省值中可以包含通配符(% %, _ _, ,and and )。)。 OUTPUT OUTPUT :表示聲明的參數(shù)是輸出參數(shù)。輸出表示聲明的參數(shù)是輸出參數(shù)。輸出 參數(shù)能夠在存儲過程執(zhí)行時返回值。參數(shù)能夠在存儲過程執(zhí)行時返回值。TextText或者或者 ImageImage數(shù)據(jù)類型的參數(shù)不能作為輸出參數(shù)。數(shù)據(jù)類型

10、的參數(shù)不能作為輸出參數(shù)。 RECOMPILE | ENCRYPTION | RECOMPILE, RECOMPILE | ENCRYPTION | RECOMPILE, ENCRYPTION ENCRYPTION RECOMPILE:RECOMPILE:表示表示SQL Server SQL Server 不緩存存儲過不緩存存儲過 程的計劃,因此存儲過程每次執(zhí)行都會被重新程的計劃,因此存儲過程每次執(zhí)行都會被重新 編譯。編譯。ENCRYPTIONENCRYPTION表示對存儲過程的文本進行表示對存儲過程的文本進行 加密。加密。 sql_statement sql_statement :表示存儲過程

11、中可以包表示存儲過程中可以包 含任意數(shù)量和類型的含任意數(shù)量和類型的Transact-SQLTransact-SQL語句。語句。 3. 3. 舉例舉例 例例9-19-1創(chuàng)建一個基于數(shù)據(jù)庫創(chuàng)建一個基于數(shù)據(jù)庫studentstudent的存儲過程,的存儲過程, 該存儲過程能夠查詢每個同學(xué)各門功課的成績,然該存儲過程能夠查詢每個同學(xué)各門功課的成績,然 后調(diào)用該過程。后調(diào)用該過程。 nUse student go create procdeure student_cj as select xs.學(xué)號, xs.姓名, kc.課程名,xs_kc.成績 from xs, kc, xs_kc where xs.

12、學(xué)號=xs_kc.學(xué)號 and xs_kc.課程號=kc.課程號 調(diào)用存儲過程調(diào)用存儲過程 nExec student_cjExec student_cj go go 通過上例了解存儲過程的使用。通過上例了解存儲過程的使用。 所用腳本內(nèi)容如下:所用腳本內(nèi)容如下: Use studentUse student If exists (select name from sysobjectsIf exists (select name from sysobjects where name=st_scr_sp and type=p) where name=st_scr_sp and type=p) Dr

13、op procedure st_scr_spDrop procedure st_scr_sp GoGo Create procedure st_scr_spCreate procedure st_scr_sp st_name varchar(6),co_name varchar(6)st_name varchar(6),co_name varchar(6) asas Select Select 姓名姓名, ,課程名稱課程名稱, ,成績成績 from from 成績表成績表 as sc inner join as sc inner join 學(xué)生表學(xué)生表 as stas st on sc. on

14、 sc.學(xué)號學(xué)號=st.=st.學(xué)號學(xué)號 inner join inner join 課程表課程表 as coas co 0n sc. 0n sc.課程編號課程編號=co.=co.課程編號課程編號 where where 姓名姓名=st_name and =st_name and 課程名稱課程名稱=co_name=co_name order by order by 成績成績 descdesc gogo Execute st_scr_sp Execute st_scr_sp 李向明李向明,計算機網(wǎng)絡(luò)基礎(chǔ)計算機網(wǎng)絡(luò)基礎(chǔ) 例例9-79-7從從xscjxscj數(shù)據(jù)庫的三個表中查詢某人指定課數(shù)據(jù)庫的三個

15、表中查詢某人指定課 程的成績和學(xué)分。程的成績和學(xué)分。 nUse xscjUse xscj go go create procedure student_info1 create procedure student_info1 name char(8),cname char(16) name char(8),cname char(16) as as select a. select a.學(xué)號學(xué)號, ,姓名姓名, ,課程名課程名, ,成績成績, ,學(xué)分學(xué)分 from xs a inner join xs_kc bfrom xs a inner join xs_kc b on a. on a.學(xué)號學(xué)

16、號=b.=b.學(xué)號學(xué)號 inner join kc tinner join kc t on b. on b.課程號課程號=t.=t.課程號課程號 Where a.Where a.姓名姓名=name and t.=name and t.課程名課程名=cname=cname GoGo student_info1student_info1存儲過程有多種執(zhí)行方式存儲過程有多種執(zhí)行方式 nExecute student_info1 Execute student_info1 李利軍李利軍,計算機計算機 基礎(chǔ)基礎(chǔ) 或或 Execute student_info1 name=Execute student_

17、info1 name=李利軍李利軍, , cname=cname=計算機基礎(chǔ)計算機基礎(chǔ) 或或 Execute student_info1,cname=Execute student_info1,cname=計算機基計算機基 礎(chǔ)礎(chǔ), , name=name=李利軍李利軍 9.2.2 9.2.2 執(zhí)行存儲過程執(zhí)行存儲過程 存儲過程創(chuàng)建成功后,保存在數(shù)據(jù)庫中。存儲過程創(chuàng)建成功后,保存在數(shù)據(jù)庫中。 在在SQL ServerSQL Server中可以使用中可以使用EXECUTEEXECUTE命令來直接命令來直接 執(zhí)行存儲過程。執(zhí)行存儲過程。 9.2.3 9.2.3 查看和修改存儲過程查看和修改存儲過程

18、n查看、修改存儲過程查看、修改存儲過程 n使用企業(yè)管理器查看、修改用戶創(chuàng)建使用企業(yè)管理器查看、修改用戶創(chuàng)建 的存儲過程的存儲過程 n使用系統(tǒng)存儲過程查看用戶創(chuàng)建的存使用系統(tǒng)存儲過程查看用戶創(chuàng)建的存 儲過程儲過程 2 2使用使用Transact-SQLTransact-SQL語句查看存儲過程語句查看存儲過程 根據(jù)不同需要,可以使用以下系統(tǒng)存儲過程。根據(jù)不同需要,可以使用以下系統(tǒng)存儲過程。 其語法格式如下:其語法格式如下: 1 1)查看存儲過程的文本信息:)查看存儲過程的文本信息: Sp-helptext Sp-helptext 存儲過程名存儲過程名 2 2)查看存儲過程的相關(guān)性)查看存儲過程的相

19、關(guān)性 Sp-depends Sp-depends 存儲過程名存儲過程名 3 3)查看存儲過程的一般信息)查看存儲過程的一般信息 Sp-help Sp-help 存儲過程名存儲過程名 n注:注: 同學(xué)們自主練習(xí)以上的例子。同學(xué)們自主練習(xí)以上的例子。 9.2.4 9.2.4 修改存儲過程修改存儲過程 n1 1使用企業(yè)管理器修改存儲過程使用企業(yè)管理器修改存儲過程 n2 2使用使用Transact-SQLTransact-SQL語句修改存儲過程語句修改存儲過程 例:例: nUse xscjUse xscj go go alter procedure student_info1 alter proced

20、ure student_info1 name char(8),cname char(16) name char(8),cname char(16) as as select a. select a.學(xué)號學(xué)號, ,姓名姓名, ,課程名課程名, ,成績成績, ,學(xué)分學(xué)分 from xs a inner join xs_kc bfrom xs a inner join xs_kc b on a. on a.學(xué)號學(xué)號=b.=b.學(xué)號學(xué)號 inner join kc tinner join kc t on b. on b.課程號課程號=t.=t.課程號課程號 Where a.Where a.姓名姓名=n

21、ame and t.=name and t.課程名課程名=cname=cname GoGo 9.2.5 9.2.5 重命名和刪除存儲過程重命名和刪除存儲過程 1. 1. 重命名存儲過程重命名存儲過程 n1)1)使用企業(yè)管理器重命名存儲使用企業(yè)管理器重命名存儲 名稱名稱( (略略) ) n2)2)使用系統(tǒng)存儲過程重命名存儲使用系統(tǒng)存儲過程重命名存儲 過程名稱過程名稱 2.2.刪除存儲過程刪除存儲過程 n1)1)使用企業(yè)管理器刪除存儲過程使用企業(yè)管理器刪除存儲過程( (略略) ) n2)2)使用使用Transact-SQLTransact-SQL語句刪除存儲過程語句刪除存儲過程 9.7.1 9.7

22、.1 概述概述 | 在指定的表中數(shù)據(jù)發(fā)生變化時被調(diào)用在指定的表中數(shù)據(jù)發(fā)生變化時被調(diào)用 以響應(yīng)以響應(yīng)INSERTINSERT、UPDATEUPDATE或或DELETEDELETE事件。事件。 | 用于保護表中的數(shù)據(jù),當有操作影響用于保護表中的數(shù)據(jù),當有操作影響 到到保護的數(shù)據(jù)時,觸發(fā)器自動強保護的數(shù)據(jù)時,觸發(fā)器自動強 制執(zhí)行業(yè)務(wù)規(guī)則。制執(zhí)行業(yè)務(wù)規(guī)則。 | 利用利用 觸發(fā)器是一種特殊類型的存儲過程,它不觸發(fā)器是一種特殊類型的存儲過程,它不 同于前面介紹過的一般的存儲過程。同于前面介紹過的一般的存儲過程。 一般的存儲過程通過存儲過程名稱被直接一般的存儲過程通過存儲過程名稱被直接 調(diào)用,而觸發(fā)器主要是

23、通過事件進行觸發(fā)而被執(zhí)調(diào)用,而觸發(fā)器主要是通過事件進行觸發(fā)而被執(zhí) 行行( (對表或視圖發(fā)出對表或視圖發(fā)出updateupdate、insertinsert、deletedelete語語 句句) )。 觸發(fā)器是一個功能強大的工具,它與表格緊觸發(fā)器是一個功能強大的工具,它與表格緊 密相連,在表中數(shù)據(jù)發(fā)生變化時自動強制執(zhí)行。密相連,在表中數(shù)據(jù)發(fā)生變化時自動強制執(zhí)行。 觸發(fā)器可以用于觸發(fā)器可以用于SQL ServerSQL Server約束、默認值和規(guī)則約束、默認值和規(guī)則 的完整性檢查,還可以完成難以用普通約束實現(xiàn)的完整性檢查,還可以完成難以用普通約束實現(xiàn) 的復(fù)雜功能。的復(fù)雜功能。 9.7.2 9.7

24、.2 觸發(fā)器的優(yōu)點觸發(fā)器的優(yōu)點 n觸發(fā)器是自動的執(zhí)行的(往表里插入、修改、 刪除時被自動激活,從而防止對數(shù)據(jù)的不正 確修改)。 n觸發(fā)器是基于一個表創(chuàng)建的,但可以針對多 個表進行操作,實現(xiàn)數(shù)據(jù)庫中的相關(guān)表進行 層疊更改。 n觸發(fā)器可以實現(xiàn)比 check約束更為復(fù)雜的數(shù) 據(jù)完整性約束。 n一個表中可以同時存在三個不同操作的觸發(fā) 器,對于同一個修改語句可以有多個不同的 對策以響應(yīng)。 9.7.3 9.7.3 觸發(fā)器的類型觸發(fā)器的類型 nAFTERAFTER觸發(fā)器觸發(fā)器( (又稱為后觸發(fā)器又稱為后觸發(fā)器) ) 是在引起觸發(fā)器執(zhí)行的修改語句完成之后執(zhí)行。 nINSTEAD OFINSTEAD OF觸發(fā)器

25、(又稱為替代觸發(fā)器)觸發(fā)器(又稱為替代觸發(fā)器) 當引起觸發(fā)器執(zhí)行的修改語句停止執(zhí)行時,該 類觸發(fā)器代替觸發(fā)操作執(zhí)行。 觸發(fā)器中使用的特殊表(邏輯表)觸發(fā)器中使用的特殊表(邏輯表) INSERTED INSERTED表和表和DELETEDDELETED表表 n執(zhí)行觸發(fā)器時,系統(tǒng)為每個觸發(fā)器都自動創(chuàng)建了INSERTED表 和DELETED表。 nINSERTED表:當向表中插入記錄時, INSERTED觸發(fā)器觸發(fā) 執(zhí)行,新的記錄插入到觸發(fā)器表和INSERTED表中,用于存放 插入操作時的行。DELETED表用于存放已從表中執(zhí)行操作刪 除的記錄。 n修改一條記錄等于插入一條新記錄,同時刪除舊記錄。原

26、記 錄移到DELETED表中,修改過的記錄 插入到INSERTED表中。 n這兩個表的結(jié)構(gòu)和被觸發(fā)器作用的表的結(jié)構(gòu)相同。 n用戶不能對這兩個表進行修改,但可以讀取。 INSERTEDINSERTED表和表和DELETEDDELETED表的查詢方法與表的查詢方法相同。表的查詢方法與表的查詢方法相同。 2 2、使用、使用Transact-SQLTransact-SQL語句創(chuàng)建觸發(fā)器語句創(chuàng)建觸發(fā)器 使用使用Transact-SQLTransact-SQL語言中的語言中的CREATE TRIGGERCREATE TRIGGER命令命令 可以創(chuàng)建觸發(fā)器,其中需要指定定義觸發(fā)器的基表、觸可以創(chuàng)建觸發(fā)器,其

27、中需要指定定義觸發(fā)器的基表、觸 發(fā)器執(zhí)行的事件和觸發(fā)器的所有指令。發(fā)器執(zhí)行的事件和觸發(fā)器的所有指令。 其中:其中: ONON子句:用于指定在其上執(zhí)行的觸發(fā)器的表,有時也子句:用于指定在其上執(zhí)行的觸發(fā)器的表,有時也 稱為觸發(fā)器表。稱為觸發(fā)器表。 FOR|AFTER| INSTEAD OF FOR|AFTER| INSTEAD OF :指定了觸發(fā)器激活的時:指定了觸發(fā)器激活的時 機,即執(zhí)行哪些操作時激活觸發(fā)器。機,即執(zhí)行哪些操作時激活觸發(fā)器。 INSERT UPDATE DELETEINSERT UPDATE DELETE:指定了激活觸發(fā)器的:指定了激活觸發(fā)器的 語句。語句。 sql_statem

28、entsql_statement:指定了觸發(fā)器所執(zhí)行的:指定了觸發(fā)器所執(zhí)行的T_SQLT_SQL語句。語句。 注意:通常不要在觸發(fā)器中返回任何結(jié)果,因此就不注意:通常不要在觸發(fā)器中返回任何結(jié)果,因此就不 要在觸發(fā)器定義中使用要在觸發(fā)器定義中使用selectselect語句或變量賦值語句。語句或變量賦值語句。 練習(xí):練習(xí): 1.1.創(chuàng)建一個觸發(fā)器,要求每當在創(chuàng)建一個觸發(fā)器,要求每當在StuCouStuCou表中插入數(shù)據(jù)時,表中插入數(shù)據(jù)時, 向客戶端顯示一條向客戶端顯示一條“記錄已添加!記錄已添加!”的消息。的消息。 2.2.創(chuàng)建一個觸發(fā)器,要求每當用戶插入創(chuàng)建一個觸發(fā)器,要求每當用戶插入stud

29、entstudent表的記錄表的記錄 時,自動顯示表中所有內(nèi)容。時,自動顯示表中所有內(nèi)容。 例:例: use studentuse student go go create trigger inup on xs create trigger inup on xs for insert,update for insert,update as raiserror(4008,16,10) as raiserror(4008,16,10) GoGo 消息消息40084008是是sysmessagesysmessage中的用戶定義信息。中的用戶定義信息。 n在在studentstudent數(shù)據(jù)庫中建立一

30、個名為數(shù)據(jù)庫中建立一個名為delete_zhyedelete_zhye的的 DELETEDELETE觸發(fā)器,存儲在觸發(fā)器,存儲在“專業(yè)專業(yè)”表中。當用戶刪除表中。當用戶刪除 “專業(yè)專業(yè)”表中的記錄時,如果表中的記錄時,如果“班級班級”表引用了此表引用了此 記錄的專業(yè)代碼,則提示用戶不能刪除記錄,否則記錄的專業(yè)代碼,則提示用戶不能刪除記錄,否則 提示記錄已刪除。程序清單如下:提示記錄已刪除。程序清單如下: nUse StudentUse Student Go Go Create trigger delete_zhye Create trigger delete_zhye on on 專業(yè)專業(yè) f

31、or deletefor delete As As If (select count( If (select count(* *) from ) from 班級班級 inner inner join deletedjoin deleted On On 班級班級. .專業(yè)代碼專業(yè)代碼=deleted.=deleted.專業(yè)代碼專業(yè)代碼)0)0 begin begin Print ( Print (該專業(yè)已被班級表所引用,你不該專業(yè)已被班級表所引用,你不 可以刪除此記錄,刪除將終止可以刪除此記錄,刪除將終止) ) Rollback transaction Rollback transaction

32、end end else else print print記錄已刪除記錄已刪除 gogo n3. 3. 創(chuàng)建一個創(chuàng)建一個UPDATE UPDATE 觸發(fā)器觸發(fā)器 在在StudentStudent數(shù)據(jù)庫中建立一個名為數(shù)據(jù)庫中建立一個名為update_zymcupdate_zymc的的 UPDATEUPDATE出發(fā)器,存儲在出發(fā)器,存儲在“專業(yè)專業(yè)”表中。當用戶更新表中。當用戶更新“專專 業(yè)業(yè)”表中的專業(yè)名稱時,提示用戶不能修改專業(yè)名稱。表中的專業(yè)名稱時,提示用戶不能修改專業(yè)名稱。 程序清單如下:程序清單如下: nUse studentUse student Go Go Create trigge

33、r update_zymc Create trigger update_zymc On On 專業(yè)專業(yè) For update For update As As If update( If update(專業(yè)名稱專業(yè)名稱) ) Begin Begin Print Print 不能修改系部名稱不能修改系部名稱 rollback transactionrollback transaction End End go go nUse studentUse student go go create trigger insert_xibu ON dbo. create trigger insert_xibu

34、 ON dbo.專業(yè)專業(yè) for insert for insert as as declare xibu char(2) declare xibu char(2) select xibu= select xibu=系部系部. .系部代碼系部代碼 from from 系部系部.inserted.inserted where where 系部系部 . .系部代碼系部代碼=inserted.=inserted.系部代碼系部代碼 if xibu”if xibu” print ( print (記錄插入成功記錄插入成功) ) else else begin begin print ( print (系

35、部代碼不存在系部表中,不能插入記錄,插入將系部代碼不存在系部表中,不能插入記錄,插入將 終止終止) ) rollback transaction rollback transaction End End go go 范例范例 n在在studentstudent數(shù)據(jù)庫中建立一個數(shù)據(jù)庫中建立一個insertinsert觸發(fā)器,其名稱為觸發(fā)器,其名稱為 插入成績觸發(fā)器插入成績觸發(fā)器 ,存儲在,存儲在學(xué)生學(xué)生表中。在向表中。在向?qū)W學(xué) 生生表中插入一條記錄時,將引發(fā)該觸發(fā)器,從而實現(xiàn)表中插入一條記錄時,將引發(fā)該觸發(fā)器,從而實現(xiàn) 向向成績成績表中插入兩條記錄的操作。表中插入兩條記錄的操作。 n第一步:建立

36、觸發(fā)器第一步:建立觸發(fā)器 nUse studentUse student go go create trigger create trigger 插入成績觸發(fā)器插入成績觸發(fā)器 ON ON 學(xué)生學(xué)生 for insert asfor insert as - -不顯示由不顯示由t-sqlt-sql語句影響的記錄行數(shù)語句影響的記錄行數(shù) set nocount offset nocount off declare stin char(6) declare stin char(6) If rowcount=1 If rowcount=1 begin begin select stin= select s

37、tin=學(xué)號學(xué)號 from insertedfrom inserted - -從臨時表從臨時表insertedinserted中獲取插入的記錄中獲取插入的記錄 Insert into Insert into 成績成績 (學(xué)號(學(xué)號 , ,課程編號)課程編號)values(stin,001)values(stin,001) Insert into Insert into 成績成績 (學(xué)號(學(xué)號 , ,課程編號)課程編號)values(stin,001)values(stin,001) end end 第二步:測試觸發(fā)器第二步:測試觸發(fā)器 Insert into Insert into 學(xué)生學(xué)生 values(046, values(046,王大力王大力,網(wǎng)絡(luò)技網(wǎng)絡(luò)技 術(shù)術(shù),2004,j03,2004,j03) Select Select 成績成績. .學(xué)號學(xué)號, ,姓名姓名, ,成績成績 From From 成績成績 inner join inner join 學(xué)生學(xué)生 on on 成績成績. .學(xué)號學(xué)號 = =學(xué)生學(xué)生. .學(xué)號學(xué)號 Inner join Inner join 課程課

溫馨提示

  • 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)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論