SQLServer與數(shù)據(jù)庫(kù)應(yīng)用開發(fā)平臺(tái)_第1頁
SQLServer與數(shù)據(jù)庫(kù)應(yīng)用開發(fā)平臺(tái)_第2頁
SQLServer與數(shù)據(jù)庫(kù)應(yīng)用開發(fā)平臺(tái)_第3頁
SQLServer與數(shù)據(jù)庫(kù)應(yīng)用開發(fā)平臺(tái)_第4頁
SQLServer與數(shù)據(jù)庫(kù)應(yīng)用開發(fā)平臺(tái)_第5頁
已閱讀5頁,還剩61頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

SQLServer與數(shù)據(jù)庫(kù)應(yīng)用開發(fā)平臺(tái)第9章存儲(chǔ)過程與觸發(fā)器9.1.存儲(chǔ)過程9.2.觸發(fā)器主要內(nèi)容【知識(shí)要求】:掌握存儲(chǔ)過程、觸發(fā)器的概念與分類【能力要求】:1.熟練掌握存儲(chǔ)過程的創(chuàng)建、執(zhí)行、修改與刪除2.熟練掌握觸發(fā)器的定義、修改與刪除知識(shí)與能力要求

9.1.1存儲(chǔ)過程的概念存儲(chǔ)過程是一種數(shù)據(jù)庫(kù)對(duì)象,是為了實(shí)現(xiàn)某個(gè)特定任務(wù),將一組預(yù)編譯的SQL語句以一個(gè)存儲(chǔ)單元的形式存儲(chǔ)在服務(wù)器上,供用戶調(diào)用。存儲(chǔ)過程在第一次執(zhí)行時(shí)進(jìn)行編譯,然后將編譯好的代碼保存在高速緩存中便于以后調(diào)用,這樣可以提高代碼的執(zhí)行效率。存儲(chǔ)過程與其他編程語言中的過程相似。有如下特點(diǎn):●接受輸入?yún)?shù)并以輸出參數(shù)的形式將多個(gè)值返回至調(diào)用過程或批處理?!癜瑘?zhí)行數(shù)據(jù)庫(kù)操作(包括調(diào)用其他過程)的編程語句?!裣蛘{(diào)用過程或批處理返回狀態(tài)值,以表明成功或失?。ㄒ约笆≡颍?。

9.1存儲(chǔ)過程綜述在SQLServer中存儲(chǔ)過程可以分為五類。即系統(tǒng)存儲(chǔ)過程、本地存儲(chǔ)過程、臨時(shí)存儲(chǔ)過程、遠(yuǎn)程存儲(chǔ)過程和擴(kuò)展存儲(chǔ)過程。●系統(tǒng)存儲(chǔ)過程:系統(tǒng)存儲(chǔ)過程存儲(chǔ)在master數(shù)據(jù)庫(kù)中,并以“sp_”為前綴,主要用來從系統(tǒng)表中獲取信息,為系統(tǒng)管理員管理SQLServer提供幫助,為用戶查看數(shù)據(jù)庫(kù)對(duì)象提供方便。比如用來查看數(shù)據(jù)庫(kù)對(duì)象信息的系統(tǒng)存儲(chǔ)過程sp_help?!癖镜卮鎯?chǔ)過程:本地存儲(chǔ)過程是用戶根據(jù)需要,在自己的普通數(shù)據(jù)庫(kù)中創(chuàng)建的存儲(chǔ)過程?!衽R時(shí)存儲(chǔ)過程:臨時(shí)存儲(chǔ)過程通常分為局部臨時(shí)存儲(chǔ)過程和全局臨時(shí)存儲(chǔ)過程。創(chuàng)建局部臨時(shí)存儲(chǔ)過程時(shí),要以“#”作為過程名稱的第一個(gè)字符。創(chuàng)建全局臨時(shí)存儲(chǔ)過程時(shí),要以“##”作為過程名稱的前兩個(gè)字符。9.1存儲(chǔ)過程綜述9.1.2存儲(chǔ)過程的類型●遠(yuǎn)程存儲(chǔ)過程:遠(yuǎn)程存儲(chǔ)過程是指非本地服務(wù)器上的存儲(chǔ)過程?,F(xiàn)在只有在分布式查詢中使用此存儲(chǔ)過程。●擴(kuò)展存儲(chǔ)過程:擴(kuò)展存儲(chǔ)過程以“xp_”為前綴,它是關(guān)系數(shù)據(jù)庫(kù)引擎的開放式數(shù)據(jù)服務(wù)層的一部分,可以使用戶在動(dòng)態(tài)數(shù)據(jù)庫(kù)(DLL)文件所包含的函數(shù)中實(shí)現(xiàn)邏輯功能,從而擴(kuò)展了T-SQL的功能,并且可以像調(diào)用T-SQL過程那樣從T-SQL語句調(diào)用這些參數(shù)。下面主要介紹本地存儲(chǔ)過程的創(chuàng)建、執(zhí)行、修改、刪除等操作。9.1存儲(chǔ)過程綜述9.1.3創(chuàng)建、執(zhí)行、修改、刪除簡(jiǎn)單存儲(chǔ)過程

簡(jiǎn)單存儲(chǔ)過程即不帶參數(shù)的存儲(chǔ)過程,下面介紹簡(jiǎn)單存儲(chǔ)過程的創(chuàng)建及使用。1.創(chuàng)建簡(jiǎn)單存儲(chǔ)過程在SQLServer中通??梢允褂脙煞N方法創(chuàng)建存儲(chǔ)過程:一種是使用企業(yè)管理器創(chuàng)建存儲(chǔ)過程。另一種是使用查詢分析器執(zhí)行SQL語句創(chuàng)建存儲(chǔ)過程。創(chuàng)建存儲(chǔ)過程時(shí),需要注意下列事項(xiàng):●

只能在當(dāng)前數(shù)據(jù)庫(kù)中創(chuàng)建存儲(chǔ)過程?!?/p>

數(shù)據(jù)庫(kù)的所有者可以創(chuàng)建存儲(chǔ)過程,也可以授權(quán)其他用戶創(chuàng)建存儲(chǔ)過程。●

存儲(chǔ)過程是數(shù)據(jù)庫(kù)對(duì)象,其名稱必須遵守標(biāo)識(shí)符命名規(guī)則?!?/p>

不能將CREATEPROCEDURE語句與其他SQL語句組合到單個(gè)批處理中。●

