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

下載本文檔

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

文檔簡介

第10章存儲過程與觸發(fā)器

《數(shù)據(jù)庫技術(shù)與應(yīng)用-SQLServer2008》10.1存儲過程

概述10.2存儲過程

的創(chuàng)建與

使用10.3觸發(fā)器概

述10.4觸發(fā)器的創(chuàng)建與使

用10.5事務(wù)處理10.6鎖機制.10.1存儲過程概述 1.存儲過程存儲過程是一組Transact-SQL語句的集合,經(jīng)編譯后存放在數(shù)據(jù)庫服務(wù)器端,供客戶端調(diào)用,因此存儲過程可以充分地利用服務(wù)器的高性能運算能力,而無需把大量的結(jié)果集傳送到客戶端處理,從而可大大減少網(wǎng)絡(luò)數(shù)據(jù)傳輸開銷,提高應(yīng)用程序訪問數(shù)據(jù)庫的速度和效率。10.1存儲過程概述10.2存儲過程的創(chuàng)建與使用10.3觸發(fā)器概述10.4觸發(fā)器的創(chuàng)建與使用10.5事務(wù)處理10.6鎖機制10.1存儲過程概述 2.觸發(fā)器觸發(fā)器實質(zhì)上是一種特殊類型的存儲過程,它在插入、修改或刪除指定表中的數(shù)據(jù)時觸發(fā)執(zhí)行。使用觸發(fā)器可提高數(shù)據(jù)庫應(yīng)用程序和靈活性和健壯性,實現(xiàn)復(fù)雜的業(yè)務(wù)規(guī)則,更有效地實施數(shù)據(jù)完整性。10.1存儲過程概述10.2存儲過程的創(chuàng)建與使用10.3觸發(fā)器概述10.4觸發(fā)器的創(chuàng)建與使用10.5事務(wù)處理10.6鎖機制10.1存儲過程概述 1.存儲過程的類型SQLServer存儲過程的類型包括:系統(tǒng)存儲過程、用戶定義存儲過程、臨時存儲過程、擴展存儲過程。(1)系統(tǒng)存儲過程系統(tǒng)存儲過程是指由系統(tǒng)提供的存儲過程,主要存儲在master數(shù)據(jù)庫中并以sp_為前綴,它從系統(tǒng)表中獲取信息,從而為系統(tǒng)管理員管理SQLServer提供支持。10.1存儲過程概述10.2存儲過程的創(chuàng)建與使用10.3觸發(fā)器概述10.4觸發(fā)器的創(chuàng)建與使用10.5事務(wù)處理10.6鎖機制10.1存儲過程概述 1.存儲過程的類型(2)用戶定義存儲過程用戶定義存儲過程是由用戶創(chuàng)建并能完成某一特定功能(例如查詢用戶所需數(shù)據(jù)信息)的存儲過程。它處于用戶創(chuàng)建的數(shù)據(jù)庫中,存儲過程名前沒有前綴sp_。本章所涉及的存儲過程主要是指用戶定義存儲過程。10.1存儲過程概述10.2存儲過程的創(chuàng)建與使用10.3觸發(fā)器概述10.4觸發(fā)器的創(chuàng)建與使用10.5事務(wù)處理10.6鎖機制10.1存儲過程概述 1.存儲過程的類型(3)臨時存儲過程臨時存儲過程與臨時表類似,分為局部臨時存儲過程和全局臨時存儲過程,且可以分別向該過程名稱前面添加“#”或“##”前綴表示?!?”表示本地臨時存儲過程,“##”表示全局臨時存儲過程。使用臨時存儲過程必須創(chuàng)建本地連接,當(dāng)SQLServer關(guān)閉后,這些臨時存儲過程將自動被刪除。10.1存儲過程概述10.2存儲過程的創(chuàng)建與使用10.3觸發(fā)器概述10.4觸發(fā)器的創(chuàng)建與使用10.5事務(wù)處理10.6鎖機制10.1存儲過程概述 1.存儲過程的類型(4)擴展存儲過程擴展存儲過程是SQLServer2008的實例可以動態(tài)加載和運行的動態(tài)鏈接庫(DLL)。它直接在SQLServer2008實例的地址空間中運行,可以使用SQLServer擴展存儲過程API完成編程。當(dāng)擴展存儲過程加載到SQLServer中,它的使用方法與系統(tǒng)存儲過程一樣。擴展存儲過程只能添加到master數(shù)據(jù)庫中,其前綴是xp_。10.1存儲過程概述10.2存儲過程的創(chuàng)建與使用10.3觸發(fā)器概述10.4觸發(fā)器的創(chuàng)建與使用10.5事務(wù)處理10.6鎖機制10.1存儲過程概述 2.存儲過程的功能特點SQLServer中的存儲過程可以實現(xiàn)以下功能:(1)接收輸入?yún)?shù)并以輸出參數(shù)的形式為調(diào)用過程或批處理返回多個值。(2)包含執(zhí)行數(shù)據(jù)庫操作的編程語句,包括調(diào)用其他過程。(3)為調(diào)用過程或批處理返回一個狀態(tài)值,以表示成功或失?。笆≡颍?。10.1存儲過程概述10.2存儲過程的創(chuàng)建與使用10.3觸發(fā)器概述10.4觸發(fā)器的創(chuàng)建與使用10.5事務(wù)處理10.6鎖機制10.1存儲過程概述 2.存儲過程的功能特點存儲過程具有以下優(yōu)點:(1)模塊化編程。創(chuàng)建一次存儲過程,存儲在數(shù)據(jù)庫中后,就可以在程序中重復(fù)調(diào)用任意多次。存儲過程可以由專業(yè)人員創(chuàng)建,可以獨立于程序源代碼來修改它們。(2)快速執(zhí)行。當(dāng)某操作要求大量的Transact-SQL代碼或者要重復(fù)執(zhí)行時,存儲過程要比Transact-SQL批處理代碼快得多。當(dāng)創(chuàng)建存儲過程時,它得到了分析和優(yōu)化。在第一次執(zhí)行之后,存儲過程就駐留在內(nèi)存中,省去了重新分析、重新優(yōu)化和重新編譯等工作。(3)減少網(wǎng)絡(luò)通信量。存儲過程可以由幾百條Transact-SQL語句組成,但執(zhí)行時,僅用一條語句,所以只有少量的SQL語句在網(wǎng)絡(luò)線上傳輸。從而減少了網(wǎng)絡(luò)流量和網(wǎng)絡(luò)傳輸時間。(4)提供安全機制。對沒有權(quán)限執(zhí)行存儲體(組成存儲過程的語句)的用戶也可以授權(quán)執(zhí)行該存儲過程。(5)保證操作一致性。由于存儲過程是一段封裝的查詢,從而對于重復(fù)的操作將保持功能的一致性。10.1存儲過程概述10.2存儲過程的創(chuàng)建與使用10.3觸發(fā)器概述10.4觸發(fā)器的創(chuàng)建與使用10.5事務(wù)處理10.6鎖機制10.2存儲過程的創(chuàng)建與使用 (1)打開SQLServer管理平臺,展開節(jié)點“對象資源管理器”→“數(shù)據(jù)庫服務(wù)器”→“可編程性”→“存儲過程”,在窗口的右側(cè)顯示出當(dāng)前數(shù)據(jù)庫的所有存儲過程。單擊鼠標右鍵,在彈出的快捷菜單中選擇“新建存儲過程”命令,如圖10-1所示。10.1存儲過程概述10.2存儲過程的創(chuàng)建與使用10.3觸發(fā)器概述10.4觸發(fā)器的創(chuàng)建與使用10.5事務(wù)處理10.6鎖機制在SQLServer2008中,可以使用SQLServer管理平臺和Transact-SQL語句CREATEPROCEDURE創(chuàng)建存儲過程,創(chuàng)建存儲過程后,還可以進行存儲過程的執(zhí)行、修改和刪除等操作。10.2.1創(chuàng)建存儲過程1.使用SQLServer2008管理平臺創(chuàng)建存儲過程10.2存儲過程的創(chuàng)建與使用 1.使用SQLServer2008管理平臺創(chuàng)建存儲過程10.1存儲過程概述10.2存儲過程的創(chuàng)建與使用10.3觸發(fā)器概述10.4觸發(fā)器的創(chuàng)建與使用10.5事務(wù)處理10.6鎖機制(2)在打開的SQL命令窗口中,系統(tǒng)給出了創(chuàng)建存儲過程命令的模板,如圖10-2所示。在模板中可以輸入創(chuàng)建存儲過程的Transact-SQL語句后,單擊“執(zhí)行”按鈕即可創(chuàng)建存儲過程。(3)建立存儲過程的命令被成功執(zhí)行后,在“對象資源管理器”→“數(shù)據(jù)庫服務(wù)器”→“可編程性”→“存儲過程”中可以看到新建立的存儲過程,如圖10-3所示。10.2存儲過程的創(chuàng)建與使用 1.使用SQLServer2008管理平臺創(chuàng)建存儲過程10.1存儲過程概述10.2存儲過程的創(chuàng)建與使用10.3觸發(fā)器概述10.4觸發(fā)器的創(chuàng)建與使用10.5事務(wù)處理10.6鎖機制10.2存儲過程的創(chuàng)建與使用 2.使用CREATEPROCEDURE語句創(chuàng)建存儲過程10.1存儲過程概述10.2存儲過程的創(chuàng)建與使用10.3觸發(fā)器概述10.4觸發(fā)器的創(chuàng)建與使用10.5事務(wù)處理10.6鎖機制在創(chuàng)建存儲過程之前,應(yīng)該考慮以下幾個方面:(1)在一個批處理中,CREATEPROCEDURE語句不能與其他SQL語句合并在一起。(2)數(shù)據(jù)庫所有者具有默認的創(chuàng)建存儲過程的權(quán)限,它可把該權(quán)限傳遞給其他的用戶。(3)存儲過程作為數(shù)據(jù)庫對象其命名必須符合標識符的命名規(guī)則。(4)只能在當(dāng)前數(shù)據(jù)庫中創(chuàng)建屬于當(dāng)前數(shù)據(jù)庫的存儲過程。10.2存儲過程的創(chuàng)建與使用 2.使用CREATEPROCEDURE語句創(chuàng)建存儲過程10.1存儲過程概述10.2存儲過程的創(chuàng)建與使用10.3觸發(fā)器概述10.4觸發(fā)器的創(chuàng)建與使用10.5事務(wù)處理10.6鎖機制創(chuàng)建存儲過程語句的語法格式如下:CREATEPROC[EDURE]procedure_name[;number][{@parameterdata_type}[VARYING][=default][OUTPUT]][,…n][WITH{RECOMPILE|ENCRYPTION|RECOMPILE,ENCRYPTION}][FORREPLICATION]ASsql_statement[,…n]10.2存儲過程的創(chuàng)建與使用 2.使用CREATEPROCEDURE語句創(chuàng)建存儲過程10.1存儲過程概述10.2存儲過程的創(chuàng)建與使用10.3觸發(fā)器概述10.4觸發(fā)器的創(chuàng)建與使用10.5事務(wù)處理10.6鎖機制【例10-1】創(chuàng)建存儲過程,從表goods和表goods_classification的聯(lián)接中返回商品名、商品類別、單價。CREATEPROCEDUREgoods_infoASSELECTgoods_name,classification_name,unit_priceFROMgoodsgINNERJOINgoods_classificationgcONg.classification_id=gc.classification_id存儲過程創(chuàng)建后,存儲過程的名稱存放在sysobject表中,文本存放在syscomments表中。10.2存儲過程的創(chuàng)建與使用 要運行某個存儲過程,只要簡單地通過名字就可以引用它。如果對存儲過程的調(diào)用不是批處理中的第一條語句,則需要使用EXECUTE關(guān)鍵字。面是執(zhí)行存儲過程的語法格式:[[EXEC[UTE]]{[@return_status=]procedure_name[;number]|@procedure_name_var}[[@parameter=]{value|@variable[OUTPUT]|[DEFAULT]][,…n][WITHRECOMPILE]10.1存儲過程概述10.2存儲過程的創(chuàng)建與使用10.3觸發(fā)器概述10.4觸發(fā)器的創(chuàng)建與使用10.5事務(wù)處理10.6鎖機制10.2.2執(zhí)行存儲過程10.2存儲過程的創(chuàng)建與使用 例如,執(zhí)行例10-1的存儲過程goods_info。在SQL查詢編輯器中輸入命令:EXECgoods_info運行的結(jié)果如圖10-4所示。10.1存儲過程概述10.2存儲過程的創(chuàng)建與使用10.3觸發(fā)器概述10.4觸發(fā)器的創(chuàng)建與使用10.5事務(wù)處理10.6鎖機制10.2.2執(zhí)行存儲過程10.2存儲過程的創(chuàng)建與使用 修改存儲過程可以通過SQLServer管理平臺和Transact-SQL語句實現(xiàn)。1.使用SQLServer2008管理平臺修改存儲過程10.1存儲過程概述10.2存儲過程的創(chuàng)建與使用10.3觸發(fā)器概述10.4觸發(fā)器的創(chuàng)建與使用10.5事務(wù)處理10.6鎖機制10.2.3修改存儲過程(1)打開SQLServer管理平臺,展開節(jié)點“對象資源管理器”→“數(shù)據(jù)庫服務(wù)器”→“可編程性”→“存儲過程”,選擇要修改的存儲過程,單擊鼠標右鍵,在彈出的快捷菜單中選擇“修改”命令。(2)此時在右邊的編輯器窗口中出現(xiàn)存儲過程的源代碼(將CREATEPROCEDURE改為了ALTERPROCEDURE),如圖10-5所示可直接進行修改。修改完后單擊工具欄中的“執(zhí)行”按鈕執(zhí)行該存儲過程,從而達到目的。10.2存儲過程的創(chuàng)建與使用 2.使用ALTERPROCEDURE語句修改存儲過程10.1存儲過程概述10.2存儲過程的創(chuàng)建與使用10.3觸發(fā)器概述10.4觸發(fā)器的創(chuàng)建與使用10.5事務(wù)處理10.6鎖機制10.2.3修改存儲過程使用ALTERPROCEDURE語句。其語法規(guī)則如下:ALTERPROC[EDURE]procedure_name[;number][{@parameterdata_type}[VARYING][=default][OUTPUT]][,…n][WITH{RECOMPILE|ENCRYPTION|RECOMPILE,ENCRYPTION}][FORREPLICATION]ASsql_statement[,…n]其中的參數(shù)和保留字的含義與CREATEPROCEDURE語句中的含義相似。10.2存儲過程的創(chuàng)建與使用 2.使用ALTERPROCEDURE語句修改存儲過程10.1存儲過程概述10.2存儲過程的創(chuàng)建與使用10.3觸發(fā)器概述10.4觸發(fā)器的創(chuàng)建與使用10.5事務(wù)處理10.6鎖機制10.2.3修改存儲過程【例10-2】使用ALTERPROCEDURE語句更改存儲過程。(1)創(chuàng)建存儲過程employee_dep,以獲取經(jīng)理辦的男員工。CREATEPROCEDUREemployee_depASSELECTemployee_name,sex,address,department_nameFROMemployeeeINNERJOINdepartmentdONe.department_id=d.department_idWHEREsex='男'ANDe.department_id='D003'10.2存儲過程的創(chuàng)建與使用 2.使用ALTERPROCEDURE語句修改存儲過程10.1存儲過程概述10.2存儲過程的創(chuàng)建與使用10.3觸發(fā)器概述10.4觸發(fā)器的創(chuàng)建與使用10.5事務(wù)處理10.6鎖機制10.2.3修改存儲過程【例10-2】使用ALTERPROCEDURE語句更改存儲過程。(2)用SELECT語句查詢系統(tǒng)表sysobjects和syscomments,查看employee_dep存儲過程的文本信息的代碼如下:SELECTo.id,c.textFROMsysobjectsoINNERJOINsyscommentscONo.id=c.idWHEREo.type='P'AND='employee_dep'

