SQL2005觸發(fā)器簡(jiǎn)介_第1頁(yè)
SQL2005觸發(fā)器簡(jiǎn)介_第2頁(yè)
SQL2005觸發(fā)器簡(jiǎn)介_第3頁(yè)
SQL2005觸發(fā)器簡(jiǎn)介_第4頁(yè)
SQL2005觸發(fā)器簡(jiǎn)介_第5頁(yè)
已閱讀5頁(yè),還剩59頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、SQL2005 觸發(fā)器簡(jiǎn)介觸發(fā)器實(shí)際上就是一種特殊類型的存儲(chǔ)過程,其特殊性表現(xiàn)在:它在執(zhí)行某些特定的T-SQL語(yǔ)句時(shí)是自動(dòng)的。觸發(fā)器簡(jiǎn)介觸發(fā)器實(shí)際上就是一種特殊類型的存儲(chǔ)過程,它是在執(zhí)行某些特定的T-SQL語(yǔ)句時(shí)自動(dòng)執(zhí)行的一種存儲(chǔ)過程。在SQL Server 2005中,根據(jù)SQL語(yǔ)句的不同,把觸發(fā)器分為兩類:一類是DML觸發(fā)器,一類是DLL觸發(fā)器。觸發(fā)器的概念和作用在SQL Server 2005里,可以用兩種方法來(lái)保證數(shù)據(jù)的有效性和完整性:約束(check)和觸發(fā)器(Trigger)。約束是直接設(shè)置于數(shù)據(jù)表內(nèi),只能現(xiàn)實(shí)一些比較簡(jiǎn) 單的功能操作,如:實(shí)現(xiàn)字段有效性和唯一性的檢查、自動(dòng)填入默認(rèn)

2、值、確保字段數(shù)據(jù)不重復(fù)(即主鍵)、確保數(shù)據(jù)表對(duì)應(yīng)的完整性(即外鍵)等功能。觸發(fā)器是針對(duì)數(shù)據(jù)表(庫(kù))的特殊的存儲(chǔ)過程,當(dāng)這個(gè)表發(fā)生了 Insert、Update或Delete操作時(shí),會(huì)自動(dòng)激活執(zhí)行的,可以處理各種復(fù)雜的操作。在SQL Server 2005中,觸發(fā)器有了更進(jìn)一步的功能,在數(shù)據(jù)表(庫(kù))發(fā)生Create、Alter和Drop操作時(shí),也會(huì)自動(dòng)激活執(zhí)行。觸發(fā)器常用的一些功能如下:l 完成比約束更復(fù)雜的數(shù)據(jù)約束:觸發(fā)器可以實(shí)現(xiàn)比約束更為復(fù)雜的數(shù)據(jù)約束l 檢查所做的SQL是否允許:觸發(fā)器可以檢查SQL所做的操作是否被允許。例如:在產(chǎn)品庫(kù)存表里,如果要?jiǎng)h除一條產(chǎn)品記錄,在刪除記錄時(shí),觸發(fā)器可以

3、檢查該產(chǎn)品庫(kù)存數(shù)量是否為零,如果不為零則取消該刪除操作。l 修改其它數(shù)據(jù)表里的數(shù)據(jù):當(dāng)一個(gè)SQL語(yǔ)句對(duì)數(shù)據(jù)表進(jìn)行操作的時(shí)候,觸發(fā)器可以根據(jù)該SQL語(yǔ)句的操作情況來(lái)對(duì)另一個(gè)數(shù)據(jù)表進(jìn)行操作。例如:一個(gè)訂單取消的時(shí)候,那么觸發(fā)器可以自動(dòng)修改產(chǎn)品庫(kù)存表,在訂購(gòu)量的字段上減去被取消訂單的訂購(gòu)數(shù)量。l 調(diào)用更多的存儲(chǔ)過程:約束的本身是不能調(diào)用存儲(chǔ)過程的,但是觸發(fā)器本身就是一種存儲(chǔ)過程,而存儲(chǔ)過程是可以嵌套使用的,所以觸發(fā)器也可以調(diào)用一個(gè)或多過存儲(chǔ)過程。l 發(fā)送SQL Mail:在SQL語(yǔ)句執(zhí)行完之后,觸發(fā)器可以判斷更改過的記錄是否達(dá)到一定條件,如果達(dá)到這個(gè)條件的話,觸發(fā)器可以自動(dòng)調(diào)用SQL Mail來(lái)發(fā)送

4、郵件。例如:當(dāng)一個(gè)訂單交費(fèi)之后,可以物流人員發(fā)送Email,通知他盡快發(fā)貨。l 返回自定義的錯(cuò)誤信息:約束是不能返回信息的,而觸發(fā)器可以。例如插入一條重復(fù)記錄時(shí),可以返回一個(gè)具體的友好的錯(cuò)誤信息給前臺(tái)應(yīng)用程序。l 更改原本要操作的SQL語(yǔ)句:觸發(fā)器可以修改原本要操作的SQL語(yǔ)句,例如原本的SQL語(yǔ)句是要?jiǎng)h除數(shù)據(jù)表里的記錄,但該數(shù)據(jù)表里的記錄是最要記錄,不允許刪除的,那么觸發(fā)器可以不執(zhí)行該語(yǔ)句。l 防止數(shù)據(jù)表構(gòu)結(jié)更改或數(shù)據(jù)表被刪除:為了保護(hù)已經(jīng)建好的數(shù)據(jù)表,觸發(fā)器可以在接收到Drop和Alter開頭的SQL語(yǔ)句里,不進(jìn)行對(duì)數(shù)據(jù)表的操作。觸發(fā)器的種類在SQL Server 2005中,觸發(fā)器可以分