創(chuàng)建存儲(chǔ)過程時(shí),應(yīng)指定所有輸入?yún)?shù)和向調(diào)用過程或批處理返回的輸出參數(shù)、執(zhí)行數(shù)據(jù)庫(kù)操作的編程語句和返回至調(diào)用過程或批處理以表明成功或失敗的狀態(tài)值。9.1存儲(chǔ)過程綜述(1)使用對(duì)象資源管理器創(chuàng)建存儲(chǔ)過程。下面舉例來介紹如何使用對(duì)象資源管理器創(chuàng)建存儲(chǔ)過程?!纠?.1】在TestDB數(shù)據(jù)庫(kù)中,創(chuàng)建一個(gè)名為T_CHAXUN_01的存儲(chǔ)過程,該存儲(chǔ)過程返回信息處理與控制工程系學(xué)生的“姓名”、“性別”、“出生日期”信息。操作步驟如下:①在“對(duì)象資源管理器”窗格中,展開“數(shù)據(jù)庫(kù)”結(jié)點(diǎn)。②單擊相應(yīng)的數(shù)據(jù)庫(kù)(這里選擇TestDB數(shù)據(jù)庫(kù))。依次展開“可編程性”、“存儲(chǔ)過程”結(jié)點(diǎn)。右擊“存儲(chǔ)過程”結(jié)點(diǎn),在彈出的快捷菜單中選擇“新建存儲(chǔ)過程”命令。③打開創(chuàng)建存儲(chǔ)過程的初始界面,如圖9-1所示。④將初始代碼清除,輸入存儲(chǔ)過程文本,根據(jù)題意輸入如下語句:SELECTstu_name,gender,birthdayFROMdbo.tb_stuWHEREdept_num=’01’⑤輸入完成后,單擊“分析”按鈕,檢查語法是否正確。⑥如果沒有任何錯(cuò)誤,單擊“執(zhí)行”按鈕,將在數(shù)據(jù)庫(kù)中創(chuàng)建存儲(chǔ)過程。9.1存儲(chǔ)過程綜述V9-1-1使用對(duì)象資源管理器創(chuàng)建存儲(chǔ)過程.wmv9.1存儲(chǔ)過程綜述圖9-1創(chuàng)建存儲(chǔ)過程的界面9.1存儲(chǔ)過程綜述(2)使用SQL語句創(chuàng)建存儲(chǔ)過程。在查詢分析器中,用SQL語句創(chuàng)建存儲(chǔ)過程的語法格式如下:CREATEPROC[EDURE]procedure_name[;number][{@parameterdata_type}[VARYING][=default][OUTPUT]][,…n][WITH]{RECOMPLE|ENCRYPTION|RECOMPLE,ENCRYPTION}][FORREPLICATION]ASsql_statement[,…n]其中:

●procedure_name是新建存儲(chǔ)過程的名稱,其名稱必須遵守標(biāo)識(shí)符命名規(guī)則,且對(duì)于數(shù)據(jù)庫(kù)及其所有者必須唯一。

●number是可選的整數(shù),用來對(duì)同名的過程分組,以便用一條DROPPROCEDURE語句即可將同組的過程一起刪除。例如,名為order的應(yīng)用程序使用的過程可以命名為orderproc1、orderproc2、orderproc3。DROPPROCEDUREorderproc語句將刪除整個(gè)組。如果名稱中包含定界標(biāo)識(shí)符,則數(shù)字不應(yīng)該包含在標(biāo)識(shí)符中,只應(yīng)在存儲(chǔ)過程名前后使用適當(dāng)?shù)亩ń绶??!駊arameter是存儲(chǔ)過程中的輸入和輸出參數(shù)。●data_type是參數(shù)的數(shù)據(jù)類型?!馰ARYING用于指定作為輸出參數(shù)支持的結(jié)果集(由存儲(chǔ)過程動(dòng)態(tài)構(gòu)造,內(nèi)容可以變化)。該選項(xiàng)只適用于游標(biāo)參數(shù)。9.1存儲(chǔ)過程綜述●default是指參數(shù)的默認(rèn)值,必須是常量或NULL。如果定義了默認(rèn)值,不必指定該參數(shù)的值即可執(zhí)行過程。

●OUTPUT表明參數(shù)是返回參數(shù)。該選項(xiàng)的值可以返回給EXEC[UTE]。使用OUTPUT參數(shù)可將信息返回給調(diào)用過程。text、ntext和image參數(shù)可用做OUTPUT參數(shù)。使用OUTPUT關(guān)鍵字的輸出參數(shù)可以是游標(biāo)占位符。

●RECOMPLE表明SQLServer不保存存儲(chǔ)過程的計(jì)劃,該過程將在運(yùn)行時(shí)重新編譯。在使用非典型值或臨時(shí)值而不希望覆蓋緩存在內(nèi)存中的計(jì)劃時(shí),最好使用RECOMPLE選項(xiàng)。

●ENCRYPTION表示SQLServer加密syscomments表中包含CREATEPROCEDURE語句文本的條目。

●FORREPLICATION用于指定不能在訂閱服務(wù)器上執(zhí)行為復(fù)制創(chuàng)建的存儲(chǔ)過程。使用該選項(xiàng)創(chuàng)建的存儲(chǔ)過程可用做存儲(chǔ)過程篩選,且只能在復(fù)制過程中執(zhí)行。本選項(xiàng)不能和WITHRECOMPLE選項(xiàng)一起使用。

●sql_statement是指存儲(chǔ)過程中的任意數(shù)目和類型的T-SQL語句。9.1存儲(chǔ)過程綜述【例9.2】在TestDB數(shù)據(jù)庫(kù)中,創(chuàng)建一個(gè)查詢存儲(chǔ)過程T_PRO_BJ,該存儲(chǔ)過程將返回信息處理與控制工程系的班級(jí)名稱。代碼如下:USETestDBGOCREATEPROCEDURET_PRO_BJASSELECTclass_nameFROMdbo.tb_class,dbo.tb_deptWHEREdbo.tb_dept.dept_num=dbo.tb_class.