10.2存儲過程的創(chuàng)建與使用 2.使用ALTERPROCEDURE語句修改存儲過程10.1存儲過程概述10.2存儲過程的創(chuàng)建與使用10.3觸發(fā)器概述10.4觸發(fā)器的創(chuàng)建與使用10.5事務(wù)處理10.6鎖機制10.2.3修改存儲過程【例10-2】使用ALTERPROCEDURE語句更改存儲過程。(3)使用ALTERPROCEDURE語句對employee_dep過程進行修改,使其能夠顯示出所有男員工,并使employee_dep過程以加密方式存儲在表syscomments中,其代碼如下:ALTERPROCEDUREemployee_depWITHENCRYPTIONASSELECTemployee_name,sex,address,department_nameFROMemployeeeINNERJOINdepartmentdONe.department_id=d.department_idWHEREsex='男'

10.2存儲過程的創(chuàng)建與使用 2.使用ALTERPROCEDURE語句修改存儲過程10.1存儲過程概述10.2存儲過程的創(chuàng)建與使用10.3觸發(fā)器概述10.4觸發(fā)器的創(chuàng)建與使用10.5事務(wù)處理10.6鎖機制10.2.3修改存儲過程【例10-2】使用ALTERPROCEDURE語句更改存儲過程。(4)從系統(tǒng)表sysobjects和syscomments提取修改后的存儲過程employee_dep的文本信息可以運行步驟(2)中的代碼,結(jié)果如圖10-8所示。10.2存儲過程的創(chuàng)建與使用 2.使用ALTERPROCEDURE語句修改存儲過程10.1存儲過程概述10.2存儲過程的創(chuàng)建與使用10.3觸發(fā)器概述10.4觸發(fā)器的創(chuàng)建與使用10.5事務(wù)處理10.6鎖機制10.2.3修改存儲過程【例10-2】使用ALTERPROCEDURE語句更改存儲過程。這是由于在ALTERPROCEDURE語句中使用WITHENCRYPTION關(guān)鍵字對存儲過程employee_dep的文本進行了加密,其文本信息顯示為NULL。也可以使用系統(tǒng)存儲過程sp_helptext顯示存儲過程的定義(存儲在syscomments系統(tǒng)表內(nèi)),其命令如下:sp_helptextemployee_dep結(jié)果為“對象'employee_dep'的文本已加密”。