5、為兩大類:DML觸發(fā)器和DDL觸發(fā)器l DML觸發(fā)器:DML觸發(fā)器是當(dāng)數(shù)據(jù)庫(kù)服務(wù)器中發(fā)生數(shù)據(jù)操作語(yǔ)言(Data Manipulation Language)事件時(shí)執(zhí)行的存儲(chǔ)過程。DML觸發(fā)器又分為兩類:After觸發(fā)器和Instead Of觸發(fā)器l DDL觸發(fā)器:DDL觸發(fā)器是在響應(yīng)數(shù)據(jù)定義語(yǔ)言(Data Definition Language)事件時(shí)執(zhí)行的存儲(chǔ)過程。DDL觸發(fā)器一般用于執(zhí)行數(shù)據(jù)庫(kù)中管理任務(wù)。如審核和規(guī)范數(shù)據(jù)庫(kù)操作、防止數(shù)據(jù)庫(kù)表結(jié)構(gòu)被修改等。DML觸發(fā)器的分類SQL Server 2005的DML觸發(fā)器分為兩類:l After觸發(fā)器:這類觸發(fā)器是在記錄已經(jīng)改變完之后(after

6、),才會(huì)被激活執(zhí)行,它主要是用于記錄變更后的處理或檢查,一旦發(fā)現(xiàn)錯(cuò)誤,也可以用Rollback Transaction語(yǔ)句來(lái)回滾本次的操作。l Instead Of觸發(fā)器:這類觸發(fā)器一般是用來(lái)取代原本的操作,在記錄變更之前發(fā)生的,它并不去執(zhí)行原來(lái)SQL語(yǔ)句里的操作(Insert、Update、Delete),而去執(zhí)行觸發(fā)器本身所定義的操作。DML觸發(fā)器的工作原理在SQL Server 2005里,為每個(gè)DML觸發(fā)器都定義了兩個(gè)特殊的表,一個(gè)是插入表,一個(gè)是刪除表。這兩個(gè)表是建在數(shù)據(jù)庫(kù)服務(wù)器的內(nèi)存中的,是由系統(tǒng)管理的邏輯表,而不是真正存儲(chǔ)在數(shù)據(jù)庫(kù)中的物理表。對(duì)于這兩個(gè)表,用戶只有讀取的權(quán)限,沒有

7、修改的權(quán)限。這兩個(gè)表的結(jié)構(gòu)與觸發(fā)器所在數(shù)據(jù)表的結(jié)構(gòu)是完全一致的,當(dāng)觸發(fā)器的工作完成之后,這兩個(gè)表也將會(huì)從內(nèi)存中刪除。插入表里存放的是更新前的記錄:對(duì)于插入記錄操作來(lái)說,插入表里存放的是要插入的數(shù)據(jù);對(duì)于更新記錄操作來(lái)說,插入表里存放的是要更新的記錄。刪除表里存放的是更新后的記錄:對(duì)于更新記錄操作來(lái)說,刪除表里存放的是更新前的記錄(更新完后即被刪除);對(duì)于刪除記錄操作來(lái)說,刪除表里存入的是被刪除的舊記錄。下面看一下觸發(fā)器的工作原理。After觸發(fā)器的工作原理After觸發(fā)器是在記錄更變完之后才被激活執(zhí)行的。以刪除記錄為 例:當(dāng)SQL Server接收到一個(gè)要執(zhí)行刪除操作的SQL語(yǔ)句時(shí),SQL S

8、erver先將要?jiǎng)h除的記錄存放在刪除表里,然后把數(shù)據(jù)表里的記錄刪除,再激活A(yù)fter觸發(fā)器,執(zhí)行After觸發(fā)器里的SQL語(yǔ)句。執(zhí)行完畢之后, 刪除內(nèi)存中的刪除表,退出整個(gè)操作。還是舉上面的例子:在產(chǎn)品庫(kù)存表里,如果要?jiǎng)h除一條產(chǎn)品記錄,在刪除記錄時(shí),觸發(fā)器可以檢查該產(chǎn)品庫(kù)存數(shù)量是否為零,如果不為零則取消刪除操作??匆幌聰?shù)據(jù)庫(kù)是怎么操作的:(1)接收SQL語(yǔ)句,將要從產(chǎn)品庫(kù)存表里刪除的產(chǎn)品記錄取出來(lái),放在刪除表里。(2)從產(chǎn)品庫(kù)存表里刪除該產(chǎn)品記錄。(3)從刪除表里讀出該產(chǎn)品的庫(kù)存數(shù)量字段,判斷是不是為零,如果為零的話,完成操作,從內(nèi)存里清除刪除表;如果不為零的話,用Rollback Trans

9、action語(yǔ)句來(lái)回滾操作。Instead Of觸發(fā)器的工作原理Instead Of觸發(fā)器與After觸發(fā)器不同。After觸發(fā)器是在Insert、Update和Delete操作完成后才激活的,而Instead Of觸發(fā)器,是在這些操作進(jìn)行之前就激活了,并且不再去執(zhí)行原來(lái)的SQL操作,而去運(yùn)行觸發(fā)器本身的SQL語(yǔ)句。設(shè)計(jì)DML觸發(fā)器的注意事項(xiàng)及技巧在了解觸發(fā)器的種類和工作理由之后,現(xiàn)在可以開始動(dòng)手來(lái)設(shè)計(jì)觸發(fā)器了,不過在動(dòng)手之前,還有一些注意事項(xiàng)必須先了解一下:設(shè)計(jì)觸發(fā)器的限制在觸發(fā)器中,有一些SQL語(yǔ)句是不能使用的,這些語(yǔ)句包括:在DML觸發(fā)器中不能使用的語(yǔ)句不能使用的語(yǔ)句語(yǔ)句功能Alter

10、Database修改數(shù)據(jù)庫(kù)Create Database新建數(shù)據(jù)庫(kù)Drop Database刪除數(shù)據(jù)庫(kù)Load Database導(dǎo)入數(shù)據(jù)庫(kù)Load Log導(dǎo)入日志Reconfigure更新配置選項(xiàng)Restore Database還原數(shù)據(jù)庫(kù)Restore Log還原數(shù)據(jù)庫(kù)日志另外,在對(duì)作為觸發(fā)操作的目標(biāo)的表或視圖使用了下面的SQL語(yǔ)句時(shí),不允許在DML觸發(fā)器里再使用這些語(yǔ)句:上表中的語(yǔ)句在目標(biāo)表中使用過的,DML觸發(fā)器不能再使用的語(yǔ)句不能使用的語(yǔ)句語(yǔ)句功能Create Index建立索引Alter Index修改索引Drop Index刪除索引DBCC Dbreindex重新生成索引Alter

11、Partition Function通過拆分或合并邊界值更改分區(qū)Drop Table刪除數(shù)據(jù)表Alter Table修改數(shù)據(jù)表結(jié)構(gòu)如何在觸發(fā)器取得字段修改前和修改后的數(shù)據(jù)上面介紹過,SQL Server 2005在為每個(gè)觸發(fā)器都定義了兩個(gè)虛擬表,一個(gè)是插入表(inserted),一個(gè)是刪除表(deleted),現(xiàn)在把這兩個(gè)表存放的數(shù)據(jù)列表說明一下:插入/刪除表的功能激活觸發(fā)器的動(dòng)作Inserted表Deleted表Insert存放要插入的記錄Update存放要更新的記錄存放更新前的舊記錄Delete存放要?jiǎng)h除的舊記錄以上面刪除庫(kù)存產(chǎn)品記錄為例,在刪除時(shí)觸發(fā)器要判斷庫(kù)存數(shù)量是否為零,那么判斷就應(yīng)