dept_numanddbo.tb_dept.dept_name=‘信息處理與控制工程系'GO9.1存儲(chǔ)過程綜述2.執(zhí)行存儲(chǔ)過程對(duì)存儲(chǔ)在服務(wù)器上的存儲(chǔ)過程,可以使用EXECUTE命令或其名稱執(zhí)行。其語法格式如下:[[EXEC[UTE]]{[@return_status=]{procedure_name[;number]|@procedure_name_var}[[@parameter=]{value|@variable[OUTPUT]|[DEFAULT]}[,…n][WITHRECOMPLE]9.1存儲(chǔ)過程綜述其中:●如果存儲(chǔ)過程是批處理中的第一條語句,EXECUTE命令可以省略,可以使用存儲(chǔ)過程的名字執(zhí)行該存儲(chǔ)過程?!駌eturn_status是一個(gè)可選的整型變量,用來保存存儲(chǔ)過程的名稱?!馌procedure_name_var是局部定義變量名,用來代表存儲(chǔ)過程的名稱。其他參數(shù)與存儲(chǔ)過程命令中參數(shù)意義相同。9.1存儲(chǔ)過程綜述V9-1-3執(zhí)行存儲(chǔ)過程.wmv【例9.3】在查詢分析器中執(zhí)行T_PRO_BJ。代碼如下:USETestDBEXECUTET_PRO_BJGO其執(zhí)行結(jié)果如圖9-2所示。3.查看存儲(chǔ)過程對(duì)用戶建立存儲(chǔ)過程,可以使用對(duì)象資源管理器或有關(guān)的系統(tǒng)存儲(chǔ)過程查看該存儲(chǔ)過程的定義。(1)使用對(duì)象資源管理器查看存儲(chǔ)過程。操作步驟如下:①在“對(duì)象資源管理器”窗格中,展開“數(shù)據(jù)庫(kù)”結(jié)點(diǎn)。②選擇相應(yīng)的數(shù)據(jù)庫(kù)(這里選擇student數(shù)據(jù)庫(kù))。依次展開“可編程性”、“存儲(chǔ)過程”結(jié)點(diǎn)。選擇“存儲(chǔ)過程”結(jié)點(diǎn),在右窗格中顯示出當(dāng)前數(shù)據(jù)庫(kù)中所有的存儲(chǔ)過程。③右擊需要查看的存儲(chǔ)過程,例如T_PRO_BJ,在彈出的快捷菜單中選擇“修改”命令,打開存儲(chǔ)過程T_PRO_BJ的源代碼界面,如圖9-3所示。9.1存儲(chǔ)過程綜述圖9-2執(zhí)行存儲(chǔ)過程返回的記錄集合④在存儲(chǔ)過程T_PRO_BJ的源代碼界面中,既可查看存儲(chǔ)過程定義信息,又可以在文本框中對(duì)存儲(chǔ)過程的定義進(jìn)行修改。修改后,可以單擊“執(zhí)行”按鈕,保存修改。(2)使用系統(tǒng)存儲(chǔ)過程查看存儲(chǔ)過程。在SQLServer中,根據(jù)不同需要,可以使用sp_helptext、sp_depends、sp_help等系統(tǒng)存儲(chǔ)過程來查看存儲(chǔ)過程的不同信息。每個(gè)查看存儲(chǔ)過程的具體語法和作用如下:9.1存儲(chǔ)過程綜述圖9-3存儲(chǔ)過程ST_PRO_BJ的源代碼界面①使用sp_helptext查看存儲(chǔ)過程的文本信息。其語法格式為:

sp_helptext存儲(chǔ)過程名②使用sp_depends查看存儲(chǔ)過程的相關(guān)性。其語法格式為:

sp_depends存儲(chǔ)過程名③使用sp_help查看存儲(chǔ)過程的一般信息。其語法格式為:

