單元七觸發(fā)器_第1頁(yè)
單元七觸發(fā)器_第2頁(yè)
單元七觸發(fā)器_第3頁(yè)
單元七觸發(fā)器_第4頁(yè)
單元七觸發(fā)器_第5頁(yè)
已閱讀5頁(yè),還剩30頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

單元七創(chuàng)建及應(yīng)用觸發(fā)器

觸發(fā)器是SQLServer數(shù)據(jù)庫(kù)應(yīng)用中一個(gè)重要工具,是一種自動(dòng)執(zhí)行的特殊類(lèi)型的存儲(chǔ)過(guò)程,應(yīng)用非常廣泛,尤其是在數(shù)據(jù)的安全管理及保持?jǐn)?shù)據(jù)的完整性方面。教學(xué)要求:通過(guò)本單元學(xué)習(xí),讀者應(yīng)掌握以下內(nèi)容: 觸發(fā)器的作用 觸發(fā)器的創(chuàng)建、修改和刪除 觸發(fā)器的靈活運(yùn)用單元七創(chuàng)建及應(yīng)用觸發(fā)器任務(wù)1:認(rèn)知觸發(fā)器任務(wù)2:創(chuàng)建和應(yīng)用DML觸發(fā)器任務(wù)3:觸發(fā)器的管理與維護(hù)任務(wù)4:DDL觸發(fā)器及其應(yīng)用小結(jié)任務(wù)1認(rèn)知觸發(fā)器單元七創(chuàng)建及應(yīng)用觸發(fā)器

一、基本概念

觸發(fā)器是這樣一種機(jī)制:當(dāng)一個(gè)特定的動(dòng)作發(fā)生在一個(gè)特定的數(shù)據(jù)庫(kù)或表上時(shí),某個(gè)觸發(fā)器被激活。觸發(fā)器屬于一種特殊的存儲(chǔ)過(guò)程,可以在其中包含復(fù)雜的SQL語(yǔ)句。觸發(fā)器與存儲(chǔ)過(guò)程的區(qū)別在于觸發(fā)器不允許使用參數(shù),也不能被直接調(diào)用,只能由系統(tǒng)自動(dòng)激活。當(dāng)數(shù)據(jù)庫(kù)或表上發(fā)生了CREATE、ALTER、DROP、INSERT、UPDATE或DELETE操作時(shí),如果該數(shù)據(jù)庫(kù)或表有對(duì)應(yīng)的觸發(fā)器,這個(gè)觸發(fā)器就會(huì)自動(dòng)激活執(zhí)行。單元七創(chuàng)建及應(yīng)用觸發(fā)器任務(wù)1認(rèn)知觸發(fā)器二、觸發(fā)器的功能:⑴完成更復(fù)雜的數(shù)據(jù)約束;⑵檢查SQL所做的操作是否允許;⑶修改其他數(shù)據(jù)表里的數(shù)據(jù);⑷調(diào)用更多的存儲(chǔ)過(guò)程;⑸返回自定義的錯(cuò)誤信息;⑹更改原本要操作的SQL語(yǔ)句;⑺防止數(shù)據(jù)表結(jié)構(gòu)更改或數(shù)據(jù)表被刪除。單元七創(chuàng)建及應(yīng)用觸發(fā)器在SQLServer2005中,根據(jù)激活觸發(fā)器執(zhí)行的T-SQL語(yǔ)句類(lèi)型,可以把觸發(fā)器分為兩類(lèi):1.DML觸發(fā)器DML觸發(fā)器是當(dāng)數(shù)據(jù)庫(kù)服務(wù)器中發(fā)生數(shù)據(jù)操縱語(yǔ)言DML事件時(shí)執(zhí)行的特殊存儲(chǔ)過(guò)程,如INSERT、UPDATE等。DML觸發(fā)器又可以進(jìn)一步劃分為三種類(lèi)別:INSERT觸發(fā)器、DELETE觸發(fā)器、UPDATE觸發(fā)器。這三種觸發(fā)器分別在發(fā)生數(shù)據(jù)的添加、刪除、修改行為時(shí)自動(dòng)執(zhí)行。2.DDL觸發(fā)器DDL觸發(fā)器是當(dāng)數(shù)據(jù)庫(kù)服務(wù)器中發(fā)生數(shù)據(jù)定義語(yǔ)言DDL事件時(shí)執(zhí)行的特殊存儲(chǔ)過(guò)程,如CREATE、ALTER等。DDL觸發(fā)器一般用于執(zhí)行數(shù)據(jù)庫(kù)中的管理任務(wù),如審核和規(guī)范數(shù)據(jù)庫(kù)操作,防止數(shù)據(jù)庫(kù)表結(jié)構(gòu)被修改等。三、觸發(fā)器的類(lèi)型任務(wù)1認(rèn)知觸發(fā)器單元七創(chuàng)建及應(yīng)用觸發(fā)器任務(wù)2創(chuàng)建和應(yīng)用DML觸發(fā)器一、DML觸發(fā)器的類(lèi)型