12、該這么寫:If (Select 庫(kù)存數(shù)量 From Deleted)0BeginPrint 庫(kù)存數(shù)量大于零時(shí)不能刪除此記錄Rollback TransactionEnd其他注意事項(xiàng)l After觸發(fā)器只能用于數(shù)據(jù)表中,Instead Of觸發(fā)器可以用于數(shù)據(jù)表和視圖上,但兩種觸發(fā)器都不可以建立在臨時(shí)表上。l 一個(gè)數(shù)據(jù)表可以有多個(gè)觸發(fā)器,但是一個(gè)觸發(fā)器只能對(duì)應(yīng)一個(gè)表。l 在同一個(gè)數(shù)據(jù)表中,對(duì)每個(gè)操作(如Insert、Update、Delete)而言可以建立許多個(gè)After觸發(fā)器,但I(xiàn)nstead Of觸發(fā)器針對(duì)每個(gè)操作只有建立一個(gè)。l 如果針對(duì)某個(gè)操作即設(shè)置了After觸發(fā)器又設(shè)置了Instead

13、 Of觸發(fā)器,那么Instead of觸發(fā)器一定會(huì)激活,而After觸發(fā)器就不一定會(huì)激活了。l Truncate Table語(yǔ)句雖然類似于Delete語(yǔ)句可以刪除記錄,但是它不能激活Delete類型的觸發(fā)器。因?yàn)門runcate Table語(yǔ)句是不記入日志的。l WRITETEXT語(yǔ)句不能觸發(fā)Insert和Update型的觸發(fā)器。l 不同的SQL語(yǔ)句,可以觸發(fā)同一個(gè)觸發(fā)器,如Insert和Update語(yǔ)句都可以激活同一個(gè)觸發(fā)器。設(shè)計(jì)After觸發(fā)器在了解觸發(fā)器及其種類、作用、工作原理之后,下面詳細(xì)講述一下要怎么去設(shè)計(jì)及建立觸發(fā)器。 設(shè)計(jì)簡(jiǎn)單的After觸發(fā)器下面用實(shí)例設(shè)計(jì)一個(gè)簡(jiǎn)單的After

14、Insert觸發(fā)器,這個(gè)觸發(fā)器的作用是:在插入一條記錄的時(shí)候,發(fā)出“又添加了一種產(chǎn)品”的友好提示。(1)啟動(dòng)Management Studio,登錄到指定的服務(wù)器上。(2)在如圖11.1所示界面的【對(duì)象資源管理器】下選擇【數(shù)據(jù)庫(kù)】,定位到【Northwind】數(shù)據(jù)庫(kù)【表】【dbo.產(chǎn)品】,并找到【觸發(fā)器】項(xiàng)。圖11.1 定位到觸發(fā)器(3)右擊【觸發(fā)器】,在彈出的快捷菜單中選擇【新建觸發(fā)器】選項(xiàng),此時(shí)會(huì)自動(dòng)彈出【查詢編輯器】對(duì)話框,在【查詢編輯器】的編輯區(qū)里SQL Server已經(jīng)預(yù)寫入了一些建立觸發(fā)器相關(guān)的SQL語(yǔ)句,如圖11.2所示。圖11.2 SQL Server 2005預(yù)寫的觸發(fā)器代碼

15、(4)修改【查詢編輯器】里的代碼,將從“CREATE”開始到“GO”結(jié)束的代碼改為以下代碼:CREATE TRIGGER 產(chǎn)品_InsertON 產(chǎn)品AFTER INSERTASBEGIN print 又添加了一種產(chǎn)品ENDGO如果有興趣的話,也可以去修改一下如圖11.2中綠色部分的版權(quán)信息。(5)單擊工具欄中的【分析】按鈕,檢查一下是否語(yǔ)法有錯(cuò),如圖11.3所示,如果在下面的【結(jié)果】對(duì)話框中出現(xiàn)“命令已成功完成”,則表示語(yǔ)法沒有錯(cuò)誤。圖11.3 檢查語(yǔ)法(6)語(yǔ)法檢查無(wú)誤后,單擊【執(zhí)行】按鈕,生成觸發(fā)器。(7)關(guān)掉查詢編輯器對(duì)話框,刷新一下觸發(fā)器對(duì)話框,可以看到剛才建立的【產(chǎn)品_Insert

16、】觸發(fā)器,如圖11.4所示。圖11.4 建好的觸發(fā)器建立After Update觸發(fā)器、After Delete觸發(fā)器和建立After Insert觸發(fā)器的步驟一致,不同的地方是把上面的SQL語(yǔ)句中的AFTER INSERT分別改為AFTER UPDATE和AFTER DELETE即可,如下所示,有興趣的讀者可以自行測(cè)試。CREATE TRIGGER 產(chǎn)品_UpdateON 產(chǎn)品AFTER UPDATEASBEGIN print 有一種產(chǎn)品更改了ENDGOCREATE TRIGGER 產(chǎn)品_DeleteON 產(chǎn)品AFTER DELETEASBEGIN print 又刪除了一種產(chǎn)品ENDGO測(cè)試

17、觸發(fā)器功能建好After Insert觸發(fā)器之后,現(xiàn)在來(lái)測(cè)試一下觸發(fā)器是怎么樣被激活的。(1)在Management Studio里新建一個(gè)查詢,在彈出的【查詢編輯器】對(duì)話框里輸入以下代碼:INSERT INTO 產(chǎn)品(產(chǎn)品名稱) VALUES (大蘋果)(2)單擊【執(zhí)行】按鈕,可以看到【消息】對(duì)話框里顯示出一句提示:“又添加了一種產(chǎn)品”,如圖11.5所示,這說明,After Insert觸發(fā)器被激活,并運(yùn)行成功了。圖11.5 查看觸發(fā)器的運(yùn)行結(jié)果而如果在【查詢編輯器】里執(zhí)行的不是一個(gè)Insert語(yǔ)句,而是一個(gè)Delete語(yǔ)句的話,After Insert觸發(fā)器將不會(huì)被激活。如在【查詢編輯器】

