資源描述:
《sql server 2008觸發(fā)器》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫(kù)。
1、初學(xué)sqlserver2008之觸發(fā)器 觸發(fā)器(trigger):是一種特殊的存儲(chǔ)過(guò)程,可以用來(lái)對(duì)表實(shí)施復(fù)雜的完整性約束,保持?jǐn)?shù)據(jù)的一致性。當(dāng)觸發(fā)器所保護(hù)的數(shù)據(jù)發(fā)生改變時(shí),觸發(fā)器會(huì)自動(dòng)被激活,并執(zhí)行觸發(fā)器中所定義的相關(guān)操作,從而保證對(duì)數(shù)據(jù)的不完整性約束或不正確的修改。 在SQLSERVER2008中,有三種類型的觸發(fā)器:(1)DML觸發(fā)器:是指觸發(fā)器在數(shù)據(jù)庫(kù)中發(fā)生數(shù)據(jù)操作語(yǔ)言(DML)事件時(shí)將啟用。DML事件即指在表或視圖中修改數(shù)據(jù)的insert、update、delete語(yǔ)句也。(2)DDL觸發(fā)器:是指當(dāng)服務(wù)器或數(shù)據(jù)庫(kù)中發(fā)生數(shù)據(jù)定義語(yǔ)言(DD
2、L)事件時(shí)將啟用。DDL事件即指在表或索引中的create、alter、drop語(yǔ)句也。(3)登陸觸發(fā)器:是指當(dāng)用戶登錄SQLSERVER實(shí)例建立會(huì)話時(shí)觸發(fā)?! 〔贿^(guò)根據(jù)DML觸發(fā)器觸發(fā)的方式不同又分為以下兩種情況:(1)AFTER觸發(fā)器:它是在執(zhí)行INSERT、UPDATE、DELETE語(yǔ)句操作之后執(zhí)行觸發(fā)器操作。它主要是用于記錄變更后的處理或檢查,一旦發(fā)生錯(cuò)誤,可以用RollbackTransaction語(yǔ)句來(lái)回滾本次扣件,不過(guò)不能對(duì)視圖定義AFTER觸發(fā)器。(2)INSTEADOF觸發(fā)器:它在執(zhí)行INSERT、UPDATE、DELETE語(yǔ)句操
3、作之前執(zhí)行觸發(fā)器本身所定義的操作。而INSTEADOF觸發(fā)器是可以定義在視圖上的。? 在SQLSERVER2008中,DML觸發(fā)器的實(shí)現(xiàn)使用兩個(gè)邏輯表DELETED和INSERTED。這兩個(gè)表是建立在數(shù)據(jù)庫(kù)服務(wù)器的內(nèi)存中,由系統(tǒng)管理的邏輯表,我們對(duì)于它只有只讀的權(quán)限。DELETED和INSERED表的結(jié)構(gòu)和觸發(fā)器所在的數(shù)據(jù)表的結(jié)構(gòu)是一樣的。當(dāng)觸發(fā)器執(zhí)行完成后,它們也就會(huì)被自動(dòng)刪除。INSERED表用于存放你在操件insert、update、delete語(yǔ)句后,更新的記錄。比如你插入一條數(shù)據(jù),那么就會(huì)把這條記錄插入到INSERTED表。DELETE
4、D表用于存放你在操作?insert、update、delete語(yǔ)句前,你創(chuàng)建觸發(fā)器表中數(shù)據(jù)庫(kù)。比如你原來(lái)的表中有三條數(shù)據(jù),那么他也有三條數(shù)據(jù)。下面我們就開始創(chuàng)建觸發(fā)器吧!觸發(fā)器定義的格式我就不打一遍,你打開幫助里有的事。我們先創(chuàng)建一張如下的表吧!然后以它為例吧。createtabletable1(user_idintprimarykeyidentity(1,1),user_namevarchar(3)notnull)下面就是創(chuàng)建一個(gè)簡(jiǎn)單的after觸發(fā)器:createtriggertrigMessageListontable1afterinsert
5、,updateasraiserror('數(shù)據(jù)一致性驗(yàn)證',16,1)此時(shí)如果我們手動(dòng)打開table1,輸入一條,根本就插入不了,我們只能寫一條如下的SQL語(yǔ)句插入一條數(shù)據(jù)insertintotable1(user_name)values('23')結(jié)果數(shù)據(jù)是插入成功了,但是會(huì)出顯如下圖所示的提示:下面我再創(chuàng)建一個(gè)稍微有點(diǎn)復(fù)雜的after觸發(fā)器:--該觸發(fā)器作用是:如果向table1中插入數(shù)據(jù)時(shí),--先檢查要向table1插入的這條的USER_ID是否USERS(我創(chuàng)建的另一個(gè)表)表中的USER_ID字段中有,如果不存在則不允許插入createtri
6、ggertrigInsertedMessagesontable1afterinsertasifexists(select*frominsertedawherea.user_idnotin(selectUSER_IDfromUSERS))beginraiserror('數(shù)據(jù)一致性驗(yàn)證',16,1)rollbacktransactionend?insertedof觸發(fā)器和after觸發(fā)器寫法差不多,在此就不多寫了。下面創(chuàng)建一個(gè)簡(jiǎn)單的DDL觸發(fā)器:--它的作用是:防止數(shù)據(jù)庫(kù)Test(我創(chuàng)建的一個(gè)實(shí)驗(yàn)數(shù)據(jù)庫(kù))中的任一表被修改或刪除createtrigger
7、trigDBondatabasefordrop_table,alter_tableasprint'你一定要禁用觸發(fā)器“trigDB"才能刪除或修改這個(gè)數(shù)據(jù)庫(kù)的表'rollback刪除觸發(fā)器:droptriggertrigDBONDATABASE一定要記得加上ONDATABASE這條,否則就刪除不了。最后再來(lái)?xiàng)l開啟和禁用觸發(fā)器的語(yǔ)句:disabletriggertrigDBondatabase--禁用觸發(fā)器enabletriggertrigDBondatabase--開啟觸發(fā)器一﹕觸發(fā)器是一種特殊的存儲(chǔ)過(guò)程﹐它不能被顯式地調(diào)用﹐而是在往表中插入記錄﹑
8、更新記錄或者刪除記錄時(shí)被自動(dòng)地激活。所以觸發(fā)器可以用來(lái)實(shí)現(xiàn)對(duì)表實(shí)施復(fù)雜的完整性約`束。???????? 二﹕SQLSer