在SQLServer2005中,根據(jù)觸發(fā)器觸發(fā)的時(shí)機(jī)可以把DML觸發(fā)器劃分為兩種類(lèi)型。

1.AFTER觸發(fā)器這類(lèi)觸發(fā)器是在記錄已經(jīng)改變之后,才會(huì)被激活執(zhí)行,它主要是用于記錄變更后的處理或檢查,一旦發(fā)現(xiàn)錯(cuò)誤,也可以用ROLLBACKTRANSACTION語(yǔ)句來(lái)回滾本次的操作。

2.INSTEADOF觸發(fā)器這類(lèi)觸發(fā)器一般是用來(lái)取代原本要進(jìn)行的操作,在記錄變更之前發(fā)生的,它并不去執(zhí)行原來(lái)的SQL語(yǔ)句里的操作,而是去執(zhí)行觸發(fā)器本身所定義的操作。單元七創(chuàng)建及應(yīng)用觸發(fā)器二、DML觸發(fā)器的工作原理

在SQLServer2005中,為每個(gè)DML觸發(fā)器定義了兩個(gè)特殊的表,一個(gè)是Inserted表,一個(gè)是Deleted表。這兩個(gè)表建立在數(shù)據(jù)庫(kù)服務(wù)器的內(nèi)存中,是由系統(tǒng)管理的邏輯表,而不是真正存儲(chǔ)在數(shù)據(jù)庫(kù)中的物理表。對(duì)于這兩個(gè)表,用戶(hù)只有讀取的權(quán)限,沒(méi)有修改的權(quán)限。

這兩個(gè)表的結(jié)構(gòu)與觸發(fā)器所在數(shù)據(jù)表的結(jié)構(gòu)是完全一致的。當(dāng)觸發(fā)器的工作完成之后,這兩個(gè)表也將從內(nèi)存中刪除。●Inserted表里存放的是更新前的記錄:對(duì)于插入記錄操作來(lái)說(shuō),Inserted表里存儲(chǔ)的是要插入的數(shù)據(jù);對(duì)于更新記錄的操作來(lái)說(shuō),Inserted表里存放的是要更新的記錄。