18、輸入以下語(yǔ)句:DELETE FROM 產(chǎn)品 WHERE (產(chǎn)品名稱= 大蘋果)單擊【執(zhí)行】按鈕,在【消息】對(duì)話框里只顯示了一句“(1行受影 響)”的提示,而沒有“又添加了一種產(chǎn)品”的提示,如圖11.6所示。這是因?yàn)镈elete語(yǔ)句是不能激活A(yù)fter Insert觸發(fā)器,所以After Insert觸發(fā)器里的“print 又添加了一種產(chǎn)品”語(yǔ)句并沒有執(zhí)行。圖11.6 執(zhí)行刪除語(yǔ)句不會(huì)激活A(yù)fter Insert觸發(fā)器建立觸發(fā)器的SQL語(yǔ)句回顧一下,在Management Studio新建一個(gè)觸發(fā)器的時(shí)候,它在查詢分析對(duì)話框給預(yù)設(shè)了一些SQL代碼,這些代碼其實(shí)上就是建立觸發(fā)器的語(yǔ)法提示?,F(xiàn)在來(lái)看

19、一下完整的觸發(fā)器語(yǔ)法代碼:CREATE TRIGGER .ON .AFTER ASBEGIN - SET NOCOUNT ON added to prevent extra result sets from - interfering with SELECT statements. SET NOCOUNT ON; - Insert statements for trigger hereENDGO用中文改了一下,以上代碼就一目了然了:CREATE TRIGGER 觸發(fā)器名ON 數(shù)據(jù)表名或視圖名AFTER INSERT或DELETE或UPDATEASBEGIN -這里是要運(yùn)行的SQL語(yǔ)句ENDGO

20、現(xiàn)在再對(duì)上面的代碼進(jìn)行進(jìn)一步的說明:l CREATE TRIGGER 觸發(fā)器名:這一句聲明SQL語(yǔ)句是用來(lái)建立一個(gè)觸發(fā)器。其中觸發(fā)器名在所在的數(shù)據(jù)庫(kù)里必須是唯一的。由于觸發(fā)器是建立中數(shù)據(jù)表或視圖中的,所以有很多人都 以為只要是在不同的數(shù)據(jù)表中,觸發(fā)器的名稱就可以相同,其實(shí)觸發(fā)器的全名(Server.Database.Owner.TriggerName)是必須 唯一的,這與觸發(fā)器在哪個(gè)數(shù)據(jù)表或視圖無(wú)關(guān)。l ON 數(shù)據(jù)表名或視圖名:這是指定觸發(fā)器所在的數(shù)據(jù)表或視圖,但是請(qǐng)注意,只有Instead Of觸發(fā)器才能建立在視圖上。并且,有設(shè)置為With Check Option的視圖也不允許建立Inst

21、ead Of觸發(fā)器。l AFTER INSERT或 DELETE UPDATE:這是指定觸發(fā)器的類型,是After Insert觸發(fā)器,還是After Delete觸發(fā)器,或者是After Update觸發(fā)器。其中After可以用For來(lái)代取,它們的意思都是一樣的,代表只有在數(shù)據(jù)表的操作都已正確完成后才會(huì)激活的觸發(fā)器。INSERT、 DELETE和UPDATE至少要指定一個(gè),當(dāng)然也可以指定多個(gè),若指定多個(gè)時(shí),必須用逗號(hào)來(lái)分開。其順序可以任意擺放。l With Encryption:With Encryption是用來(lái)加密觸發(fā)器的,放在“On 數(shù)據(jù)表名或視圖名”的后面,“For”的前面。如果使用

22、了這句話,該觸發(fā)器將會(huì)被加密,任何人都看不到觸發(fā)器的內(nèi)容了。例一:以下是一個(gè)包含提醒電子郵件的觸發(fā)器例子,如果訂單表里記錄有改動(dòng)的的話(無(wú)論增加訂單還是修改、刪除訂單),則給物流人員張三發(fā)送電子郵件:CREATE TRIGGER 訂單_InsertON 訂單AFTER INSERT, UPDATE, DELETEAS EXEC master.xp_sendmail 張三, 訂單有更改,請(qǐng)查詢確定GO例二:在訂單明細(xì)表里,折扣字段不能大于0.6,如果插入記錄時(shí),折扣大于0.6的話,回滾操作。CREATE TRIGGER 訂單明細(xì)_InsertON 訂單明細(xì)AFTER INSERTASBEGIN

23、if (Select 折扣 from inserted)0.6 begin print 折扣不能大于0.6 Rollback Transaction endENDGO在示例二中運(yùn)用了兩個(gè)方法,一個(gè)是前面說過的,在Inserted表里查詢某個(gè)字段,還有一個(gè)是用Rollback Transaction來(lái)回滾操作。如果用下面的SQL語(yǔ)句來(lái)進(jìn)行Insert操作的話,插入記錄將會(huì)不成功。INSERT INTO 訂單明細(xì)(訂單ID,產(chǎn)品ID,單價(jià),數(shù)量,折扣)VALUES (11077,1,18,1,0.7)運(yùn)行結(jié)果如圖11.7所示:圖11.7 插入記錄不符合觸發(fā)器里的約束,則回滾操作設(shè)置After觸發(fā)器

24、的激活順序?qū)τ谕粋€(gè)操作,如Insert、Update或Delete來(lái)說,可以建立多個(gè)After Insert觸發(fā)器,在11.5.1節(jié)中,已經(jīng)建立了一個(gè)名為“產(chǎn)品_Insert”的觸發(fā)器,現(xiàn)在再建立一個(gè)After Insert觸發(fā)器,作用也是輸出一句有好提示,提示內(nèi)容為:“再一次告訴你,你又添加了一種產(chǎn)品”。CREATE TRIGGER 產(chǎn)品_Insert1ON 產(chǎn)品AFTER INSERTASBEGIN print 再一次告訴你,你又添加了一種產(chǎn)品ENDGO重新運(yùn)行一下插入產(chǎn)品的SQL語(yǔ)句:INSERT INTO 產(chǎn)品(產(chǎn)品名稱) VALUES (大蘋果)如圖11.8所示,運(yùn)行一個(gè)Inser

25、t語(yǔ)句,在【消息】可以看到一共輸出了兩句話,說明激活兩個(gè)不同的觸發(fā)器。圖11.8 一個(gè)語(yǔ)句激活兩個(gè)觸發(fā)器當(dāng)同一個(gè)操作定義的觸發(fā)器越來(lái)越多的時(shí)候,觸發(fā)器被激活的次序就會(huì) 變得越來(lái)越重要了。在SQL Server 2005里,用存儲(chǔ)過程【sp_settriggerorder】可以為每一個(gè)操作各指定一個(gè)最先執(zhí)行的After觸發(fā)器和最后執(zhí)行的After觸發(fā)器。 sp_settriggerorder語(yǔ)法如下:sp_settriggerorder triggername = triggerschema. triggername , order = value , stmttype = statement_