10.2存儲過程的創(chuàng)建與使用 存儲過程可以被快速刪除和重建,因為它沒有存儲數(shù)據(jù)。刪除存儲過程可以使用SQLServer管理平臺和Transact-SQL語句刪除。10.1存儲過程概述10.2存儲過程的創(chuàng)建與使用10.3觸發(fā)器概述10.4觸發(fā)器的創(chuàng)建與使用10.5事務(wù)處理10.6鎖機制10.2.4刪除存儲過程1.使用SQLServer2008管理平臺刪除存儲過程操作步驟如下:(1)打開SQLServer管理平臺,展開節(jié)點“對象資源管理器”→“數(shù)據(jù)庫服務(wù)器”→“數(shù)據(jù)庫”→選定的數(shù)據(jù)庫→“可編程性”→“存儲過程”,選擇要刪除的存儲過程,單擊鼠標右鍵,在彈出的快捷菜單中選擇“刪除”命令。(2)在彈出的“刪除對象”對話框中單擊“確定”按鈕即可刪除存儲過程。10.2存儲過程的創(chuàng)建與使用 10.1存儲過程概述10.2存儲過程的創(chuàng)建與使用10.3觸發(fā)器概述10.4觸發(fā)器的創(chuàng)建與使用10.5事務(wù)處理10.6鎖機制10.2.4刪除存儲過程2.使用DROPPROCEDURE語句刪除存儲過程DROPPROCEDURE語句可將一個或多個存儲過程從當(dāng)前數(shù)據(jù)庫中刪除。其語法如下:DROPPROCEDURE{procedure_name}[,…n]例如,刪除例10-2創(chuàng)建的存儲過程employee_dep可使用以下語句:DROPPROCEDUREemployee_depGO刪除某個存儲過程時,將從sysobjects和syscomments系統(tǒng)表中刪除該過程的相關(guān)信息。10.2存儲過程的創(chuàng)建與使用 10.1存儲過程概述10.2存儲過程的創(chuàng)建與使用10.3觸發(fā)器概述10.4觸發(fā)器的創(chuàng)建與使用10.5事務(wù)處理10.6鎖機制10.2.5存儲過程參數(shù)與狀態(tài)值存儲過程和調(diào)用者之間通過參數(shù)交換數(shù)據(jù),可以按輸入的參數(shù)執(zhí)行,也可由參數(shù)輸出執(zhí)行結(jié)果。調(diào)用者通過存儲過程返回的狀態(tài)值對存儲過程進行管理。參數(shù)存儲過程的參數(shù)在創(chuàng)建過程時聲明。SQLServer支持兩類參數(shù):輸入?yún)?shù)和輸出參數(shù)。(1)輸入?yún)?shù)輸入?yún)?shù)允許調(diào)用程序為存儲過程傳送數(shù)據(jù)值。定義存儲過程的輸入?yún)?shù)必須在CREATEPROCEDURE語句中聲明一個或多個變量及類型。(2)輸出參數(shù)輸出參數(shù)允許存儲過程將數(shù)據(jù)值或游標變量傳回調(diào)用程序。使用輸出參數(shù),在CREATEPROCEDURE和EXECUTE語句中都必須使用OUTPUT關(guān)鍵字。10.2存儲過程的創(chuàng)建與使用 10.1存儲過程概述10.2存儲過程的創(chuàng)建與使用10.3觸發(fā)器概述10.4觸發(fā)器的創(chuàng)建與使用10.5事務(wù)處理10.6鎖機制10.2.5存儲過程參數(shù)與狀態(tài)值2.返回存儲過程的狀態(tài)(1)用RETURN語句定義返回值存儲過程可以返回整型狀態(tài)值,表示過程是否成功執(zhí)行,或者過程失敗的原因。如果存儲過程沒有顯式設(shè)置返回代碼的值,則SQLServer返回代碼為0,表示成功執(zhí)行;若返回-1~-99之間的整數(shù),表示沒有成功執(zhí)行。也可以使用RETURN語句,用大于0或小于-99的整數(shù)來定義自己的返回狀態(tài)值,以表示不同的執(zhí)行結(jié)果。在建立過程的時候,需要定義出錯條件并把它們與整型的出錯代碼聯(lián)系起來。10.2存儲過程的創(chuàng)建與使用 10.1存儲過程概述10.2存儲過程的創(chuàng)建與使用10.3觸發(fā)器概述10.4觸發(fā)器的創(chuàng)建與使用10.5事務(wù)處理10.6鎖機制返回存儲過程的狀態(tài)【例10-5】創(chuàng)建創(chuàng)建存儲過程,輸入商品類別,返回各種商品名稱。在存儲過程中,用值15表示用戶沒有提供參數(shù);值-101表示沒有輸入商品類別;值0表示過程運行沒有出錯。/*存儲過程在出錯時設(shè)置出錯狀態(tài)*/CREATEPROCcl_goods@cl_namevarchar(40)=NULLASIF@cl_name=NULLRETURN15IFNOTEXISTS(SELECT*FROMgoods_classificationWHEREclassification_name=@cl_name)RETURN-101SELECTg.goods_nameFROMgoods_classificationgc,goodsgWHEREgc.classification_id=g.classification_idANDgc.classification_name=@cl_nameRETURN010.2存儲過程的創(chuàng)建與使用 10.1存儲過程概述10.2存儲過程的創(chuàng)建與使用10.3觸發(fā)器概述10.4觸發(fā)器的創(chuàng)建與使用10.5事務(wù)處理10.6鎖機制10.2.5存儲過程參數(shù)與狀態(tài)值2.返回存儲過程的狀態(tài)(2)捕獲返回狀態(tài)值在執(zhí)行過程時,要正確接收返回的狀態(tài)值,必須使用以下語句;EXECUTE@status_var=procedure_name其中,@status_var變量應(yīng)在EXECUTE命令之前聲明。它可以接收返回的狀態(tài)碼。如此,當(dāng)存儲過程執(zhí)行出錯時,調(diào)用它的批處理或應(yīng)用程序?qū)扇∠鄳?yīng)的措施。例10-5的存儲過程cl_goods執(zhí)行時使用以下語句。/*檢查狀態(tài)并報告出錯原因*/DECLARE@return_statusintEXEC@return_status=cl_goods'筆記本計算機'IF@return_status=15SELECT'語法錯誤'ELSEIF@return_status=-101SELECT'沒有找到該商品類別'執(zhí)行時,將對不同的輸入值返回不同的狀態(tài)值及處理結(jié)果。10.3觸發(fā)器概述 10.1存儲過程概述10.2存儲過程的創(chuàng)建與使用10.3觸發(fā)器概述10.4觸發(fā)器的創(chuàng)建與使用10.5事務(wù)處理10.6鎖機制觸發(fā)器是一種特殊類型的存儲過程,它不同于前面介紹的存儲過程。觸發(fā)器主要是通過事件進行觸發(fā)而被執(zhí)行的,而存儲過程可以通過過程名字直接調(diào)用。當(dāng)對某一表進行UPDATE、INSERT、DELETE操作時,SQLServer就會自動執(zhí)行觸發(fā)器所定義的SQL語句,從而確保對數(shù)據(jù)的處理必須符合由這些SQL語句所定義的規(guī)則。10.3觸發(fā)器概述 10.1存儲過程概述10.2存儲過程的創(chuàng)建與使用10.3觸發(fā)器概述10.4觸發(fā)器的創(chuàng)建與使用10.5事務(wù)處理10.6鎖機制觸發(fā)器的主要作用就是能夠?qū)崿F(xiàn)由主鍵和外鍵所不能保證的參照完整性和數(shù)據(jù)的一致性。除此之處,觸發(fā)器還有如下功能:(1)強化約束。觸發(fā)器能夠?qū)崿F(xiàn)比CHECK語句更為復(fù)雜的約束。(2)跟蹤變化。觸發(fā)器可以偵測數(shù)據(jù)庫內(nèi)的操作,從而不允許數(shù)據(jù)庫中不經(jīng)許可的指定更新和變化。(3)級聯(lián)運行。觸發(fā)器可以偵測數(shù)據(jù)庫內(nèi)的操作,并自動地級聯(lián)影響整個數(shù)據(jù)庫的各項內(nèi)容。例如,某個表上的觸發(fā)器中包含有對另外一個表的數(shù)據(jù)操作(如刪除、更新、插入),該操作又導(dǎo)致該表的觸發(fā)器被觸發(fā)。(4)存儲過程的調(diào)用。為了響應(yīng)數(shù)據(jù)庫更新,觸發(fā)器可以調(diào)用一個或多個存儲過程,甚至可以通過外部過程的調(diào)用而在DBMS本身之外進行操作。10.3觸發(fā)器概述 10.1存儲過程概述10.2存儲過程的創(chuàng)建與使用10.3觸發(fā)器概述10.4觸發(fā)器的創(chuàng)建與使用10.5事務(wù)處理10.6鎖機制觸發(fā)器可以擴展SQLServer約束、默認值和規(guī)則的完整性檢查邏輯,可以解決高級形式的業(yè)務(wù)規(guī)則、復(fù)雜行為限制、實現(xiàn)定制記錄等方面的問題。例如,觸發(fā)器能夠找出某表在數(shù)據(jù)修改前后狀態(tài)發(fā)生的差異,并根據(jù)這種差異執(zhí)行一定的處理。一個表的多個觸發(fā)器能夠?qū)ν环N數(shù)據(jù)操作采取多種不同的處理。但是,只要約束和默認值提供了全部所需的功能,就應(yīng)使用約束和默認值。10.4觸發(fā)器的創(chuàng)建與使用 10.1存儲過程概述10.2存儲過程的創(chuàng)建與使用10.3觸發(fā)器概述10.4觸發(fā)器的創(chuàng)建與使用10.5事務(wù)處理10.6鎖機制10.4.1創(chuàng)建觸發(fā)器1.使用SQLServer2008管理平臺創(chuàng)建觸發(fā)器(1)打開SQLServer2008管理平臺,展開節(jié)點“對象資源管理器”→“Sales”數(shù)據(jù)庫→“表”→“employee”表,在“觸發(fā)器”節(jié)點上,單擊鼠標右鍵,在彈出的快捷菜單中選擇“新建觸發(fā)器”命令,如圖10-10所示。在SQLServer中,可以使用SQLServer2008管理平臺和Transact-SQL語句CREATETRIGGER定義表的觸發(fā)器、引發(fā)觸發(fā)器的事件以及觸發(fā)器執(zhí)行引發(fā)的操作。10.4觸發(fā)器的創(chuàng)建與使用 10.1存儲過程概述10.2存儲過程的創(chuàng)建與使用10.3觸發(fā)器概述10.4觸發(fā)器的創(chuàng)建與使用10.5事務(wù)處理10.6鎖機制10.4.1創(chuàng)建觸發(fā)器1.使用SQLServer2008管理平臺創(chuàng)建觸發(fā)器(2)在打開的SQL命令窗口中,系統(tǒng)給出了創(chuàng)建觸發(fā)器的模板,如圖10-11所示。在模板中可以輸入創(chuàng)建觸發(fā)器的Transact-SQL語句后,單擊“執(zhí)行”按鈕即可創(chuàng)建觸發(fā)器。(3)建立存儲過程的命令被成功執(zhí)行后,將該觸發(fā)器保存到相關(guān)的系統(tǒng)表中。10.4觸發(fā)器的創(chuàng)建與使用 10.1存儲過程概述10.2存儲過程的創(chuàng)建與使用10.3觸發(fā)器概述10.4觸發(fā)器的創(chuàng)建與使用10.5事務(wù)處理10.6鎖機制10.4.1創(chuàng)建觸發(fā)器2.使用CREATETRIGGER語句創(chuàng)建觸發(fā)器使用CREATETRIGGER語句創(chuàng)建觸發(fā)器以前必須考慮到以下幾個方面:(1)CREATETRIGGER語句必須是批處理的第一個語句。(2)表的所有者具有創(chuàng)建觸發(fā)器的默認權(quán)限,且不能把該權(quán)限傳給其他用戶。(3)觸發(fā)器是數(shù)據(jù)庫對象,所以其命名必須符合命名規(guī)則。(4)不能在視圖或臨時表上創(chuàng)建觸發(fā)器,而只能在基表或創(chuàng)建視圖的表上創(chuàng)建觸發(fā)器。(5)觸發(fā)器只能創(chuàng)建在當(dāng)前數(shù)據(jù)庫中,一個觸發(fā)器只能對應(yīng)一個表。10.4觸發(fā)器的創(chuàng)建與使用 10.1存儲過程概述10.2存儲過程的創(chuàng)建與使用10.3觸發(fā)器概述10.4觸發(fā)器的創(chuàng)建與使用10.5事務(wù)處理10.6鎖機制10.4.1創(chuàng)建觸發(fā)器2.使用CREATETRIGGER語句創(chuàng)建觸發(fā)器CREATETRIGGER語句的語法格式如下:CREATETRIGGERtrigger_nameON{table_name|view}[WITHENCRYPTION]{FOR|AFTER|INSTEADOF}{[INSERT][,][UPDATE][,][DELETE]}ASsql_statement[,…n]10.4觸發(fā)器的創(chuàng)建與使用 10.1存儲過程概述10.2存儲過程的創(chuàng)建與使用10.3觸發(fā)器概述10.4觸發(fā)器的創(chuàng)建與使用10.5事務(wù)處理10.6鎖機制10.4.1創(chuàng)建觸發(fā)器2.使用CREATETRIGGER語句創(chuàng)建觸發(fā)器【例10-6】在employee表上創(chuàng)建一個DELETE類型的觸發(fā)器,該觸發(fā)器的名稱為tr_employee。(1)創(chuàng)建觸發(fā)器tr_employee。CREATETRIGGERtr_employeeONemployeeFORDELETEASDECLARE@msgvarchar(50)SELECT@msg=STR(@@ROWCOUNT)+'個員工被刪除'SELECT@msgRETURN(2)執(zhí)行觸發(fā)器tr_employee。觸發(fā)器不能通過名字來執(zhí)行,而是在相應(yīng)的SQL語句被執(zhí)行時自動觸發(fā)的。例如執(zhí)行以下DELETE語句:DELETEFROMemployeeWHEREemployee_name='張三'該語句要刪除員工姓名為“張三”記錄,由此激活了表employee的DELETE類型的觸發(fā)器tr_employee,系統(tǒng)執(zhí)行tr_employee觸發(fā)器中AS之后的語句,并顯示以下信息:1個員工被刪除10.4觸發(fā)器的創(chuàng)建與使用 10.1存儲過程概述10.2存儲過程的創(chuàng)建與使用10.3觸發(fā)器概述10.4觸發(fā)器的創(chuàng)建與使用10.5事務(wù)處理10.6鎖機制10.4.1創(chuàng)建觸發(fā)器3.Deleted表和Inserted表在觸發(fā)器的執(zhí)行過程中,SQLServer2008建立和管理兩個臨時的虛擬表:Deleted表和Inserted表。這兩個表包含了在激發(fā)觸發(fā)器的操作中插入或刪除的所有記錄。可以用這一特性來測試某些數(shù)據(jù)修改的效果,以及設(shè)置觸發(fā)操作的條件。這兩個特殊表可供用戶瀏覽,但是用戶不能直接改變表中的數(shù)據(jù)。在執(zhí)行INSERT或UPDATE語句之后所有被添加或被更新的記錄都會存儲在Inserted表中。在執(zhí)行DELETE或UPDATE語句時,從觸發(fā)程序表中被刪除的行會發(fā)送到Deleted表。對于更新操作,SQLServer先將要進行修改的記錄存儲到Deleted表中,然后再將修改后的數(shù)據(jù)復(fù)制到Inserted表以及觸發(fā)程序表。10.4觸發(fā)器的創(chuàng)建與使用 10.1存儲過程概述10.2存儲過程的創(chuàng)建與使用10.3觸發(fā)器概述10.4觸發(fā)器的創(chuàng)建與使用10.5事務(wù)處理10.6鎖機制10.4.1創(chuàng)建觸發(fā)器3.Deleted表和Inserted表激活觸發(fā)程序時Deleted表和Inserted表的內(nèi)容如表10-1所示。10.4觸發(fā)器的創(chuàng)建與使用 10.1存儲過程概述10.2存儲過程的創(chuàng)建與使用10.3觸發(fā)器概述10.4觸發(fā)器的創(chuàng)建與使用10.5事務(wù)處理10.6鎖機制10.4.2修改觸發(fā)器通過SQLServer2008管理平臺、系統(tǒng)存儲過程或Transact_SQL語句,可以修改觸發(fā)器的名字和正文。1.使用sp_rename系統(tǒng)存儲過程修改觸發(fā)器的名字語法格式為:sp_renameoldname,newname其中,oldname為修改前的觸發(fā)器名,newname為修改后的觸發(fā)器名。系統(tǒng)存儲過程還可以獲得觸發(fā)器的定義信息,例如,使用系統(tǒng)存儲過程sp_helptrigger查看觸發(fā)器的類型,使用系統(tǒng)存儲過程sp_helptext查看觸發(fā)器的文本信息,使用sp_depends查看觸發(fā)器的相關(guān)性。