sp_help存儲(chǔ)過程名【例9.4】使用有關(guān)系統(tǒng)存儲(chǔ)過程查看TestDB數(shù)據(jù)庫(kù)中名為T_PRO_BJ的存儲(chǔ)過程的定義、相關(guān)性以及一般信息。代碼如下:USETestDBGOEXECsp_helptextT_PRO_BJEXECsp_dependsT_PRO_BJEXECsp_helpT_PRO_BJGO在查詢分析器中輸入并執(zhí)行上述代碼,返回的結(jié)果如圖9-4所示。9.1存儲(chǔ)過程綜述9.1存儲(chǔ)過程綜述圖9-4使用系統(tǒng)存儲(chǔ)過程查看存儲(chǔ)過程V9-1-5使用有關(guān)系統(tǒng)存儲(chǔ)過程查看存儲(chǔ)過程.wmv4.修改存儲(chǔ)過程當(dāng)存儲(chǔ)過程所依賴的基本表發(fā)生變化或者根據(jù)需要,用戶可以對(duì)存儲(chǔ)過程的定義或者參數(shù)進(jìn)行修改。更改通過執(zhí)行CREATEPROCEDURE語句創(chuàng)建的過程,不會(huì)更改權(quán)限,也不影響相關(guān)的存儲(chǔ)過程或觸發(fā)器。修改存儲(chǔ)過程可以使用ALTERPROCEDURE語句,其語法格式為:ALTERPROC[EDURE]procedure_name[;number] [{@parameterdata_type}[VARYING][=default][OUTPUT]][,┄n][WITH{RECOMPILE|ENCRYPTION|RECOMPILE,ENCRYPTION}][FORREPLICATION]ASSql_statement[,┄n]其中各個(gè)參數(shù)與創(chuàng)建存儲(chǔ)過程命令中參數(shù)意義相同。9.1存儲(chǔ)過程綜述【例9.5】修改存儲(chǔ)過程T_PRO_BJ,使該存儲(chǔ)過程返回石油化學(xué)工程系的班級(jí)名稱。代碼如下:USETestDBGOALTERPROCDBO.T_PRO_BJASSELECTclass_nameFROMdbo.tb_class,dbo.tb_deptWHEREdbo.tb_dept.dept_num=dbo.tb_class.dept_numanddbo.tb_dept.dept_name=‘石油化學(xué)工程系'9.1存儲(chǔ)過程綜述5.刪除存儲(chǔ)過程當(dāng)存儲(chǔ)過程不再需要時(shí),可以使用對(duì)象資源管理器或DROPPROCEDURE語句將其刪除。(1)使用對(duì)象資源管理器刪除存儲(chǔ)過程操作步驟:在“對(duì)象資源管理器”窗格中,右擊要?jiǎng)h除的存儲(chǔ)過程,在彈出的快捷菜單中選擇“刪除”命令,打開“刪除對(duì)象”對(duì)話框,單擊“確定”按鈕,刪除該存儲(chǔ)過程。(2)使用DROPPROCEDURE語句刪除存儲(chǔ)過程:DROPPROCEDURE語句可以一次從當(dāng)前數(shù)據(jù)庫(kù)中將一個(gè)或多個(gè)存儲(chǔ)過程或過程組刪除。其語法格式如下:DROPPROCEDURE存儲(chǔ)過程名[,…n]【例9.6】刪除存儲(chǔ)過程T_CHAXUN_01。代碼如下:USETestDBGODROPPROCEDURET_CHAXUN_01GO9.1存儲(chǔ)過程綜述9.1.4創(chuàng)建和執(zhí)行含參數(shù)的存儲(chǔ)過程在存儲(chǔ)過程中使用參數(shù),可以擴(kuò)展存儲(chǔ)過程的功能。使用輸入?yún)?shù),可以將外部信息傳到存儲(chǔ)過程;使用輸出參數(shù),可以將存儲(chǔ)過程內(nèi)的信息傳到外部?!纠?.7】在TestDB數(shù)據(jù)庫(kù)中,建立一個(gè)名為XIBU_INFOR的存儲(chǔ)過程,它帶有一個(gè)參數(shù),用于接受系部代碼,顯示該系部名稱。代碼如下:USETestDBGOCREATEPROCEDUREXIBU_INFOR@dept_numCHAR(2)ASSELECTdept_nameFROMdbo.tb_deptWHEREdept_num=@dept_numGO9.1存儲(chǔ)過程綜述執(zhí)行存儲(chǔ)過程:EXECXIBU_INFOR'01'返回結(jié)果如下:9.1存儲(chǔ)過程綜述圖9-5創(chuàng)建和執(zhí)行含參數(shù)的存儲(chǔ)過程V9-1-8創(chuàng)建和執(zhí)行含參數(shù)的存儲(chǔ)過程.wmv9.1.5存儲(chǔ)過程的重新編譯存儲(chǔ)過程第一次執(zhí)行后,其被編譯的代碼將駐留在高速緩存中,當(dāng)用戶再次執(zhí)行該存儲(chǔ)過程時(shí),SQLServer將其從高速緩存中調(diào)出執(zhí)行。有時(shí),在使用了一次存儲(chǔ)過程后,可能會(huì)因?yàn)槟承┰颍仨毾虮碇行略黾訑?shù)據(jù)列或者為表新添加索引,從而改變了數(shù)據(jù)庫(kù)的邏輯結(jié)構(gòu)。這時(shí),如果調(diào)用高速緩存中的存儲(chǔ)過程,需要對(duì)它進(jìn)行重新編譯,使存儲(chǔ)過程能夠得到優(yōu)化。SQLServer提供三種重新編譯存儲(chǔ)過程的方法,下面將分別介紹。1.在建立存儲(chǔ)過程時(shí)設(shè)定重新編譯創(chuàng)建存儲(chǔ)過程時(shí),在其定義中指定WITHRECOMPILE選項(xiàng),使SQLServer在每次執(zhí)行存儲(chǔ)過程時(shí),都要重新編譯。其語法格式如下:CREATEPROCEDUREprocedure_nameWITHRECOMPLEASsql_statement當(dāng)存儲(chǔ)過程的參數(shù)值在各次執(zhí)行間都有較大差異,導(dǎo)致每次均需要?jiǎng)?chuàng)建不同的執(zhí)行計(jì)劃時(shí),可使用WITHRECOMPILE選項(xiàng)。9.1存儲(chǔ)過程綜述2.在執(zhí)行存儲(chǔ)過程時(shí)設(shè)定重新編譯在執(zhí)行存儲(chǔ)過程時(shí)指定WITHRECOMPILE選項(xiàng),可強(qiáng)制對(duì)存儲(chǔ)過程進(jìn)行重新編譯。其語法格式如下:EXECTUEprocedure_nameWITHRECOMPILE僅當(dāng)所提供的參數(shù)不典型,或者自創(chuàng)建該存儲(chǔ)過程后,數(shù)據(jù)發(fā)生顯著更改時(shí)才應(yīng)使用此選項(xiàng)。3.通過使用系統(tǒng)存儲(chǔ)過程設(shè)定重新編譯系統(tǒng)存儲(chǔ)過程sp_recompile強(qiáng)制在下次運(yùn)行存儲(chǔ)過程時(shí)進(jìn)行重新編譯。其語法格式如下:EXECsp_recompileOBJECT其中,OBJECT是當(dāng)前數(shù)據(jù)庫(kù)中的存儲(chǔ)過程、觸發(fā)器、表或視圖的名稱。如果OBJECT是存儲(chǔ)過程或觸發(fā)器的名稱,那么該存儲(chǔ)過程或觸發(fā)器將在下次運(yùn)行時(shí)重新編譯。如果OBJECT是表或視圖的名稱,那么所有引用該表或視圖的存儲(chǔ)過程都將在下次運(yùn)行時(shí)重新編譯。9.1存儲(chǔ)過程綜述【例9.8】利用sp_recompile命令為存儲(chǔ)過程T_PRO_BJ設(shè)定重編譯標(biāo)記。代碼如下:EXECsp_recompileT_PRO_BJGO運(yùn)行后提示:“已成功地標(biāo)記對(duì)象'T_PRO_BJ',以便對(duì)它重新進(jìn)行編譯?!?.1存儲(chǔ)過程綜述圖9-6通過使用系統(tǒng)存儲(chǔ)過程設(shè)定重新編譯9.1.6系統(tǒng)存儲(chǔ)過程與擴(kuò)展存儲(chǔ)過程在SQLServer中有兩類重要的存儲(chǔ)過程:系統(tǒng)存儲(chǔ)過程和擴(kuò)展存儲(chǔ)過程。這些存儲(chǔ)過程為用戶管理數(shù)據(jù)庫(kù)、獲取系統(tǒng)信息、查看系統(tǒng)對(duì)象提供了很大的幫助。下面分別對(duì)兩類存儲(chǔ)過程做簡(jiǎn)單的介紹。1.系統(tǒng)存儲(chǔ)過程在SQLServer中存在200多個(gè)系統(tǒng)存儲(chǔ)過程,這些系統(tǒng)存儲(chǔ)過程的使用,使用戶可以很容易地管理SQLServer的數(shù)據(jù)庫(kù)。在安裝SQLServer數(shù)據(jù)庫(kù)系統(tǒng)時(shí),系統(tǒng)存儲(chǔ)過程被系統(tǒng)安裝在master數(shù)據(jù)庫(kù)中,并且初始化狀態(tài)只有系統(tǒng)管理員擁有使用權(quán)。所有的系統(tǒng)存儲(chǔ)過程名稱都是以“sp_”為前綴。在使用以“sp_”為前綴的系統(tǒng)存儲(chǔ)過程時(shí),SQLServer首先在當(dāng)前數(shù)據(jù)庫(kù)中尋找,如果沒有找到,則再到master數(shù)據(jù)庫(kù)中查找并執(zhí)行。雖然存儲(chǔ)在master數(shù)據(jù)庫(kù)中,但是絕大部分系統(tǒng)存儲(chǔ)過程可以在任何數(shù)據(jù)庫(kù)中執(zhí)行,而且在使用時(shí)不用在名稱前加數(shù)據(jù)庫(kù)名。當(dāng)系統(tǒng)存儲(chǔ)過程的參數(shù)是保留字或?qū)ο竺麜r(shí),在使用存儲(chǔ)過程時(shí),作為參數(shù)的“對(duì)象名或保留字”必須用單引號(hào)括起來。提供系統(tǒng)幫助的系統(tǒng)存儲(chǔ)過程如表9-1所示。9.1存儲(chǔ)過程綜述系統(tǒng)存儲(chǔ)過程功能sp_helpsql顯示關(guān)于SQL語句、存儲(chǔ)過程和其他主題信息sp_help提供關(guān)于系統(tǒng)存儲(chǔ)過程和其他數(shù)據(jù)庫(kù)對(duì)象的報(bào)告sp_helptext顯示存儲(chǔ)過程和其他對(duì)象的文本sp_depends列舉引用或依賴指定對(duì)象的所有存儲(chǔ)過程9.1存儲(chǔ)過程綜述表9-1系統(tǒng)提供的幫助存儲(chǔ)過程下面是一些常用的系統(tǒng)存儲(chǔ)過程舉例?!纠?.9】利用sp_addgroup命令在當(dāng)前數(shù)據(jù)庫(kù)中建立一個(gè)名為user_group的角色。代碼如下:USEmasterGOEXECsp_addgroupuser_group【例9.10】利用sp_addlogin命令建立一個(gè)名為user01的登錄用戶。代碼如下:USEmasterGOEXECsp_addloginuser01運(yùn)行后提示創(chuàng)建。需要注意的是,在沒有指定用戶密碼和默認(rèn)數(shù)據(jù)庫(kù)的時(shí)候,創(chuàng)建的用戶默認(rèn)數(shù)據(jù)庫(kù)是master,默認(rèn)的密碼是NULL?!纠?.11】利用sp_addtype命令創(chuàng)建新的用戶自定義數(shù)據(jù)庫(kù)類型user_date,該類型為datetime數(shù)據(jù)類型。代碼如下:EXECsp_addtypeuser_date,datetime運(yùn)行結(jié)果為類型已添加。9.1存儲(chǔ)過程綜述【例9.12】使用sp_monitor顯示CPU、I/O的使用信息。代碼如下:USEmasterGOEXECsp_monitorGO執(zhí)行后返回如圖9-7所示的結(jié)果集,該結(jié)果報(bào)告了當(dāng)時(shí)有關(guān)SQLServer繁忙程度的信息。9.1存儲(chǔ)過程綜述圖9-7執(zhí)行sp_monitor的結(jié)果V9-1-10使用系統(tǒng)存儲(chǔ)過程.wmv2.?dāng)U展存儲(chǔ)過程擴(kuò)展存儲(chǔ)過程是允許用戶使用一種編程語言(如C語言)創(chuàng)建的應(yīng)用程序,程序中使用SQLServer開放數(shù)據(jù)服務(wù)的API函數(shù),直接可以在SQLServer地址空間中運(yùn)行。用戶可以像使用普通的存儲(chǔ)過程一樣使用它,同樣也可以將參數(shù)傳給它并返回結(jié)果和狀態(tài)值。擴(kuò)展存儲(chǔ)過程編寫好后,可以由系統(tǒng)管理員在SQLServer中注冊(cè)登記,然后將其執(zhí)行權(quán)限授予其他用戶。擴(kuò)展存儲(chǔ)過程只能存儲(chǔ)在master數(shù)據(jù)庫(kù)中。下面通過幾個(gè)例子,介紹擴(kuò)展存儲(chǔ)過程的創(chuàng)建和應(yīng)用實(shí)例?!纠?.13】使用sp_addextendproc存儲(chǔ)過程將一個(gè)編寫好的擴(kuò)展存儲(chǔ)過程xp_userprint.dll注冊(cè)到SQLServer中。代碼如下:EXECsp_addextendedprocxp_userprint,'xp_userprint.dll'其中:●sp_addextendproc為系統(tǒng)存儲(chǔ)過程?!駒p_userprint為擴(kuò)展存儲(chǔ)過程在SQLServer中的注冊(cè)名。●xp_userprint.dll為用某種語言編寫的擴(kuò)展存儲(chǔ)過程動(dòng)態(tài)連接庫(kù)。9.1存儲(chǔ)過程綜述【例9.14】使用存儲(chǔ)過程xp_dirtree返回本地操作系統(tǒng)的系統(tǒng)目錄“C:\winnt”目錄樹。代碼如下:EXECxp_dirtree"C:\winnt"執(zhí)行結(jié)果返回目錄樹?!纠?.15】利用擴(kuò)展存儲(chǔ)過程xp_cmdshell為一個(gè)操作系統(tǒng)外殼執(zhí)行指定命令串,并作為文本返回任何輸出。代碼如下:EXECxp_cmdshell"dir*.exe"GO執(zhí)行結(jié)果返回系統(tǒng)目錄下的文件內(nèi)容文本信息。9.1存儲(chǔ)過程綜述【例9.16】利用擴(kuò)展存儲(chǔ)過程實(shí)現(xiàn)遠(yuǎn)程備份數(shù)據(jù)庫(kù)。假設(shè)Windows2000Server服務(wù)器計(jì)算機(jī)名為jkx,本地域名為“Domain域”,系統(tǒng)管理員賬號(hào)為sa,密碼為123,需要備份的數(shù)據(jù)庫(kù)為student。代碼如下:EXECxp_cmdshell"netsharebaktest=e:\baktest"GOEXECmasterxp_cmdshell"netuse\\jkx\baktest123/use:domain\sa"GOBACKUPdatabasestudenttodisk=\\jkx\baktest\student.bakGOEXECxp_cmdshell"netsharebaktest/delete"GO9.1存儲(chǔ)過程綜述9.1.7案例中的存儲(chǔ)過程1.創(chuàng)建一個(gè)查詢存儲(chǔ)過程創(chuàng)建一個(gè)名為CLASS的存儲(chǔ)過程,該過程用來查詢信息處理與控制工程系的班級(jí)編號(hào)和名稱。最后執(zhí)行該存儲(chǔ)過程。USETestDBGO--如果存儲(chǔ)過程CLASS存在,將其刪除IFEXISTS(SELECTNAMEFROMSYS.OBJECTSWHERENAME=‘CLASS'ANDTYPE='P')DROPPROCEDURECLASSGO--建立一個(gè)查詢存儲(chǔ)過程CREATEPROCEDURECLASS--查詢選項(xiàng)WITHENCRYPTION9.1存儲(chǔ)過程綜述ASSELECT