26、type , namespace = DATABASE | SERVER | NULL 翻譯成中文就是sp_settriggerorder 觸發(fā)器名, 激活次序, 激活觸發(fā)器的動(dòng)作解釋如下:l 觸發(fā)器名,要用單引號(hào)括起來(lái),因?yàn)樗且粋€(gè)字符串。l 激活次序可以為First、Last和None:First是指第一個(gè)要激活的觸發(fā)器;Last是指它最后一個(gè)要激活的觸發(fā)器;None是不指激活序,由程序任意觸發(fā)。l 激活觸發(fā)器的動(dòng)作可以是:Insert、Update和Delete。上面的例子里,先激活的是【產(chǎn)品_Insert】觸發(fā)器,后激活的是【產(chǎn)品_Insert1】觸發(fā)器。如果把【產(chǎn)品_Insert1】

27、觸發(fā)器設(shè)為First觸發(fā)器,把【產(chǎn)品_Insert】觸發(fā)器設(shè)為L(zhǎng)ast觸發(fā)器,那么結(jié)果將會(huì)完全不一樣。設(shè)置語(yǔ)句如下:Exec sp_settriggerorder 產(chǎn)品_Insert1,First,InsertgoExec sp_settriggerorder 產(chǎn)品_Insert,Last,InsertGo重新運(yùn)行一下插入產(chǎn)品的SQL語(yǔ)句:INSERT INTO 產(chǎn)品(產(chǎn)品名稱)VALUES (大蘋果)運(yùn)行結(jié)果如圖11.9,與圖11.8比較一下,是不是激活次序已經(jīng)發(fā)生變化了?圖11.9 按次序激活的激活器在設(shè)置After觸發(fā)器激活順序時(shí),還有幾點(diǎn)是需要注意的:l 每個(gè)操作最多只能設(shè)一個(gè)Firs

28、t觸發(fā)器和一個(gè)Last觸發(fā)器。l 如果要取消已經(jīng)設(shè)好的First觸發(fā)器或Last觸發(fā)器,只要把它們?cè)O(shè)為None觸發(fā)器即可。l 如果用Alter命令修改過觸發(fā)器內(nèi)容后,該觸發(fā)器會(huì)自動(dòng)變成None觸發(fā)器。所以用Alter命令也可以用來(lái)取消已經(jīng)設(shè)好的First觸發(fā)器或Last觸發(fā)器。l 只有After觸發(fā)器可以設(shè)置激活次序,Instead Of觸發(fā)器不可以設(shè)置激活次序。l 激活觸發(fā)器的動(dòng)作必須和觸發(fā)器內(nèi)部的激活動(dòng)作一致。舉例說明:After Insert觸發(fā)器,只能為Insert操作設(shè)置激活次序,不能為Delete操作設(shè)置激活次序。以下的設(shè)置是錯(cuò)誤的:Exec sp_settriggerorder

29、產(chǎn)品_Insert1,First,Updatego觸發(fā)器的嵌套當(dāng)一個(gè)觸發(fā)器執(zhí)行時(shí),能夠觸活另一個(gè)觸發(fā)器,這種情況就是觸發(fā)器的嵌套。在SQL Server 2005里,觸發(fā)器能夠嵌套到32層。如果不想對(duì)觸發(fā)器進(jìn)行嵌套的話,可以通過【允許觸發(fā)器激活其他觸發(fā)器】的服務(wù)器配置選項(xiàng)來(lái)控制。但不管此設(shè)置是什么,都可以嵌套Instead Of觸發(fā)器。設(shè)置觸發(fā)器嵌套的選項(xiàng)更改方法為:(1)打開Management Studio,在【對(duì)象資源管理】中,右擊服務(wù)器名,并選擇【屬性】選項(xiàng)。(2)單擊【高級(jí)】節(jié)點(diǎn)。(3)在【雜項(xiàng)】里設(shè)置【允許觸發(fā)器激活其他觸發(fā)器】為True或False。如圖11.10所示:圖11.1