10.4觸發(fā)器的創(chuàng)建與使用 10.1存儲過程概述10.2存儲過程的創(chuàng)建與使用10.3觸發(fā)器概述10.4觸發(fā)器的創(chuàng)建與使用10.5事務(wù)處理10.6鎖機制2.使用SQLServer2008管理平臺修改觸發(fā)器的正文修改觸發(fā)器的操作步驟如下:(1)打開SQLServer2008管理平臺,展開節(jié)點“對象資源管理器”→“數(shù)據(jù)庫服務(wù)器”→“數(shù)據(jù)庫”→“Sales”數(shù)據(jù)庫→“表”→“customer”表→“觸發(fā)器”,選擇要刪除的觸發(fā)器(如例10-7創(chuàng)建的test_tr觸發(fā)器),單擊鼠標右鍵,在彈出的快捷菜單中選擇“修改”命令。(2)此時在右邊的編輯器窗口中出現(xiàn)觸發(fā)器的源代碼(將CREATETRIGGER改為了ALTERTRIGGER),如圖10-13所示,可以直接進行修改。修改完后單擊工具欄中的“執(zhí)行”按鈕執(zhí)行該觸發(fā)器代碼,從而達到目的。

10.4觸發(fā)器的創(chuàng)建與使用 10.1存儲過程概述10.2存儲過程的創(chuàng)建與使用10.3觸發(fā)器概述10.4觸發(fā)器的創(chuàng)建與使用10.5事務(wù)處理10.6鎖機制3.使用ALTERTRIGGER語句修改觸發(fā)器修改觸發(fā)器的語法如下:ALTERTRIGGERtrigger_nameON{table|view}[WITHENCRYPTION]{FOR|AFTER|INSTEADOF}{[DELETE][,][INSERT][,][UPDATE]}ASsql_statement[,…n]其中,參數(shù)的含義與CREATETRIGGER語句的相同。使用代碼修改觸發(fā)器通常在應(yīng)用程序中進行,包括觸發(fā)器將實現(xiàn)的功能及觸發(fā)器名稱等內(nèi)容。