class_num,class_nameFROMdbo.tb_class,dbo.tb_deptWHEREdbo.tb_dept.dept_num=dbo.tb_class.dept_numanddbo.tb_dept.dept_name=‘信息處理與控制工程系'GO--執(zhí)行CLASSEXECCLASSGO9.1存儲(chǔ)過程綜述圖9-8案例——?jiǎng)?chuàng)建一個(gè)查詢存儲(chǔ)過程2.創(chuàng)建帶輸入?yún)?shù)的存儲(chǔ)過程創(chuàng)建一個(gè)帶參數(shù)的存儲(chǔ)過程——班級(jí)查詢,當(dāng)輸入任意一個(gè)系名稱時(shí),該存儲(chǔ)過程將從兩張表(“dbo.tb_class”表和“dbo.tb_dept”表)中查詢出該系所有班級(jí)的“名稱”、“編號(hào)”。最后,執(zhí)行存儲(chǔ)過程,查詢獲得所輸入系別的班級(jí)的情況。USETestDBGO--如果存儲(chǔ)過程教師查詢存在,將其刪除IFEXISTS(SELECTNAMEFROMSYS.OBJECTSWHERENAME='班級(jí)查詢'ANDTYPE='P')DROPPROCEDURE班級(jí)查詢GO--創(chuàng)建一個(gè)帶參數(shù)的存儲(chǔ)過程班級(jí)查詢CREATEPROCEDURE班級(jí)查詢

@dept_namechar(50)9.1存儲(chǔ)過程綜述--查詢選項(xiàng)WITHENCRYPTIONASSELECTdbo.tb_class.class_name,