●Deleted表里存放的是更新后的記錄:對(duì)于更新記錄操作來(lái)說(shuō),Deleted表里存放的是更新前的記錄;對(duì)于刪除記錄操作來(lái)說(shuō),Deleted表里存儲(chǔ)的是被刪除的舊記錄。任務(wù)2創(chuàng)建和應(yīng)用DML觸發(fā)器單元七創(chuàng)建及應(yīng)用觸發(fā)器任務(wù)2創(chuàng)建和應(yīng)用DML觸發(fā)器1.AFTER觸發(fā)器的工作機(jī)制AFTER觸發(fā)器是在數(shù)據(jù)記錄變更之后才被激活執(zhí)行的。以刪除數(shù)據(jù)記錄為例,當(dāng)SQLServer2005數(shù)據(jù)庫(kù)服務(wù)器接收到一個(gè)要執(zhí)行刪除操作的SQL語(yǔ)句時(shí),SQLServer首先將要?jiǎng)h除的數(shù)據(jù)記錄存放在Deleted表里,然后把數(shù)據(jù)表里的數(shù)據(jù)記錄刪除,再激活觸發(fā)器,執(zhí)行AFTER觸發(fā)器里的SQL語(yǔ)句;執(zhí)行完畢后,刪除內(nèi)存中的Deleted表,退出操作。2.INSTEADOF觸發(fā)器的工作機(jī)制INSTEADOF觸發(fā)器是在相應(yīng)的操作之前就激活執(zhí)行,并且不再去執(zhí)行原來(lái)的SQL語(yǔ)句,而去運(yùn)行INSTEADOF觸發(fā)器本身所定義的SQL語(yǔ)句。創(chuàng)建觸發(fā)器語(yǔ)法如下:CREATETRIGGER觸發(fā)器名ON{表|視圖}[WITHENCRYPTION]{FOR|AFTER|INSTEADOF}{[INSERT][,][UPDATE][,][DELETE]}[NOTFORREPLICATION]AS[{IFUPDATE(列名)[{AND|OR}UPDATE(列名)][…n]}]SQL語(yǔ)句單元七創(chuàng)建及應(yīng)用觸發(fā)器任務(wù)2創(chuàng)建和應(yīng)用DML觸發(fā)器單元七創(chuàng)建及應(yīng)用觸發(fā)器任務(wù)2創(chuàng)建和應(yīng)用DML觸發(fā)器●WITHENCRYPTION。加密CREATETRIGGER語(yǔ)句文本的條目?!馞OR|AFTER。FOR與AFTER同義,指定觸發(fā)器只有在觸發(fā)器SQL語(yǔ)句中指定的所有操作都已成功后才激發(fā)。所有的引用級(jí)聯(lián)操作和約束檢查也必須成功完成后,才能執(zhí)行此觸發(fā)器,即為后觸發(fā)?!馡NSTEADOF。指定執(zhí)行觸發(fā)器而不執(zhí)行造成觸發(fā)的SQL語(yǔ)句,從而替代造成觸發(fā)的語(yǔ)句。在表或視圖上,每個(gè)INSERT、UPDATE或DELETE語(yǔ)句只能定義一個(gè)INSTEADOF觸發(fā)器,即替代觸發(fā)?!馵INSERT][,][UPDATE][,][DELETE]。是指定在表上執(zhí)行哪些數(shù)據(jù)修改語(yǔ)句時(shí)將激活觸發(fā)器的關(guān)鍵字。必須至少指定一個(gè)選項(xiàng)。在觸發(fā)器定義中允許使用任意順序組合的這些關(guān)鍵字。當(dāng)進(jìn)行觸發(fā)條件的操作時(shí)(INSERT、UPDATE或DELETE),將執(zhí)行SQL語(yǔ)句中指定的觸發(fā)器操作。單元七創(chuàng)建及應(yīng)用觸發(fā)器●NOTFORREPLICATION。表示當(dāng)復(fù)制進(jìn)程更改觸發(fā)器所涉及的表時(shí),不要執(zhí)行該觸發(fā)器?!馡FUPDATE(列名)。測(cè)試在指定的列上進(jìn)行的INSERT或UPDATE操作,不能用于DELETE操作,可以指定多列。因?yàn)橐呀?jīng)在ON子句中指定了表名,所以在IFUPDATE子句中的列名前不要包含表名。若要測(cè)試在多個(gè)列上進(jìn)行的INSERT或UPDATE操作,要分別單獨(dú)地指定UPDATE(列名)子句。在INSERT操作中IFUPDATE將返回TRUE值。任務(wù)2創(chuàng)建和應(yīng)用DML觸發(fā)器提示:創(chuàng)建觸發(fā)器時(shí)使用FOR或AFTER關(guān)鍵字,創(chuàng)建的是后觸發(fā),即當(dāng)引起觸發(fā)器執(zhí)行的修改語(yǔ)句完成后,并通過(guò)了各種約束檢查后,才執(zhí)行觸發(fā)器中的語(yǔ)句。后觸發(fā)只建立在表上,不能建立在視圖上。創(chuàng)建觸發(fā)器時(shí)使用INSTEADOF關(guān)鍵字,創(chuàng)建的是替代觸發(fā)。這里需要指出的是,由于TRUNCATETABLE語(yǔ)句的操作不被記錄到事務(wù)日志,所以它不會(huì)激活DELETE觸發(fā)器。單元七創(chuàng)建及應(yīng)用觸發(fā)器任務(wù)2創(chuàng)建和應(yīng)用DML觸發(fā)器三、創(chuàng)建DML觸發(fā)器的注意事項(xiàng)(1)CREATETRIGGER語(yǔ)句必須是批處理中的第一個(gè)語(yǔ)句,該語(yǔ)句后面的所有語(yǔ)句都被解釋為CREATETRIGGER語(yǔ)句定義的一部分。(2)創(chuàng)建DML觸發(fā)器的權(quán)限默認(rèn)分配給表的所有者,且不能將該權(quán)限轉(zhuǎn)授給其他用戶(hù)。(3)DML可以引用當(dāng)前數(shù)據(jù)庫(kù)以外的對(duì)象,但只能在當(dāng)前數(shù)據(jù)庫(kù)中創(chuàng)建DML觸發(fā)器。(4)不能對(duì)系統(tǒng)表或臨時(shí)表創(chuàng)建DML觸發(fā)器(5)對(duì)于含有DELETE或UPDATE操作定義的外鍵表,不能定義INSTEADOF觸發(fā)器。單元七創(chuàng)建及應(yīng)用觸發(fā)器四、創(chuàng)建觸發(fā)器1.創(chuàng)建INSERT觸發(fā)器【例7.1】在數(shù)據(jù)庫(kù)XSGL中創(chuàng)建一觸發(fā)器,當(dāng)向CJ表插入一記錄時(shí),檢查該記錄的學(xué)號(hào)在xs表中是否存在,檢查課程號(hào)在kc表中是否存在,若有一項(xiàng)為否,則不允許插入。CREATETRIGGERcheck_trigONCJFORINSERTASIFEXISTS(SELECT*FROMINSERTEDaWHEREa.學(xué)號(hào)NOTIN(SELECTb.學(xué)號(hào)FROMxsb)ORa.課程號(hào)NOTIN(SELECTc.課程號(hào)FROMkcc))BEGINRAISERROR('違背數(shù)據(jù)的一致性',16,1)ROLLBACKTRANSACTIONENDGO任務(wù)2創(chuàng)建和應(yīng)用DML觸發(fā)器單元七創(chuàng)建及應(yīng)用觸發(fā)器2.創(chuàng)建UPDATE觸發(fā)器【例7.2】在XSGL數(shù)據(jù)庫(kù)的CJ表上創(chuàng)建一觸發(fā)器,若對(duì)學(xué)號(hào)列和課程號(hào)列修改,則給出提示信息,并取消修改操作。CREATETRIGGERupdate_trigONCJFORupdateASIFUPDATE(學(xué)號(hào))ORUPDATE(課程號(hào))BEGINRAISERROR('學(xué)號(hào)或課程號(hào)不能進(jìn)行修改!',7,2)ROLLBACKTRANSACTIONENDGO任務(wù)2創(chuàng)建和應(yīng)用DML觸發(fā)器單元七創(chuàng)建及應(yīng)用觸發(fā)器任務(wù)2創(chuàng)建和應(yīng)用DML觸發(fā)器3.創(chuàng)建DELETE觸發(fā)器【例7.3】當(dāng)從xs表中刪除一個(gè)學(xué)生的記錄時(shí),相應(yīng)的應(yīng)從CJ表中刪除該學(xué)生對(duì)應(yīng)的所有記錄。CREATETRIGGERdelete_trigONxsAFTERDELETEASDELETEFROMCJWHERE學(xué)號(hào)=(SELECT學(xué)號(hào)FROMDELETED)GO單元七創(chuàng)建及應(yīng)用觸發(fā)器4.創(chuàng)建INSTEADOF觸發(fā)器如果視圖的數(shù)據(jù)來(lái)自于多個(gè)基表,則必須使用INSTAEDOF觸發(fā)器支持引用表中的數(shù)據(jù)的插入、更新和刪除操作。例如,若在一個(gè)多表視圖上定義了INSTAEDOF觸發(fā)器,視圖各列的值可能允許為空,也可能不為空,若視圖某列的值不允許為空,則INSERT語(yǔ)句為該列提供相應(yīng)的值。如果視圖的列為以下幾種情況之一:基表中的計(jì)算列基表中的標(biāo)識(shí)列具有timestamp數(shù)據(jù)類(lèi)型的基表列該視圖的INSERT語(yǔ)句必須為這些列指定值,INSTEADOF觸發(fā)器在構(gòu)成將值插入基表的INSERT語(yǔ)句時(shí),會(huì)忽略指定的值。下面通過(guò)一個(gè)例子說(shuō)明。任務(wù)2創(chuàng)建和應(yīng)用DML觸發(fā)器單元七創(chuàng)建及應(yīng)用觸發(fā)器USEXSGLGO--創(chuàng)建一個(gè)計(jì)算列的數(shù)據(jù)表booksCREATETABLEbooks(BookKeyINTIDENTITY(1,1),BookNamenvarchar(10)NOTNULL,Colornvarchar(10)NOTNULL,ComputedColAS(BookName+Color),Pageint)GO--建立一個(gè)視圖book_view,包含基表的所有列CREATEVIEWbook_viewASSELECTBookKey,BookName,Color,ComputedCol,PageFROMbooks任務(wù)2創(chuàng)建和應(yīng)用DML觸發(fā)器單元七創(chuàng)建及應(yīng)用觸發(fā)器--在視圖book_view建立一個(gè)INSTEADOF觸發(fā)器instead_insCREATETRIGGERinstead_insONbook_viewINSTEADOFINSERTASBEGININSERTINTObooksSELECTBookName,Color,PageFROMINSERTEDENDGO任務(wù)2創(chuàng)建和應(yīng)用DML觸發(fā)器單元七創(chuàng)建及應(yīng)用觸發(fā)器任務(wù)2創(chuàng)建和應(yīng)用DML觸發(fā)器由于其中的BookKey為標(biāo)識(shí)列,ComputedCol為計(jì)算列,所以在實(shí)際插入時(shí),INSERT語(yǔ)句中不包含這兩個(gè)列的值。直接引用books表中的INSERT語(yǔ)句不能為BookKey字段和ComputedCol字段提供值。向表books插入數(shù)據(jù)的正確語(yǔ)句如下:INSERTINTObooks(BookName,Color,Page)VALUES(‘?dāng)?shù)據(jù)庫(kù)技術(shù)’,’紅色’,200)向表books插入數(shù)據(jù)的不正確語(yǔ)句如下:INSERTINTObooks(BookName,Color,Page)VALUES(3,‘?dāng)?shù)據(jù)庫(kù)技術(shù)’,’紅色’,’綠色’,200)而對(duì)于引用book_view視圖的INSERT語(yǔ)句為每列都指定值,具體如下:INSERTINTObook_view(BookKey,BookName,Color,ComputedCol,Page)VALUES(3,‘?dāng)?shù)據(jù)庫(kù)技術(shù)’,’紅色’,’綠色’,200)單元七創(chuàng)建及應(yīng)用觸發(fā)器任務(wù)2創(chuàng)建和應(yīng)用DML觸發(fā)器在執(zhí)行視圖的插入語(yǔ)句時(shí),雖然將BookKey和ComputedCol字段的值傳遞到了book_view觸發(fā)器,但觸發(fā)器中的INSERT語(yǔ)句沒(méi)有選擇INSERTED表的BookKey和ComputedCol列的值,因此也就不會(huì)出現(xiàn)錯(cuò)誤。用戶(hù)也可以使用圖形界面的方式建立觸發(fā)器,如圖5-5所示,但是同樣是采用SQL腳本編輯的方式,其方法類(lèi)似于建立存儲(chǔ)過(guò)程,請(qǐng)讀者自學(xué)完成。返回單元七創(chuàng)建及應(yīng)用觸發(fā)器任務(wù)3觸發(fā)器的管理與維護(hù)