10.4觸發(fā)器的創(chuàng)建與使用 10.1存儲過程概述10.2存儲過程的創(chuàng)建與使用10.3觸發(fā)器概述10.4觸發(fā)器的創(chuàng)建與使用10.5事務(wù)處理10.6鎖機制3.使用ALTERTRIGGER語句修改觸發(fā)器

例如,將例10-6的觸發(fā)器tr_employee修改為INSERT操作后進行。ALTERTRIGGERtr_employeeONemployeeFORINSERTASDECLARE@msgvarchar(50)SELECT@msg=STR(@@ROWCOUNT)+'個員工數(shù)據(jù)被插入'SELECT@msgRETURN對employee表執(zhí)行以下插入語句:INSERTemployee(employee_id,employee_name)VALUES('E016','王五')激活I(lǐng)NSERT觸發(fā)器tr_employee,顯示信息如下:1個員工數(shù)據(jù)被插入10.4觸發(fā)器的創(chuàng)建與使用 10.1存儲過程概述10.2存儲過程的創(chuàng)建與使用10.3觸發(fā)器概述10.4觸發(fā)器的創(chuàng)建與使用10.5事務(wù)處理10.6鎖機制10.4.3刪除觸發(fā)器用戶在使用觸發(fā)器后可以將其刪除,但只有觸發(fā)器所有者才有權(quán)刪除觸發(fā)器??梢酝ㄟ^刪除觸發(fā)器或刪除觸發(fā)器表來刪除觸發(fā)器。刪除表時,也將刪除所有與表關(guān)聯(lián)的觸發(fā)器。刪除觸發(fā)器時,將從sysobjects和syscomments系統(tǒng)表中刪除有關(guān)觸發(fā)器的信息。1.使用SQLServer2008管理平臺刪除觸發(fā)器操作步驟如下:(1)打開SQLServer2008管理平臺,展開節(jié)點“對象資源管理器”→“數(shù)據(jù)庫服務(wù)器”→“數(shù)據(jù)庫”→“Sales”數(shù)據(jù)庫→“表”→“customer”表→“觸發(fā)器”,選擇要刪除的觸發(fā)器(如例10-7創(chuàng)建的test_tr觸發(fā)器),單擊鼠標右鍵,在彈出的快捷菜單中選擇“刪除”命令。(2)在彈出的“刪除對象”對話框中單擊“確定”按鈕即可刪除觸發(fā)器。10.4觸發(fā)器的創(chuàng)建與使用 10.1存儲過程概述10.2存儲過程的創(chuàng)建與使用10.3觸發(fā)器概述10.4觸發(fā)器的創(chuàng)建與使用10.5事務(wù)處理10.6鎖機制10.4.3刪除觸發(fā)器2.使用DROPTRIGGER語句刪除指定觸發(fā)器刪除觸發(fā)器語句的語法格式如下:DROPTRIGGERtrigger_name[,…n]使用代碼刪除觸發(fā)器通常在應(yīng)用程序中進行,適合于動態(tài)刪除臨時創(chuàng)建的觸發(fā)器。例如,刪除例10-6的觸發(fā)器tr_employee,可以使用以下代碼:DROPTRIGGERtr_employee刪除觸發(fā)器所在的表時,SQLServer2008將自動刪除與該表相關(guān)的觸發(fā)器。10.5事務(wù)處理 10.1存儲過程概述10.2存儲過程的創(chuàng)建與使用10.3觸發(fā)器概述10.4觸發(fā)器的創(chuàng)建與使用10.5事務(wù)處理10.6鎖機制事務(wù)(transaction)是SQLServer2008中的一個邏輯工作單元,該單元將被作為一個整體進行處理。事務(wù)保證連續(xù)多個操作必須全部執(zhí)行成功,否則必須立即回復(fù)到未執(zhí)行任何操作的狀態(tài),即執(zhí)行事務(wù)的結(jié)果要么全部將數(shù)據(jù)所要執(zhí)行的操作完成,要么全部數(shù)據(jù)都不修改。10.5.1事務(wù)概述1.事務(wù)的由來在SQLServer中,使用DELETE或UPDATE語句對數(shù)據(jù)庫進行更新時一次只能操作一個表,這會帶來數(shù)據(jù)庫的數(shù)據(jù)不一致的問題。例如,企業(yè)取消了倉儲部,需要將“倉儲部”從department表中刪除,而employee表中的部門編號與倉儲部相對應(yīng)的員工也應(yīng)刪除。因此,兩個表都需要修改,這種修改只能通過兩條DELETE語句進行。10.5事務(wù)處理 10.1存儲過程概述10.2存儲過程的創(chuàng)建與使用10.3觸發(fā)器概述10.4觸發(fā)器的創(chuàng)建與使用10.5事務(wù)處理10.6鎖機制10.5.1事務(wù)概述1.事務(wù)的由來假設(shè)倉儲部編號為D004,第一條DELETE語句修改department表為:DELETEFROMdepartmentWHEREdepartment_id='D004'第二條DELETE語句修改employee表為:DELETEFROMemployeeWHEREdepartment_id='D004'在執(zhí)行第一條DELETE語句后,數(shù)據(jù)庫中的數(shù)據(jù)已處于不一致的狀態(tài),因為此時已經(jīng)沒有“倉儲部”了,但employee表中仍然保存著屬于倉儲部的員工記錄。只有執(zhí)行了第二條DELETE語句后數(shù)據(jù)才重新處于一致狀態(tài)。如果執(zhí)行完第一條語句后,計算機突然出現(xiàn)故障,無法再繼續(xù)執(zhí)行第二條DELETE語句,則數(shù)據(jù)庫中的數(shù)據(jù)將處于永遠不一致的狀態(tài)。因此,必須保證這兩條DELETE語句都被執(zhí)行,或都不執(zhí)行。這時可以使用數(shù)據(jù)庫中的事務(wù)技術(shù)來實現(xiàn)。10.5事務(wù)處理 10.1存儲過程概述10.2存儲過程的創(chuàng)建與使用10.3觸發(fā)器概述10.4觸發(fā)器的創(chuàng)建與使用10.5事務(wù)處理10.6鎖機制10.5.1事務(wù)概述2.事務(wù)屬性事務(wù)是指用戶定義的一個數(shù)據(jù)庫操作序列,這些操作要么全部執(zhí)行要么全不執(zhí)行。由于事務(wù)作為一個不可分割的邏輯工作單元,當(dāng)事務(wù)執(zhí)行遇到錯誤時,將取消事務(wù)所做的修改。一個邏輯單元必須具有4個屬性:原子性(atomicity)、一致性(consistency)、隔離性(isolation)、持久性(durability),這些屬性稱為ACID。10.5事務(wù)處理 10.1存儲過程概述10.2存儲過程的創(chuàng)建與使用10.3觸發(fā)器概述10.4觸發(fā)器的創(chuàng)建與使用10.5事務(wù)處理10.6鎖機制10.5.1事務(wù)概述3.事務(wù)模式SQLServer以3種事務(wù)模式管理事務(wù):(1)自動提交事務(wù)模式。每條單獨的語句都是一個事務(wù)。在此模式下,每條Transact-SQL語句在成功執(zhí)行完成后,都被自動提交,如果遇到錯誤,則自動回滾該語句。該模式為系統(tǒng)默認的事務(wù)管理模式。(2)顯式事務(wù)模式。該模式允許用戶定義事務(wù)的啟動和結(jié)束。事務(wù)以BEGINTRANSACTION語句顯式開始,以COMMIT或ROLLBACK語句顯式結(jié)束。(3)隱性事務(wù)模式。在當(dāng)前事務(wù)完成提交或回滾后,新事務(wù)自動啟動。隱性事務(wù)不需要使用BEGINTRANSACTION語句標識事務(wù)的開始,但需要以COMMIT或ROLLBACK語句來提交或回滾事務(wù)。10.5事務(wù)處理 10.1存儲過程概述10.2存儲過程的創(chuàng)建與使用10.3觸發(fā)器概述10.4觸發(fā)器的創(chuàng)建與使用10.5事務(wù)處理10.6鎖機制10.5.2事務(wù)管理SQLServer按事務(wù)模式進行事務(wù)管理,設(shè)置事務(wù)啟動和結(jié)束的時間,正確處理事務(wù)結(jié)束之前產(chǎn)生的錯誤。1.啟動和結(jié)束事務(wù)在應(yīng)用程序中,通常用BEGINTRANSACTION語句來標識一個事務(wù)的開始,用COMMITTRANSACTION語句標識事務(wù)結(jié)束。啟動事務(wù)語句的語法格式如下:BEGINTRAN[SACTION][transaction_name|@tran_name_variable[WITHMARK['description']]]結(jié)束事務(wù)語句的語法格式如下:COMMIT[TRAN[SACTION][transaction_name|@tran_name_variable]]10.5事務(wù)處理 10.1存儲過程概述10.2存儲過程的創(chuàng)建與使用10.3觸發(fā)器概述10.4觸發(fā)器的創(chuàng)建與使用10.5事務(wù)處理10.6鎖機制10.5.2事務(wù)管理1.啟動和結(jié)束事務(wù)【例10-8】建立一個顯式事務(wù)以顯示Sales數(shù)據(jù)庫的employee表的數(shù)據(jù)。