dbo.tb_class.class_numFROMdbo.tb_class,dbo.tb_deptWHEREdbo.tb_dept.dept_num=dbo.tb_class.dept_numanddbo.tb_dept.dept_name=@dept_nameORDERBYdbo.tb_class.class_numGO--執(zhí)行存儲(chǔ)過程,并向存儲(chǔ)過程傳遞參數(shù)。EXEC班級(jí)查詢‘石油化學(xué)工程系'GO9.1存儲(chǔ)過程綜述圖9-9案例——?jiǎng)?chuàng)建帶輸入?yún)?shù)的存儲(chǔ)過程3.創(chuàng)建帶輸出參數(shù)的存儲(chǔ)過程在TestDB數(shù)據(jù)庫(kù)中創(chuàng)建一個(gè)存儲(chǔ)過程——單科成績(jī)分析,當(dāng)輸入任意一個(gè)存在的課程名時(shí),該存儲(chǔ)過程將統(tǒng)計(jì)出該門課程的平均成績(jī)、最高成績(jī)和最低成績(jī)。USETestDBGO--如果存儲(chǔ)過程單科成績(jī)分析存在,將其刪除IFEXISTS(SELECTNAMEFROMSYS.OBJECTSWHERENAME='單科成績(jī)分析'ANDTYPE='P')DROPPROCEDURE單科成績(jī)分析GO--創(chuàng)建存儲(chǔ)過程單科成績(jī)分析--定義一個(gè)輸入?yún)?shù)KECHENGMING--定義三個(gè)輸出參數(shù)AVGCHENGJI、MAXCHENGJI和MINCHENGJI、用于接受平均成績(jī)、最高成績(jī)和最低成績(jī)9.1存儲(chǔ)過程綜述CREATEPROCEDURE單科成績(jī)分析