30、0 開啟/關(guān)閉觸發(fā)器嵌套現(xiàn)在,在Northwind數(shù)據(jù)庫(kù)里建一個(gè)操作記錄表,用來(lái)記錄所有數(shù)據(jù)表的操作,無(wú)論是對(duì)哪個(gè)數(shù)據(jù)表進(jìn)行了插入、更新或刪除,都可以把操作內(nèi)容和操作時(shí)間記錄到操作記錄表里。下面是建立操作記錄表的SQL語(yǔ)句:CREATE TABLE 操作記錄表( 編號(hào) int IDENTITY(1,1) NOT NULL, 操作表名 varchar(50) NOT NULL, 操作語(yǔ)句 varchar(2000) NOT NULL, 操作內(nèi)容 varchar(2000) NOT NULL, 操作時(shí)間 datetime NOT NULL CONSTRAINT DF_操作記錄表_操作時(shí)間 DEFA

31、ULT (getdate(),CONSTRAINT PK_操作記錄表 PRIMARY KEY CLUSTERED( 編號(hào) ASC)WITH (IGNORE_DUP_KEY = OFF) ON PRIMARY) ON PRIMARYGO為了簡(jiǎn)便起見,在操作記錄表里,只建一個(gè)After Insert觸發(fā)器,觸發(fā)器的作用是輸入一條語(yǔ)句:“數(shù)據(jù)庫(kù)又有記錄變動(dòng)了”。在實(shí)際應(yīng)用時(shí),讀者可自行修改成所需的代碼。CREATE TRIGGER 操作記錄表_InsertON 操作記錄表AFTER INSERTASBEGIN print 數(shù)據(jù)庫(kù)又有記錄變動(dòng)了ENDGO作為示例,只在類別表里建立一個(gè)After Ins

32、ert觸發(fā)器,當(dāng)在類別表里插入一條記錄的時(shí)候,該觸發(fā)器向操作記錄表里插入一條記錄,而在操作記錄表里插入記錄時(shí),將會(huì)觸發(fā)操作記錄表里的【操作記錄表_Insert】觸發(fā)器。CREATE TRIGGER 類別_InsertON 類別AFTER INSERTASBEGIN Declare 類別名稱 nvarchar(15),說明 nvarchar(max) set 類別名稱= (Select 類別名稱 from inserted) set 說明= (Select 說明 from inserted) INSERT INTO 操作記錄表(操作表名,操作語(yǔ)句,操作內(nèi)容) VALUES (類別表,插入記錄,類

33、別名稱:+類別名稱+,說明:+說明)ENDGO現(xiàn)在運(yùn)行一下對(duì)類別表的插入語(yǔ)句INSERT INTO 類別(類別名稱,說明) VALUES (書籍,各類圖書)運(yùn)行結(jié)果如圖11.11所示:圖11.11 觸發(fā)器嵌套被激活在【消息】對(duì)話框可以看到“數(shù)據(jù)庫(kù)又有記錄變動(dòng)了”,這說明,觸發(fā)器已經(jīng)被嵌套激活了。如果把【允許觸發(fā)器激活其他觸發(fā)器】的選項(xiàng)設(shè)為False,再看看運(yùn)行結(jié)果:圖11.12 觸發(fā)器嵌套沒有被激活如圖11.12所示,現(xiàn)在沒有“數(shù)據(jù)庫(kù)又有記錄變動(dòng)了”的提示輸出,說明嵌套的觸發(fā)器沒有被激活。觸發(fā)器的遞歸觸發(fā)器的遞歸是指,一個(gè)觸發(fā)器從其內(nèi)部又一次激活該觸發(fā)器。例如一 個(gè)Insert觸發(fā)器的內(nèi)部還有

34、一條對(duì)本數(shù)據(jù)表插入記錄的SQL語(yǔ)句,那么這個(gè)插入語(yǔ)句就有可能再一次激活這個(gè)觸發(fā)器本身。當(dāng)然,這種遞歸的觸發(fā)器內(nèi)部還 會(huì)有判斷語(yǔ)句,要一定的情況下才會(huì)執(zhí)行那個(gè)SQL語(yǔ)句,否則的話,就會(huì)變成死循環(huán)了。上面的例子說的是直接遞歸的觸發(fā)器,還有一種是間接遞歸的觸發(fā)器, 舉例說明:當(dāng)向A表插入一條記錄時(shí),激活了A表的Insert觸發(fā)器,A表的Insert觸發(fā)器里有一個(gè)SQL語(yǔ)句是對(duì)B表進(jìn)行Insert操作的,而在 B表的Insert觸發(fā)器里也有一句話是對(duì)A表進(jìn)行Insert操作的。這樣就是觸發(fā)器的間接遞歸。一般情況來(lái)說,SQL Server服務(wù)器是不允許遞歸的,如果要打開觸發(fā)器遞歸的功能,同樣是將【允許觸

35、發(fā)器激活其他觸發(fā)器】設(shè)為True,如圖11.10所示。設(shè)計(jì)Instead Of觸發(fā)器Instead Of觸發(fā)器與After觸發(fā)器的工作流程是不一樣的。After觸發(fā)器是在SQL Server服務(wù)器接到執(zhí)行SQL語(yǔ)句請(qǐng)求之后,先建立臨時(shí)的Inserted表和Deleted表,然后實(shí)際更改數(shù)據(jù),最后才激活觸發(fā)器的。而 Instead Of觸發(fā)器看起來(lái)就簡(jiǎn)單多了,在SQL Server服務(wù)器接到執(zhí)行SQL語(yǔ)句請(qǐng)求后,先建立臨時(shí)的Inserted表和Deleted表,然后就觸發(fā)了Instead Of觸發(fā)器,至于那個(gè)SQL語(yǔ)句是插入數(shù)據(jù)、更新數(shù)據(jù)還是刪除數(shù)據(jù),就一概不管了,把執(zhí)行權(quán)全權(quán)交給了Instea

36、d Of觸發(fā)器,由它去完成之后的操作。Instead Of觸發(fā)器的使用范圍Instead Of觸發(fā)器可以同時(shí)在數(shù)據(jù)表和視圖中使用,通常在以下幾種情況下,建議使用Instead Of觸發(fā)器:l 數(shù)據(jù)庫(kù)里的數(shù)據(jù)禁止修改:例如電信部門的通話記錄是不能修改的,一旦修改,則通話費(fèi)用的計(jì)數(shù)將不正確。在這個(gè)時(shí)候,就可以用Instead Of觸發(fā)器來(lái)跳過Update修改記錄的SQL語(yǔ)句。l 有可能要回滾修改的SQL語(yǔ)句:如11.5.3節(jié)中的例二,用After觸發(fā)器并不是一個(gè)最好的方法,如果用Instead Of觸發(fā)器,在判斷折扣大于0.6時(shí),就中止了更新操作,避免在修改數(shù)據(jù)之后再回滾操作,減少服務(wù)器負(fù)擔(dān)。l

37、在視圖中使用觸發(fā)器:因?yàn)锳fter觸發(fā)器不能在視圖中使用,如果想在視圖中使用觸發(fā)器,就只能用Instead Of觸發(fā)器。l 用自己的方式去修改數(shù)據(jù):如不滿意SQL直接的修改數(shù)據(jù)的方式,可用Instead Of觸發(fā)器來(lái)控制數(shù)據(jù)的修改方式和流程。設(shè)計(jì)簡(jiǎn)單的Instead Of觸發(fā)器Instead Of觸發(fā)器的語(yǔ)法如下:CREATE TRIGGER 觸發(fā)器名ON 數(shù)據(jù)表名或視圖名Instead Of INSERT或DELETE或UPDATEASBEGIN -這里是要運(yùn)行的SQL語(yǔ)句ENDGO從上面可以看得出,Instead Of觸發(fā)器與After觸發(fā)器的語(yǔ)法幾乎一致,只是簡(jiǎn)單地把After改為Ins

38、tead Of。前面說過的11.5.3節(jié)中的例二,用After觸發(fā)器并不是一個(gè)最好的方法,如果用Instead Of觸發(fā)器,在判斷折扣大于0.6時(shí),就中止了更新操作,避免在修改數(shù)據(jù)之后再回滾操作,減少服務(wù)器負(fù)擔(dān)?,F(xiàn)將原來(lái)的觸發(fā)器改為Instead Of觸發(fā)器:CREATE TRIGGER 訂單明細(xì)_InsertON 訂單明細(xì)Instead Of INSERTASBEGIN SET NOCOUNT ON; declare 訂單ID int, 產(chǎn)品ID int, 單價(jià) money, 數(shù)量 smallint, 折扣 real set 訂單ID = (select 訂單ID from inserted

39、) set 產(chǎn)品ID = (select 產(chǎn)品ID from inserted) set 單價(jià) = (select 單價(jià) from inserted) set 數(shù)量 = (select 數(shù)量 from inserted) set 折扣 = (select 折扣 from inserted) if (折扣)0.6 print 折扣不能大查看DML觸發(fā)器查看已經(jīng)設(shè)計(jì)好的DML觸發(fā)器有兩種方式,一種是通用Management Studio來(lái)查看,一種是利用系統(tǒng)存儲(chǔ)過程來(lái)查看。在Management Studio中查看觸發(fā)器在Management Studio中查看觸發(fā)器的步驟:(1)啟動(dòng)Manage