BEGINTRANSACTIONSELECT*FROMemployeeCOMMITTRANSACTION本例創(chuàng)建的事務(wù)以BEGINTRANSACTION語句開始,以COMMITTRANSACTION語句結(jié)束。10.5事務(wù)處理 10.1存儲過程概述10.2存儲過程的創(chuàng)建與使用10.3觸發(fā)器概述10.4觸發(fā)器的創(chuàng)建與使用10.5事務(wù)處理10.6鎖機制10.5.2事務(wù)管理1.啟動和結(jié)束事務(wù)【例10-9】建立建立一個顯式命名事務(wù)以刪除department表的“倉儲部”記錄行。DECLARE@transaction_namevarchar(32)SELECT@transaction_name='tran_delete'BEGINTRANSACTION@transaction_nameDELETEFROMdepartmentWHEREdepartment_id='D004'DELETEFROMemployeeWHEREdepartment_id='D004'COMMITTRANSACTIONtran_delete本例命名了一個事務(wù)tran_delete,該事務(wù)用于刪除department表的“倉儲部”記錄行及相關(guān)數(shù)據(jù)。在BEGINTRANSACTION和COMMITTRANSACTION語句之間的所有語句被作為一個整體,只有執(zhí)行到COMMITTRANSACTION語句時,事務(wù)中對數(shù)據(jù)庫的更新操作才算確認。10.5事務(wù)處理 10.1存儲過程概述10.2存儲過程的創(chuàng)建與使用10.3觸發(fā)器概述10.4觸發(fā)器的創(chuàng)建與使用10.5事務(wù)處理10.6鎖機制10.5.2事務(wù)管理2.事務(wù)回滾當(dāng)事務(wù)執(zhí)行過程中遇到錯誤時,該事務(wù)修改的所有數(shù)據(jù)都恢復(fù)到事務(wù)開始時的狀態(tài)或某個指定位置,事務(wù)占用的資源將被釋放。這個操作過程叫事務(wù)回滾。事務(wù)回滾使用ROLLBACKTRANSACTION語句實現(xiàn),其語法格式如下:ROLLBACK[TRAN[SACTION][transaction_name|@tran_name_variable|savepoint_name|@savepoint_variable]]10.5事務(wù)處理 10.1存儲過程概述10.2存儲過程的創(chuàng)建與使用10.3觸發(fā)器概述10.4觸發(fā)器的創(chuàng)建與使用10.5事務(wù)處理10.6鎖機制10.5.2事務(wù)管理2.事務(wù)回滾【例10-11】使用ROLLBACKTRANSACTION語句標識事務(wù)結(jié)束。BEGINTRANSACTIONUPDATEgoodsSETstock_quantity=stock_quantity-5WHEREgoods_id='G00006'INSERTINTOsell_order(order_id1,goods_id,order_num,order_date)VALUES('S00005','G00006',5,getdate())ROLLBACKTRANSACTION本例建立的事務(wù)對goods表和sell_order表進行更新和插入操作。但當(dāng)服務(wù)器遇到ROLLBACKTRANSACTION語句時,就會拋棄事務(wù)處理中的所有變化,把數(shù)據(jù)恢復(fù)到開始工作之前的狀態(tài)。因此事務(wù)結(jié)束后,goods表和sell_order表都不會改變。10.5事務(wù)處理 10.1存儲過程概述10.2存儲過程的創(chuàng)建與使用10.3觸發(fā)器概述10.4觸發(fā)器的創(chuàng)建與使用10.5事務(wù)處理10.6鎖機制10.5.2事務(wù)管理3.事務(wù)嵌套和BEGIN…END語句類似,BEGINTRANSACTION和COMMITTRANSACTION語句也可以進行嵌套,即事務(wù)可以嵌套執(zhí)行。10.5事務(wù)處理 10.1存儲過程概述10.2存儲過程的創(chuàng)建與使用10.3觸發(fā)器概述10.4觸發(fā)器的創(chuàng)建與使用10.5事務(wù)處理10.6鎖機制3.事務(wù)嵌套【例10-14】提交事務(wù)。CREATETABLEemployee_tran(numchar(2)NOTNULL,cnamechar(6)NOTNULL)GOBEGINTRANSACTIONTran1--@@TRANCOUNT為1INSERTINTOemployee_tranVALUES('01','Zhang')BEGINTRANSACTIONTran2--@@TRANCOUNT為2INSERTINTOemployee_tranVALUES('02','Wang')BEGINTRANSACTIONTran3--@@TRANCOUNT為3PRINT@@TRANCOUNTINSERTINTOemployee_tranVALUES('03','Li')COMMITTRANSACTIONTran3--@@TRANCOUNT為2PRINT@@TRANCOUNTCOMMITTRANSACTIONTran2--@@TRANCOUNT為1PRINT@@TRANCOUNTCOMMITTRANSACTIONTran1--@@TRANCOUNT為0PRINT@@TRANCOUNT運行結(jié)果如下:321010.6SQLServer 的鎖機制10.1存儲過程概述10.2存儲過程的創(chuàng)建與使用10.3觸發(fā)器概述10.4觸發(fā)器的創(chuàng)建與使用10.5事務(wù)處理10.6鎖機制鎖(lock)作為一種安全機制,用于控制多個用戶的并發(fā)操作,以防止用戶讀取正在由其他用戶更改的數(shù)據(jù)或者多個用戶同時修改同一數(shù)據(jù),從而確保事務(wù)完整性和數(shù)據(jù)庫一致性。雖然SQLServer會自動強制執(zhí)行鎖,但是用戶可以通過對鎖進行了解并在應(yīng)用程序中自定義鎖來設(shè)計出更有效率的應(yīng)用程序。10.6SQLServer 的鎖機制10.1存儲過程概述10.2存儲過程的創(chuàng)建與使用10.3觸發(fā)器概述10.4觸發(fā)器的創(chuàng)建與使用10.5事務(wù)處理10.6鎖機制10.6.1鎖模式SQLServer2008使用不同的鎖模式鎖定資源,這些鎖模式確定了并發(fā)事務(wù)訪問資源的方式。(1)共享鎖(SharedLock)。共享鎖鎖定的資源可以被其他用戶讀取,但其他用戶不能修改它(只讀操作)。例如在SELECT語句執(zhí)行時,SQLServer通常會對對象進行共享鎖鎖定。通常加共享鎖的數(shù)據(jù)頁被讀取完畢后,共享鎖就會立即被釋放。(2)排他鎖(ExclusiveLock)。排他鎖鎖定的資源只允許進行鎖定操作的程序使用,其他任何對它的操作均不會被接受。例如執(zhí)行數(shù)據(jù)更新語句(INSERT、UPDATE或DELETE)時,SQLServer會自動使用排他鎖,確保不會同時對同一資源進行多重更新。當(dāng)對象上有其他鎖存在時,無法對其加排他鎖。排他鎖一直到事務(wù)結(jié)束才能被釋放。(3)更新鎖(UpdateLock)。更新鎖用于可更新的資源中,是為了防止死鎖而設(shè)立的。10.6SQLServer 的鎖機制10.1存儲過程概述10.2存儲過程的創(chuàng)建與使用10.3觸發(fā)器概述10.4觸發(fā)器的創(chuàng)建與使用10.5事務(wù)處理10.6鎖機制10.6.1鎖模式從程序員的角度,鎖可以分為以下兩種類型。(1)樂觀鎖(OptimisticLock)。樂觀鎖假定在處理數(shù)據(jù)時,不需要在應(yīng)用程序的代碼中做任何事情就可以直接在記錄上加鎖,即完全依靠數(shù)據(jù)庫來管理鎖的工作。一般情況下,當(dāng)執(zhí)行事務(wù)處理時,SQLServer會自動對事務(wù)處理范圍內(nèi)更新到的表做鎖定。(2)悲觀鎖(PessimisticLock)。悲觀鎖需要程序員直接管理數(shù)據(jù)或?qū)ο笊系募渔i處理,并負責(zé)獲取、共享和放棄正在使用的數(shù)據(jù)上的任何鎖。10.6SQLServer 的鎖機制10.1存儲過程概述10.2存儲過程的創(chuàng)建與使用10.3觸發(fā)器概述10.4觸發(fā)器的創(chuàng)建與使用10.5事務(wù)處理10.6鎖機制10.6.2隔離級別事務(wù)準備接受不一致數(shù)據(jù)的級別稱為隔離級別(IsolationLevel)。隔離級別是一個事務(wù)必須與其他事務(wù)進行隔離的程度。較低的隔離級別可以增加并發(fā),但代價是降低數(shù)據(jù)的正確性。相反,較高的隔離級別可以確保數(shù)據(jù)的正確性,但可能對并發(fā)產(chǎn)生負面影響。應(yīng)用程序要求的隔離級別確定了SQLServer使用的鎖定行為。10.6SQLServer 的鎖機制10.1存儲過程概述10.2存儲過程的創(chuàng)建與使用10.3觸發(fā)器概述10.4觸發(fā)器的創(chuàng)建與使用10.5事務(wù)處理10.6鎖機制10.6.2隔離級別在SQLServer支持以下4種隔離級別:(1)提交讀(ReadCommitted)。它是SQLServer的默認級別。在此隔離級別下,SELECT語句不會也不能返回尚未提交(committed)的即臟數(shù)據(jù)。(2)未提交讀(ReadUncommitted)。與提交讀隔離級別相反,它允許讀取臟數(shù)據(jù),即已經(jīng)被其他用戶修改但尚未提交的數(shù)據(jù)。它是最低的事務(wù)隔離級別,僅可保證不讀取物理損壞的數(shù)據(jù)。(3)可重復(fù)讀(R

溫馨提示

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

評論

0/150

提交評論