@KECHENGMINGvarchar(50),@AVGCHENGJItinyintOUTPUT,@MAXCHENGJItinyintOUTPUT,@MINCHENGJItinyintOUTPUTASSELECT@AVGCHENGJI=AVG(score),@MAXCHENGJI=MAX(score),@MINCHENGJI=MIN(score)FROMdbo.tb_scoreWHEREcos_numin(SELECTcos_numFROMdbo.tb_courseWHEREcos_name=@KECHENGMING)GOUSETestDB--聲明四個(gè)變量,用于保存輸入和輸出參數(shù)9.1存儲(chǔ)過程綜述DECLARE@KECHENGMINGvarchar(50)DECLARE@AVGCHENGJI1tinyintDECLARE@MAXCHENGJI1tinyintDECLARE@MINCHENGJI1tinyint--為輸出參數(shù)賦值SELECT@KECHENGMING='計(jì)算機(jī)基礎(chǔ)'--執(zhí)行存儲(chǔ)過程EXEC單科成績(jī)分析@KECHENGMING,@AVGCHENGJI1OUTPUT,@MAXCHENGJI1OUTPUT,@MINCHENGJI1OUTPUT--顯示結(jié)果SELECT@KECHENGMINGAS課程名,@AVGCHENGJI1AS平均成績(jī),@MAXCHENGJI1AS最高成績(jī),@MINCHENGJI1AS最低成績(jī)GO9.1存儲(chǔ)過程綜述圖9-10案例——?jiǎng)?chuàng)建帶輸出參數(shù)的存儲(chǔ)過程9.2.1觸發(fā)器的概念觸發(fā)器是一種特殊類型的存儲(chǔ)過程,它也是由T-SQL語句組成,可以完成存儲(chǔ)過程能完成的功能,但是它具有自己的顯著特點(diǎn):它與表緊密相連,可以看做表定義的一部分;它不可能通過名稱被直接調(diào)用,更不允許參數(shù),而是當(dāng)用戶對(duì)表中的數(shù)據(jù)進(jìn)行修改時(shí),自動(dòng)執(zhí)行;它可以用于SQLServer約束、默認(rèn)值和規(guī)則的完整性檢查、實(shí)施更為復(fù)雜的數(shù)據(jù)完整性約束。9.2.2觸發(fā)器的優(yōu)點(diǎn)觸發(fā)器包含復(fù)雜的處理邏輯,能夠?qū)崿F(xiàn)復(fù)雜的完整性約束。同其他約束相比,它主要有以下優(yōu)點(diǎn):(1)觸發(fā)器自動(dòng)執(zhí)行。在對(duì)表中的數(shù)據(jù)做了任何修改(如手工輸入或者通過應(yīng)用程序?qū)崿F(xiàn)的修改)之后立即被激活。(2)觸發(fā)器能夠?qū)?shù)據(jù)庫(kù)中的相關(guān)表實(shí)現(xiàn)級(jí)聯(lián)更改。觸發(fā)器是基于一個(gè)表創(chuàng)建的,但是可以針對(duì)多個(gè)表進(jìn)行操作,實(shí)現(xiàn)數(shù)據(jù)庫(kù)中相關(guān)表的級(jí)聯(lián)更改。例如,可以在“產(chǎn)品”表的“產(chǎn)品編號(hào)”字段上建立一個(gè)插入觸發(fā)器,當(dāng)對(duì)“產(chǎn)品”表增加記錄時(shí),在“產(chǎn)品銷售”表的“產(chǎn)品編號(hào)”上自動(dòng)插入“產(chǎn)品編號(hào)”值。9.2觸發(fā)器(3)觸發(fā)器可以實(shí)現(xiàn)比CHECK約束更為復(fù)雜的數(shù)據(jù)完整性約束。在數(shù)據(jù)庫(kù)中為了實(shí)現(xiàn)數(shù)據(jù)完整性約束,可以使用CHECK約束或觸發(fā)器。CHECK約束不允許引用其他表中的列來完成檢查工作,而觸發(fā)器可以引用其他表中的列。例如,在student數(shù)據(jù)庫(kù)中,向“學(xué)生”表中插入記錄時(shí),當(dāng)輸入“系部代碼”時(shí),必須先檢查“系部”表中是否存在該系。這只能通過觸發(fā)器實(shí)現(xiàn),而不能通過CHECK約束完成。(4)觸發(fā)器可以評(píng)估數(shù)據(jù)修改前后的表的狀態(tài),并根據(jù)其差異采取對(duì)策。(5)一個(gè)表中可以同時(shí)存在三個(gè)不同操作的觸發(fā)器(INSERT、UPDATE或DELETE),對(duì)于同一個(gè)修改語句可以有多個(gè)不同的響應(yīng)對(duì)策。9.2觸發(fā)器9.2.3觸發(fā)器的種類在SQLServer2005中,按觸發(fā)被激活的時(shí)機(jī)可以將觸發(fā)器分為兩種類型:AFTER觸發(fā)器和INSTEADOF觸發(fā)器。(1)AFTER觸發(fā)器又稱為后觸發(fā)器,該類觸發(fā)器是在引起觸發(fā)器執(zhí)行的修改語句成功完成之后執(zhí)行。如果修改語句因錯(cuò)誤(如違反約束或語法錯(cuò)誤)而執(zhí)行失敗,觸發(fā)器將不會(huì)執(zhí)行。此類觸發(fā)器只能定義在表上,不能創(chuàng)建在視圖上??蔀槊總€(gè)觸發(fā)器操作(INSERT、UPDATE或DELETE)創(chuàng)建多個(gè)AFTER觸發(fā)器。如果表有多個(gè)AFTER觸發(fā)器,可使用sp_settriggerorder定義哪個(gè)AFTER觸發(fā)器最先激發(fā),哪個(gè)最后激發(fā)。除第一個(gè)和最后一個(gè)觸發(fā)器外,所有其他的AFTER觸發(fā)器的激發(fā)順序不確定,并且無法控制。(2)INSTEADOF觸發(fā)器又稱為替代觸發(fā)器,當(dāng)引起觸發(fā)器執(zhí)行的修改語句停止時(shí),該類觸發(fā)器替代觸發(fā)操作執(zhí)行。該類觸發(fā)器既可在表上定義,也可在視圖上定義。對(duì)于每個(gè)該類觸發(fā)操作(INSERT、UPDATE或DELETE),只能定義一個(gè)INSTEADOF觸發(fā)器。9.2觸發(fā)器9.2.4觸發(fā)器的創(chuàng)建和執(zhí)行1.創(chuàng)建觸發(fā)器觸發(fā)器可以在對(duì)象資源管理器中創(chuàng)建,也可以在查詢分析器中用SQL語句創(chuàng)建。在創(chuàng)建該類觸發(fā)器前,必須注意以下六點(diǎn):●CREATETRIGGER語句必須是批處理中的第一條語句。將該批處理中隨后的其他所有語句解釋為CREATETRIGGER語句定義的一部分?!裰荒茉诋?dāng)前數(shù)據(jù)庫(kù)中創(chuàng)建觸發(fā)器,觸發(fā)器名稱必須遵循標(biāo)識(shí)符的命名規(guī)則。●表的所有者具有創(chuàng)建觸發(fā)器的默認(rèn)權(quán)限,且不能將該權(quán)限轉(zhuǎn)給其他用戶?!癫荒茉谂R時(shí)表或系統(tǒng)表上創(chuàng)建觸發(fā)器,但是觸發(fā)器可以引用臨時(shí)表而不能引用系統(tǒng)表。●盡管TRUNCATETABLE語句類似于沒有WHERE語句(用于刪除行)的DELETE語句,但由于該語句不被記入日志,所以它不會(huì)引發(fā)DELETE觸發(fā)器?!馱RITETEXT語句不會(huì)引發(fā)INSERT或UPDATE觸發(fā)器。9.2觸發(fā)器在創(chuàng)建觸發(fā)器時(shí),必須指明在哪一個(gè)表上定義觸發(fā)器以及觸發(fā)器的名稱、激發(fā)時(shí)機(jī)、激活觸發(fā)器的修改語句(INSERT、UPDATE或DELETE)。(1)使用對(duì)象資源管理器創(chuàng)建觸發(fā)器。【例9.17】在TestDB數(shù)據(jù)庫(kù)中,為“tb_single”表創(chuàng)建一個(gè)插入觸發(fā)器,名稱為timu,其作用是當(dāng)為“tb_single”表插入記錄時(shí),將該記錄中question_num的內(nèi)容自動(dòng)插入到“tb_multi”表中。操作步驟如下:①在“對(duì)象資源管理器”窗格中,展開“數(shù)據(jù)庫(kù)”結(jié)點(diǎn)。②展開相應(yīng)的數(shù)據(jù)庫(kù)(選擇TestDB數(shù)據(jù)庫(kù))和“表”結(jié)點(diǎn)。③單擊相應(yīng)的表(選擇“dbo.tb_single”表),右擊“觸發(fā)器”結(jié)點(diǎn),在彈出的快捷菜單中選擇“新建觸發(fā)器”命令,打開新建觸發(fā)器初始界面,如圖9-11所示。9.2觸發(fā)器圖9-11新建觸發(fā)器初始界面④輸入觸發(fā)器文本,本例中輸入的代碼如下:CREATETRIGGERtimuONdbo.tb_singleFORINSERTASDECLARE@BIANHAOINTSELECT@BIANHAO=dbo.tb_single.Question_numFROMdbo.tb_singleinsertintodbo.tb_multivalues(0,@BIANHAO,0,0,0,0,0,0)GO⑤單擊“分析”按鈕,然后單擊“執(zhí)行”按鈕,完成觸發(fā)器的創(chuàng)建。(2)使用SQL語句創(chuàng)建觸發(fā)器。使用SQL語句創(chuàng)建觸發(fā)器的語法格式為:CTEATETRIGGERtrigger_nameON{table|view}[WITHENCRYPTION]{

9.2觸發(fā)器{{FOR|AFTER|INSTEADOF}{[INSERT][,][DELETE][,][UPDATE]}[NOTFORREPLICATION]

AS[{IFUPDATE(column)[{AND|OR}UPDATE(column)][,…n]|IF(COLUMNS_UPDTED(){bitwise_operator}updated_bitmask)(comparison_operator)column_bitmask[,…n]}]sql_statement[,…n]}}其中:9.2觸發(fā)器●trigger_name是觸發(fā)器名稱,其必須符合名稱標(biāo)識(shí)規(guī)則,并且在當(dāng)前數(shù)據(jù)庫(kù)中唯一?!駎able|view是被定義觸發(fā)器的表或視圖?!馱ITHENCRYPTION用于對(duì)syscomments表中含CREATETRIGGER的語句文本進(jìn)行加密?!馎FTER是默認(rèn)的觸發(fā)器類型,即后觸發(fā)器。此類型觸發(fā)器不能在視圖上定義?!馡NSERTOF表示建立替代類型的觸發(fā)器。NOTFORREPLICATION表示當(dāng)復(fù)制進(jìn)程更改觸發(fā)器所涉及的表時(shí),不應(yīng)執(zhí)行該觸發(fā)器?!馡FUPDATE指定對(duì)表中字段進(jìn)行增加或修改內(nèi)容時(shí)起作用,不能用于刪除操作?!駍ql_statement定義觸發(fā)器被觸發(fā)后將執(zhí)行的SQL語句。9.2觸發(fā)器【例9.18】在TestDB數(shù)據(jù)庫(kù)中,為“tb_single”表中“question_num”建立一個(gè)名為del_timu的DELETE觸發(fā)器,其作用是當(dāng)刪除“tb_single”表中的記錄時(shí),同時(shí)刪除“tb_multi”表中與“tb_single”表相關(guān)的記錄。代碼如下:USETestDBGOCREATETRIGGERdel_timuONdbo.tb_singleFORDELETEASDELETEdbo.tb_multiWHEREquestion_numIN(SELECTquestion_numFROMDELETED)GO9.2觸發(fā)器2.查看觸發(fā)器信息觸發(fā)器創(chuàng)建好后,其名稱保存在sysobjects系統(tǒng)表中,其源代碼保存在syscomments中。如果需要查看觸發(fā)器信息,既可以使用系統(tǒng)存儲(chǔ)過程,也可以使用對(duì)象資源管理器。(1)使用系統(tǒng)存儲(chǔ)過程查看觸發(fā)器信息:觸發(fā)器是特殊的存儲(chǔ)過程,查看存儲(chǔ)過程的系統(tǒng)存儲(chǔ)過程都可以使用觸發(fā)器。可以使用sp_help查看觸發(fā)器的一般信息,如名稱、所有者、類型和創(chuàng)建時(shí)間,使用sp_helptext查看未加密的觸發(fā)器的定義信息,使用sp_depends查看觸發(fā)器的依賴關(guān)系。除此以外,SQLServer提供了一個(gè)專門用于查看表的觸發(fā)器信息的系統(tǒng)存儲(chǔ)過程sp_helptrigger。其語法格式如下:sp_helptrigger表名,[INSERT][,][DELETE][,][UPDATE]9.2觸發(fā)器【例9.19】使用系統(tǒng)存儲(chǔ)過程sp_helptrigger查看“tb_single”表上存在的觸發(fā)器的信息。代碼如下:USETestDBGOEXECsp_helptriggertb_singleGO執(zhí)行上述代碼,將在“結(jié)果”窗格中返回“產(chǎn)品”表上所定義的觸發(fā)器的信息,從中可以了解到當(dāng)前表中觸發(fā)器的名稱、所有者以及觸發(fā)條件,如圖9-12所示。(2)使用對(duì)象資源管理器查看觸發(fā)器信息:在對(duì)象資源管理器中,查看觸發(fā)器信息與創(chuàng)建觸發(fā)器相似,即在“對(duì)象資源管理器”窗格中,依次展開“數(shù)據(jù)庫(kù)”、“表”結(jié)點(diǎn),然后右擊觸發(fā)器,在彈出的快捷菜單中選擇“修改”命令,打開創(chuàng)建觸發(fā)器的界面進(jìn)行查看即可,如圖9-11所示。9.2觸發(fā)器圖9-12“tb_single”表上定義的觸發(fā)器信息9.2.5修改和刪除觸發(fā)器1.修改觸發(fā)器對(duì)于建立好的觸發(fā)器,可以根據(jù)需要對(duì)其名稱以及文本進(jìn)行修改。通常,使用系統(tǒng)存儲(chǔ)過程對(duì)其進(jìn)行更名,用對(duì)象資源管理器或SQL命令修改其文本。(1)使用系統(tǒng)存儲(chǔ)過程修改觸發(fā)器名稱:對(duì)觸發(fā)器進(jìn)行重命名,可以使用系統(tǒng)存儲(chǔ)過程sp_rename來完成。其語法格式如下:[EXECUTE]sp_rename觸發(fā)器原名,觸發(fā)器新名(2)使用對(duì)象資源管理器修改觸發(fā)器文本:使用對(duì)象資源管理器修改觸發(fā)器的操作步驟與創(chuàng)建觸發(fā)器相似,只不過在打開“觸發(fā)器”對(duì)話框后,從名稱對(duì)話框中選擇需要修改的觸發(fā)器,然后對(duì)文本中的SQL語句進(jìn)行修改即可。修改完后,單擊“分析”按鈕,然后單擊“執(zhí)行”按鈕,完成觸發(fā)器的修改。(3)使用SQL語句修改觸發(fā)器:修改觸發(fā)器的定義,可以使用ALTERTRIGGER語句。其語法格式如下:

ALTERTRIGGERtrigger_nameON(table|view)[WITHENCRYPTION]{9.2觸發(fā)器

{(FOR|AFTER|INSTEADOF){[INSERT][,][DELETE][,][UPDATE]}[NOTFORREPLICATION]ASsql_statement[,…n]}|{(FOR|AFTER|INSTEADOF){[INSERT][,][UPDATE]}[NOTFORREPLICATION]AS[{IFUPDATE(column)[{AND|OR}UPDATE(column)][,…n]|IF(COLUMNS_UPDTED(){bitwise_operator}updated_bitmask)(comparison_operator)column_bitmask[,…n]}sql_statement[,…n]}}其中的參數(shù)與創(chuàng)建觸發(fā)器語句中的參數(shù)相同。9.2觸發(fā)器【例9.20】在TestDB數(shù)據(jù)庫(kù)中,修改“tb_single”表上的觸發(fā)器del_timu,使其在實(shí)現(xiàn)級(jí)聯(lián)刪除時(shí),顯示語句:“tb_multi中相應(yīng)記錄也被刪除”。代碼如下:USETestDBGOALTERTRIGGERdel_timuONdbo.tb_singleFORDELETEASBEGINDELETEtb_multiWHEREquestion_numIN(SELECTquestion_numFROMDELETED)PRINT'tb_multi中相應(yīng)記錄也被刪除'ENDGO9.2觸發(fā)器V9-1-14修改觸發(fā)器.wmv【例9.21】刪除“tb_single”表中“question_num”為“0003”的記錄,觀察觸發(fā)器del_xiaoshou的作用。代碼如下:USETestDBGODELETEFROMtb_single

WHEREquestion_num='0003'GO

運(yùn)行結(jié)果如圖9-13所示。9.2觸發(fā)器圖9-13觸發(fā)器作用2.禁止或啟用觸發(fā)器針對(duì)某個(gè)表創(chuàng)建的觸發(fā)器,可以根據(jù)需要,禁止或啟用其執(zhí)行。禁止觸發(fā)器或啟用觸發(fā)器只能在查詢分析器中進(jìn)行。其語法格式為:ALTERTABLE表名{ENABLE|DISABLE}觸發(fā)器名稱其中:●ENABLE選項(xiàng)為啟用觸發(fā)器?!馜ISABLE選項(xiàng)為禁止觸發(fā)器。3.刪除觸發(fā)器當(dāng)不再需要某個(gè)觸發(fā)器時(shí),可以將其刪除,只有觸發(fā)器的所有者才有權(quán)刪除觸發(fā)器??梢允褂靡韵碌姆椒▽⒂|發(fā)器刪除:(1)使用對(duì)象資源管理器刪除觸發(fā)器,其操作步驟為:在“對(duì)象資源管理器”窗格中,依次展開“服務(wù)器”、“數(shù)據(jù)庫(kù)”、“表”結(jié)點(diǎn),展開有觸發(fā)器的表,展開觸發(fā)器,右擊要?jiǎng)h除的觸發(fā)器,在彈出的快捷菜單中選擇“刪除”命令,在打開的“刪除對(duì)象”對(duì)話框中單擊“確定”按鈕,即將觸發(fā)器刪除。9.2觸發(fā)器(2)使用SQL語句刪除觸發(fā)器。刪除一個(gè)或多個(gè)觸發(fā)器,可以使用DROPTRIGGER語句。其語法格式如下:DROPTRIGGER{觸發(fā)器名稱}[,…n]如果要同時(shí)刪除多個(gè)觸發(fā)器,觸發(fā)器名稱之間用英文逗號(hào)分隔。(3)刪除表的同時(shí)刪除觸發(fā)器。當(dāng)某個(gè)表被刪除后,該表上的所有觸發(fā)器將同時(shí)被刪除,但是刪除觸發(fā)器不會(huì)對(duì)表中的數(shù)據(jù)有影響。9.2觸發(fā)器9.2.6嵌套觸發(fā)器在觸發(fā)器中可以包含影響另外一個(gè)表的INSERT、UPDATE或者DELETE語句,這就是嵌套觸發(fā)器。具體來說就是

溫馨提示

  • 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. 人人文庫(kù)網(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)論