觸發(fā)器建立后,如果希望了解觸發(fā)器的定義信息則需要查看其定義信息。有時(shí)要根據(jù)需要修改和刪除觸發(fā)器,或者在必要的時(shí)候禁止或啟用觸發(fā)器等,這些就是對(duì)觸發(fā)器的管理與維護(hù)工作。一、查看觸發(fā)器的定義信息

在SQLServerManagementStudio的“對(duì)象資源管理器”中,可以對(duì)觸發(fā)器進(jìn)行管理和維護(hù),其大致步驟如下:⑴在SQLServerManagementStudio的“對(duì)象資源管理器”中,依次展開(kāi)服務(wù)器節(jié)點(diǎn),到“數(shù)據(jù)庫(kù)”,例如展開(kāi)XSGL數(shù)據(jù)庫(kù),展開(kāi)表結(jié)點(diǎn),再展開(kāi)指定的表,如XS表。⑵在XS表中出現(xiàn)了“觸發(fā)器”節(jié)點(diǎn),展開(kāi)要進(jìn)行操作的觸發(fā)器,右擊,則彈出關(guān)于觸發(fā)器操作的各個(gè)菜單項(xiàng)。⑶在菜單中可以根據(jù)需要選擇修改、查看、禁用(啟用)或刪除等菜單項(xiàng)進(jìn)行相應(yīng)的操作。同存儲(chǔ)過(guò)程一樣,可以運(yùn)行系統(tǒng)存儲(chǔ)過(guò)程sp_helptext、sp_help、sp_depends來(lái)查看觸發(fā)器的定義、參數(shù)和相關(guān)性等。單元七創(chuàng)建及應(yīng)用觸發(fā)器任務(wù)3觸發(fā)器的管理與維護(hù)單元七創(chuàng)建及應(yīng)用觸發(fā)器二、修改和刪除觸發(fā)器1.修改觸發(fā)器修改觸發(fā)器的語(yǔ)法格式如下。ALTERTRIGGER觸發(fā)器名ON{表|視圖}[WITHENCRYPTION]{FOR|AFTER|INSTEADOF}{[INSERT][,][UPDATE][,][DELETE]}[NOTFORREPLICATION]AS[{IFUPDATE(列名)[{AND|OR}UPDATE(列名)][…n]}]SQL語(yǔ)句其中各參數(shù)的意義與建立觸發(fā)器的語(yǔ)句的意義相同。任務(wù)3觸發(fā)器的管理與維護(hù)單元七創(chuàng)建及應(yīng)用觸發(fā)器【例7.4】對(duì)例7.2所創(chuàng)建的觸發(fā)器進(jìn)行加密運(yùn)行如下SQL語(yǔ)句。ALTERTRIGGERupdate_trigONCJWITHENCRYPTIONFORupdateASIFUPDATE(學(xué)號(hào))ORUPDATE(課程號(hào))BEGINRAISERROR('學(xué)號(hào)或課程號(hào)不能進(jìn)行修改!',7,2)ROLLBACKTRANSACTIONEND--測(cè)試是否能查看觸發(fā)器的定義信息EXECUTEsp_helptextupdate_trigGO任務(wù)3觸發(fā)器的管理與維護(hù)單元七創(chuàng)建及應(yīng)用觸發(fā)器