40、ment Studio,登錄到指定的服務(wù)器上。(2)在如圖11.13所示界面的【對(duì)象資源管理器】下選擇【數(shù)據(jù)庫(kù)】,定位到要查看觸發(fā)器的數(shù)據(jù)表上,并找到【觸發(fā)器】項(xiàng)。圖11.13 查看觸發(fā)器列表(3)單擊【觸發(fā)器】,在右邊的【摘要】對(duì)話框里,可以看到已經(jīng)建 好的該數(shù)據(jù)表的觸發(fā)器列表。如果在點(diǎn)擊【觸發(fā)器】后,右邊沒有顯示【摘要】對(duì)話框,可以在單擊菜單欄上的【視圖】菜單,選擇【摘要】選項(xiàng),打開【摘要】對(duì) 話框。如果在【摘要】對(duì)話框里沒有看到本應(yīng)存在的觸發(fā)器列表,可以【摘要】對(duì)話框里右擊空白處,在彈出的快捷菜單中選擇【刷新】選項(xiàng),刷新對(duì)話框后即可看 到觸發(fā)器列表。(4)雙擊要查看的觸發(fā)器名,Manag

41、ement Studio自動(dòng)彈出一個(gè)【查詢編輯器】對(duì)話框,對(duì)話框里顯示的是該觸發(fā)器的內(nèi)容,如圖11.14所示:圖11.14 查看觸發(fā)器內(nèi)容用系統(tǒng)存儲(chǔ)過程查看觸發(fā)器SQL Server 2005里已經(jīng)建好了兩個(gè)系統(tǒng)存儲(chǔ)過程,可以用這兩個(gè)系統(tǒng)存儲(chǔ)過程來(lái)查看觸發(fā)器的情況:sp_help:系統(tǒng)存儲(chǔ)過程“sp_help”可以了解如觸發(fā)器名稱、類型、創(chuàng)建時(shí)間等基本信息,其語(yǔ)法格式為:sp_help 觸發(fā)器名舉例:sp_help 產(chǎn)品_Insert運(yùn)行結(jié)果如圖11.15所示,可以看到觸發(fā)器“產(chǎn)品_insert”的基本情況。圖11.15 查看觸發(fā)器的基本情況sp_helptext:系統(tǒng)存儲(chǔ)過程“sp_help

42、text”可以查看觸發(fā)器的文本信息,其語(yǔ)法格式為:sp_helptext 觸發(fā)器名舉例:sp_helptext 產(chǎn)品_Insert運(yùn)行結(jié)果如圖11.16所示,可以看到觸發(fā)器“產(chǎn)品_insert”的具體文本內(nèi)容。圖11.16 查看觸發(fā)器的基本情況修改DML觸發(fā)器在Management Studio中修改觸發(fā)器之前,必須要先查看觸發(fā)器的內(nèi)容,通過11.10.1節(jié)的第(1)步到第(4)步,細(xì)心的讀者可以已經(jīng)發(fā)現(xiàn),如圖11.14所 示,在【查詢編輯器】對(duì)話框里顯示的就是用來(lái)修改觸發(fā)器的代碼。編輯完代碼之后,單擊【執(zhí)行】按鈕運(yùn)行即可。修改觸發(fā)器的語(yǔ)法如下:ALTER TRIGGER 觸發(fā)器名ON 數(shù)據(jù)表

43、名或視圖名AFTER INSERT或DELETE或UPDATEASBEGIN -這里是要運(yùn)行的SQL語(yǔ)句ENDGO如果只要修改觸發(fā)器的名稱的話,也可以使用存儲(chǔ)過程“sp_rename”。其語(yǔ)法如下:sp_rename 舊觸發(fā)器名,新觸發(fā)器名值得一提的是修改觸發(fā)器名稱有可能會(huì)使某些腳本或存儲(chǔ)過程運(yùn)行出錯(cuò)。刪除DML觸發(fā)器在Management Studio中刪除觸發(fā)器,必須要先查到觸發(fā)器列表,通過11.10.1節(jié)的第(1)步到第(3)步,可以查看到數(shù)據(jù)表下的所有觸發(fā)器列表,右擊其中一個(gè) 觸發(fā)器,在彈出快捷菜單中選擇【刪除】選項(xiàng),此時(shí)將會(huì)彈出【刪除對(duì)象】對(duì)話框,在該對(duì)話框中單擊【確定】按鈕,刪除操

44、作完成。用以下SQL語(yǔ)句也對(duì)可刪除 觸發(fā)器:Drop Trigger 觸發(fā)器名注意:如果一個(gè)數(shù)據(jù)表被刪除,那么SQL Server會(huì)自動(dòng)將與該表相關(guān)的觸發(fā)器刪除。禁用與啟用DML觸發(fā)器禁用觸發(fā)器與刪除觸發(fā)器不同,禁用觸發(fā)器時(shí),仍會(huì)為數(shù)據(jù)表定義該觸發(fā)器,只是在執(zhí)行Insert、Update或Delete語(yǔ)句時(shí),除非重新啟用觸發(fā)器,否則不會(huì)執(zhí)行觸發(fā)器中的操作。在Management Studio中禁用或啟用觸發(fā)器,也必須要先查到觸發(fā)器列表,觸發(fā)器列表里,右擊其中一個(gè)觸發(fā)器,在彈出快捷菜單中選擇【禁用】選項(xiàng),即可禁用該觸發(fā)器。啟用觸發(fā)器與上類似,只是在彈出快捷菜單中選擇【啟用】選項(xiàng)即可。用以下Alt

45、er Table語(yǔ)句也禁用或啟用觸發(fā)器,其語(yǔ)法如下:Alter table 數(shù)據(jù)表名Disable或Enable trigger 觸發(fā)器名或ALL用Disable可以禁用觸發(fā)器,用Enable可以啟用觸發(fā)器;如果要禁用或啟用所有觸發(fā)器,用“ALL”來(lái)代替觸發(fā)器名。2005新增功能:DDL觸發(fā)器DDL觸發(fā)器是SQL Server 2005新增的一個(gè)觸發(fā)器類型,是一種特殊的觸發(fā)器,它在響應(yīng)數(shù)據(jù)定義語(yǔ)言(DDL)語(yǔ)句時(shí)觸發(fā)。一般用于數(shù)據(jù)庫(kù)中執(zhí)行管理任務(wù)。與DML觸發(fā)器一樣,DDL觸發(fā)器也是通過事件來(lái)激活,并執(zhí)行其中 的SQL語(yǔ)句的。但與DML觸發(fā)器不同,DML觸發(fā)器是響應(yīng)Insert、Update或