2.刪除觸發(fā)器使用DROPTRIGGER<觸發(fā)器名>命令,即可刪除觸發(fā)器。任務(wù)3觸發(fā)器的管理與維護(hù)

查看觸發(fā)器的定義信息將顯示“對(duì)象‘update_trig’的文本已加密”。因?yàn)樵撚|發(fā)器已加密,所以和加密的存儲(chǔ)過(guò)程一樣,即使是sa用戶(hù)和dbo用戶(hù)也不能查看加密后的觸發(fā)器的內(nèi)容,所以對(duì)加密的觸發(fā)器一定要留有備份。要想取消加密,用不帶WITHENCRYPTION子句的修改觸發(fā)器命令重新修改回來(lái)即可。單元七創(chuàng)建及應(yīng)用觸發(fā)器返回任務(wù)3觸發(fā)器的管理與維護(hù)三、禁止或啟用觸發(fā)器在有些情況下,用戶(hù)希望暫停觸發(fā)器的作用,但并不刪除它。例如,當(dāng)學(xué)生畢業(yè)時(shí),要清理XS表中部分學(xué)生的信息,但是并不希望這個(gè)刪除操作激活觸發(fā)器。在這種情況下就可以先“禁止”觸發(fā)器,等清理完成后再“啟用”觸發(fā)器。禁止和啟用觸發(fā)器的語(yǔ)法格式如下:ALTERTABLE表名{ENABLE|DISABLE}TRIGGER{ALL|觸發(fā)器名[,…n]}使用該語(yǔ)句可以禁用或啟用指定表上的某些觸發(fā)器或所有觸發(fā)器。任務(wù)4:DDL觸發(fā)器及其應(yīng)用單元七創(chuàng)建及應(yīng)用觸發(fā)器DDL觸發(fā)器是當(dāng)數(shù)據(jù)庫(kù)服務(wù)器中發(fā)生數(shù)據(jù)定義語(yǔ)言DDL事件時(shí)執(zhí)行的特殊存儲(chǔ)過(guò)程,如CREATE、ALTER等。DDL觸發(fā)器一般用于執(zhí)行數(shù)據(jù)庫(kù)中的管理任務(wù),如審核和規(guī)范數(shù)據(jù)庫(kù)操作,防止數(shù)據(jù)庫(kù)表結(jié)構(gòu)被修改等。一般來(lái)說(shuō),在以下幾種情況下可以使用DDL觸發(fā)器:(1)防止數(shù)據(jù)庫(kù)架構(gòu)進(jìn)行某些修改。(2)防止數(shù)據(jù)庫(kù)或數(shù)據(jù)表被誤操作而刪除。(3)希望數(shù)據(jù)庫(kù)發(fā)生某種情況以響應(yīng)數(shù)據(jù)庫(kù)架構(gòu)中的更改。(4)要記錄數(shù)據(jù)庫(kù)架構(gòu)的更改或事件。僅在運(yùn)行DDL觸發(fā)器的DDL語(yǔ)句后,DDL觸發(fā)器才會(huì)激發(fā)。DDL觸發(fā)器無(wú)法作為INSTEADOF觸發(fā)器而使用。單元七創(chuàng)建及應(yīng)用觸發(fā)器一、創(chuàng)建DDL觸發(fā)器創(chuàng)建DDL觸發(fā)器的語(yǔ)法格式如下:CREATETRIGGER觸發(fā)器名ON{服務(wù)器|數(shù)據(jù)庫(kù)}[WITHENCRYPTION]{FOR|AFTER}{DDL語(yǔ)句名稱(chēng)}ASSQL語(yǔ)句任務(wù)4:DDL觸發(fā)器及其應(yīng)用單元七創(chuàng)建及應(yīng)用觸發(fā)器【例7.5】建立用于保護(hù)數(shù)據(jù)庫(kù)XSGL中的數(shù)據(jù)表不被刪除的觸發(fā)器。運(yùn)行如下命令。CREATETRIGGERdis_drop_tableONXSGLFORDROP_TABLEASBEGINRAISERROR('對(duì)不起,XSGL數(shù)據(jù)庫(kù)中的表不能刪除',16,10)ROLLBACKTRANSACTIONENDGO任務(wù)4:DDL觸發(fā)器及其應(yīng)用單元七創(chuàng)建及應(yīng)用觸發(fā)器任務(wù)4:DDL觸發(fā)器及其應(yīng)用【例7.6】創(chuàng)建數(shù)據(jù)庫(kù)db1。--服務(wù)器范圍的DDL觸發(fā)器IFEXISTS(SELECT*FROMsys.server_triggersWHEREname='TR_CREATEDATABASE')DROPTRIGGERTR_CREATEDATABASEONALLSERVER;GOCREATETRIGGERTR_CREATEDATABASEONALLSERVERFORCREATE_DATABASEASPRINT'DatabaseCreated'PRINTCONVERT(nvarchar(1000),EventData())GO--創(chuàng)建數(shù)據(jù)庫(kù)db1CREATEDATABASEdb1;--收到下列消息DatabaseCreated<EVENT_INSTANCE><EventType>CREATE_DATABASE</EventType><PostTime>2008-09-01T20:17:35.170</PostTime><SPID>52</SPID><ServerName>YANFA0</ServerName><LoginName>YANFA0\Administrator</LoginName><DatabaseName>db1</DatabaseName><TSQLCommand><SetOptionsANSI_NULLS="ON"ANSI_NULL_DEFAULT="ON"ANSI_PADDING="ON"QUOTED_IDENTIFIER="ON"ENCRYPTED="FALSE"/><CommandText>CREATEDATABASEdb1;</CommandText></TSQLCommand></EVENT_INSTANCE>單元七創(chuàng)建及應(yīng)用觸發(fā)器任務(wù)4:DDL觸發(fā)器及其應(yīng)用【例7.7】刪除索引不成功示例。--服務(wù)器范圍的DDL觸發(fā)器IFEXISTS(SELECT*FROMsys.triggersWHEREname='TR_DROPINDEX'ANDparent_class=0)DROPTRIGGER[TR_DROPINDEX]ONDATABASEGOCREATE

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論