46、Delete語(yǔ)句而激活的,DDL觸發(fā)器是響應(yīng)Create、 Alter或Drop開頭的語(yǔ)句而激活的。一般來(lái)說,在以下幾種情況下可以使用DDL觸發(fā)器:l 數(shù)據(jù)庫(kù)里的庫(kù)架構(gòu)或數(shù)據(jù)表架構(gòu)很重要,不允許被修改。l 防止數(shù)據(jù)庫(kù)或數(shù)據(jù)表被誤操作刪除。l 在修改某個(gè)數(shù)據(jù)表結(jié)構(gòu)的同時(shí)修改另一個(gè)數(shù)據(jù)表的相應(yīng)的結(jié)構(gòu)。l 要記錄對(duì)數(shù)據(jù)庫(kù)結(jié)構(gòu)操作的事件。2005新增功能:設(shè)計(jì)DDL觸發(fā)器只要注意到DDL觸發(fā)器和DML觸發(fā)器的區(qū)別,設(shè)計(jì)DDL觸發(fā)器與設(shè)計(jì)DML觸發(fā)器也很類似,下面詳細(xì)講述一下要怎么去設(shè)計(jì)一個(gè)DDL觸發(fā)器。建立DDL觸發(fā)器的語(yǔ)句建立DDL觸發(fā)器的語(yǔ)法代碼如下:CREATE TRIGGER trigger_

47、nameON ALL SERVER | DATABASE WITH ,.n FOR | AFTER event_type | event_group ,.n AS sql_statement ; .n | EXTERNAL NAME ; 用中文取代一下英文可以看得更明白:CREATE TRIGGER 觸發(fā)器名ON ALL SERVER或DATABASEFOR 或AFTER激活DDL觸發(fā)器的事件AS 要執(zhí)行的SQL語(yǔ)句其中:l ON后面的All Server是將DDL觸發(fā)器作用到整個(gè)當(dāng)前的服務(wù)器上。如果指定了這個(gè)參數(shù),在當(dāng)前服務(wù)器上的任何一個(gè)數(shù)據(jù)庫(kù)都能激活該觸發(fā)器。l ON后面的Database

48、是將DDL觸發(fā)器作用到當(dāng)前數(shù)據(jù)庫(kù),只能在這個(gè)數(shù)據(jù)庫(kù)上激活該觸發(fā)器。l For或After是同一個(gè)意思,指定的是After觸發(fā)器,DDL觸發(fā)器不能指定的Stead Of觸發(fā)器。l 激活DDL觸發(fā)器的事件包括兩種,在DDL觸發(fā)器作用在當(dāng)前數(shù)據(jù)庫(kù)情況下可以使用以下事件:CREATE_APPLICATION_ROLEALTER_APPLICATION_ROLEDROP_APPLICATION_ROLECREATE_ASSEMBLYALTER_ASSEMBLYDROP_ASSEMBLYALTER_AUTHORIZATION_DATABASECREATE_CERTIFICATEALTER_CERTIFIC

49、ATEDROP_CERTIFICATECREATE_CONTRACTDROP_CONTRACTGRANT_DATABASEDENY_DATABASEREVOKE_DATABASECREATE_EVENT_NOTIFICATIONDROP_EVENT_NOTIFICATIONCREATE_FUNCTIONALTER_FUNCTIONDROP_FUNCTIONCREATE_INDEXALTER_INDEXDROP_INDEXCREATE_MESSAGE_TYPEALTER_MESSAGE_TYPEDROP_MESSAGE_TYPECREATE_PARTITION_FUNCTIONALTER_PAR

50、TITION_FUNCTIONDROP_PARTITION_FUNCTIONCREATE_PARTITION_SCHEMEALTER_PARTITION_SCHEMEDROP_PARTITION_SCHEMECREATE_PROCEDUREALTER_PROCEDUREDROP_PROCEDURECREATE_QUEUEALTER_QUEUEDROP_QUEUECREATE_REMOTE_SERVICE_BINDINGALTER_REMOTE_SERVICE_BINDINGDROP_REMOTE_SERVICE_BINDINGCREATE_ROLEALTER_ROLEDROP_ROLECREA

51、TE_ROUTEALTER_ROUTEDROP_ROUTECREATE_SCHEMAALTER_SCHEMADROP_SCHEMACREATE_SERVICEALTER_SERVICEDROP_SERVICECREATE_STATISTICSDROP_STATISTICSUPDATE_STATISTICSCREATE_SYNONYMDROP_SYNONYMCREATE_TABLEALTER_TABLEDROP_TABLECREATE_TRIGGERALTER_TRIGGERDROP_TRIGGERCREATE_TYPEDROP_TYPECREATE_USERALTER_USERDROP_USE

52、RCREATE_VIEWALTER_VIEWDROP_VIEWCREATE_XML_SCHEMA_COLLECTIONALTER_XML_SCHEMA_COLLECTIONDROP_XML_SCHEMA_COLLECTION在DDL觸發(fā)器作用在當(dāng)前服務(wù)器情況下,可以使用以下事件:ALTER_AUTHORIZATION_SERVERCREATE_DATABASEALTER_DATABASEDROP_DATABASECREATE_ENDPOINTDROP_ENDPOINTCREATE_LOGINALTER_LOGINDROP_LOGINGRANT_SERVERDENY_SERVERREVOKE_SERVER例三,建立一個(gè)DDL觸發(fā)器,用于保護(hù)數(shù)據(jù)庫(kù)中的數(shù)據(jù)表不被修改,不被刪除。具體操作步驟如下:(1)啟動(dòng)Management Studio,登錄到指定的服務(wù)器上。(2)在如圖11.1所示界面的【對(duì)象資源管理器】下選擇【數(shù)據(jù)庫(kù)】,定位到【Northwind】數(shù)據(jù)庫(kù)上。(3)單擊【新建查詢】按鈕,在彈出的【查詢編輯器】的編輯區(qū)里輸入以下代碼:CREATE TRIGGER 禁止對(duì)數(shù)據(jù)表操作ON DATABASEFOR DROP_TABLE, ALTER_TABLEAS PRINT 對(duì)不起,您不能對(duì)數(shù)據(jù)表進(jìn)行操作 ROLLBACK ;(4)單擊【執(zhí)行】按鈕,

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(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)論