《MySQL數(shù)據(jù)庫應(yīng)用案例教程》651-5(馬潔)教案 第19課 觸發(fā)器_第1頁
《MySQL數(shù)據(jù)庫應(yīng)用案例教程》651-5(馬潔)教案 第19課 觸發(fā)器_第2頁
《MySQL數(shù)據(jù)庫應(yīng)用案例教程》651-5(馬潔)教案 第19課 觸發(fā)器_第3頁
《MySQL數(shù)據(jù)庫應(yīng)用案例教程》651-5(馬潔)教案 第19課 觸發(fā)器_第4頁
《MySQL數(shù)據(jù)庫應(yīng)用案例教程》651-5(馬潔)教案 第19課 觸發(fā)器_第5頁
已閱讀5頁,還剩7頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

PAGE12PAGE12PAGE11PAGE11

課題觸發(fā)器課時(shí)2課時(shí)(90min)教學(xué)目標(biāo)知識(shí)技能目標(biāo):(1)了解什么是觸發(fā)器(2)掌握創(chuàng)建觸發(fā)器的方法(3)掌握查看觸發(fā)器的方法(4)掌握使用觸發(fā)器的方法(5)掌握刪除觸發(fā)器的方法素質(zhì)目標(biāo):(1)了解數(shù)據(jù)庫前沿技術(shù),緊跟時(shí)代發(fā)展(2)了解數(shù)據(jù)庫的發(fā)展及主流國產(chǎn)數(shù)據(jù)庫的應(yīng)用,增強(qiáng)民族自豪感教學(xué)重難點(diǎn)教學(xué)重點(diǎn):觸發(fā)器的概念,創(chuàng)建、查看、使用、刪除觸發(fā)器的方法教學(xué)難點(diǎn):創(chuàng)建和使用觸發(fā)器的方法教學(xué)方法案例分析法、問答法、討論法、講授法、實(shí)踐法教學(xué)用具電腦、投影儀、多媒體課件、教材教學(xué)設(shè)計(jì)第1節(jié)課:→→→傳授新知(38min)第2節(jié)課:→傳授新知(20min)→課堂實(shí)訓(xùn)(15min)→課堂小結(jié)(3min)→作業(yè)布置(2min)教學(xué)過程主要教學(xué)內(nèi)容及步驟設(shè)計(jì)意圖第一節(jié)課課前任務(wù)【教師】布置課前任務(wù),和學(xué)生負(fù)責(zé)人取得聯(lián)系,讓其提醒同學(xué)通過文旌課堂APP或其他學(xué)習(xí)軟件,預(yù)習(xí)本節(jié)課要學(xué)習(xí)的知識(shí)【學(xué)生】完成課前任務(wù)通過課前任務(wù),使學(xué)生預(yù)習(xí)本節(jié)課要學(xué)習(xí)的知識(shí),增加學(xué)生的學(xué)習(xí)興趣考勤(2min)【教師】使用文旌課堂APP進(jìn)行簽到【學(xué)生】班干部報(bào)請假人員及原因培養(yǎng)學(xué)生的組織紀(jì)律性,掌握學(xué)生的出勤情況問題導(dǎo)入(5min)【教師】提出以下問題:觸發(fā)器的作用是什么?·通過問題導(dǎo)入,引導(dǎo)學(xué)生主動(dòng)思考,激發(fā)學(xué)生的學(xué)習(xí)興趣傳授新知(38min)【教師】通過學(xué)生的回答引入要講的知識(shí),講解應(yīng)用觸發(fā)器、創(chuàng)建觸發(fā)器的相關(guān)知識(shí)14.1為什么要應(yīng)用觸發(fā)器?【教師】隨機(jī)邀請學(xué)生回答以下問題:觸發(fā)器和存儲(chǔ)過程有什么區(qū)別??【學(xué)生】聆聽、思考、回答?【教師】總結(jié)學(xué)生的回答同存儲(chǔ)過程和函數(shù)類似,MySQL中的觸發(fā)器也是存儲(chǔ)在系統(tǒng)內(nèi)部的一段程序代碼,可以把它看作是一個(gè)特殊的存儲(chǔ)過程。所不同的是,觸發(fā)器無需人工調(diào)用,當(dāng)程序滿足定義條件時(shí)就會(huì)被MySQL自動(dòng)調(diào)用。這些條件可以稱為觸發(fā)事件,包括INSERT、UPDATE和DELETE操作。觸發(fā)器常被用在數(shù)據(jù)庫端確保數(shù)據(jù)的完整性。例如,在具體開發(fā)項(xiàng)目時(shí),常會(huì)遇到如下情況,當(dāng)在用戶表中插入一個(gè)新用戶后,用戶總數(shù)必須要自動(dòng)加1。就是在對表執(zhí)行某項(xiàng)操作后,需要自動(dòng)進(jìn)行一些處理。此時(shí)就可以使用觸發(fā)器處理數(shù)據(jù)庫對象,可以創(chuàng)建一個(gè)觸發(fā)器對象,每添加一條學(xué)生記錄,就執(zhí)行一次計(jì)算學(xué)生總數(shù)的操作,這樣可以保證每次添加學(xué)生記錄后,學(xué)生總數(shù)與學(xué)生記錄數(shù)一致。14.2創(chuàng)建觸發(fā)器創(chuàng)建觸發(fā)器的語法形式如下:CREATETRIGGERtrigger_nametrigger_timetrigger_eventONtable_nameFOREACHROWtrigger_body上述語句中,trigger_name表示觸發(fā)器的名稱。trigger_time表示觸發(fā)器的觸發(fā)時(shí)機(jī),可以取值為BEFORE或者AFTER,BEFORE是在檢查約束前觸發(fā),而AFTER是在檢查約束后觸發(fā)。trigger_event表示觸發(fā)事件,可以是INSERT、UPDATE或DELETE。table_name表示建立觸發(fā)器的表名。FOREACHROW表示數(shù)據(jù)表中任意一條記錄滿足觸發(fā)條件都會(huì)激活觸發(fā)器。trigger_body表示觸發(fā)器激活后執(zhí)行的SQL語句。【提示】觸發(fā)器只能創(chuàng)建在永久表(PermanentTable)上,不能創(chuàng)建在臨時(shí)表(TemporaryTable)上。從MySQL5.7.2開始,可以為一張表定義具有相同觸發(fā)事件和觸發(fā)時(shí)機(jī)的多個(gè)觸發(fā)器。默認(rèn)情況下,具有相同觸發(fā)事件和觸發(fā)時(shí)機(jī)的觸發(fā)器按其創(chuàng)建順序激活。本節(jié)按照觸發(fā)器觸發(fā)時(shí)機(jī)的不同,分為AFTER和BEFORE兩種情況,詳細(xì)介紹觸發(fā)器的創(chuàng)建。14.2.1創(chuàng)建AFTER觸發(fā)器?【教師】組織學(xué)生掃碼觀看“認(rèn)識(shí)并創(chuàng)建觸發(fā)器”視頻(詳見教材),讓學(xué)生對相關(guān)知識(shí)有一個(gè)大致了解AFTER觸發(fā)器是指觸發(fā)器監(jiān)視的觸發(fā)事件執(zhí)行之后,再激活觸發(fā)器,激活后所執(zhí)行的操作無法影響觸發(fā)器所監(jiān)視的事件。以買家購買商品為例,首先向訂單表中添加訂單記錄,再更新商品表中商品的數(shù)量,這種情況下無論商品是什么狀態(tài),訂單都已經(jīng)插入數(shù)據(jù)庫。AFTER觸發(fā)器可以根據(jù)所監(jiān)視的事件分為三種,分別是INSERT型、UPDATE型和DELETE型,下面分別介紹。1.INSERT型為便于操作,創(chuàng)建觸發(fā)器之前需要先創(chuàng)建兩張表。【實(shí)例14-1】參照表14-1和表14-2創(chuàng)建兩張表goods和orders。?【教師】通過多媒體展示“商品表(goods)結(jié)構(gòu)”和“訂單表(orders)結(jié)構(gòu)”表格,介紹相關(guān)知識(shí)表14-1商品表(goods)結(jié)構(gòu)字段名數(shù)據(jù)類型注釋idINT(11)商品編號(hào)nameVARCHAR商品名稱numINT(11)商品庫存表14-2訂單表(orders)結(jié)構(gòu)字段名數(shù)據(jù)類型注釋oidINT(11)訂單編號(hào)gidINT(11)購買商品編號(hào)amountINT(11)購買商品數(shù)量步驟1登錄MySQL,并選擇數(shù)據(jù)庫“test_db”。步驟2分別執(zhí)行以下SQL語句,創(chuàng)建兩張表goods和orders。創(chuàng)建goods表:CREATETABLEgoods(idINT(11)PRIMARYKEYAUTO_INCREMENT,nameVARCHAR(30)UNIQUE,numINT(11)DEFAULT0);創(chuàng)建orders表:CREATETABLEorders(oidINT(11)PRIMARYKEY,gidINT(11),amountINT(11));步驟3執(zhí)行以下SQL語句,向goods表中添加3條記錄,完成表的創(chuàng)建。INSERTINTOgoods(id,name,num)VALUES(1,'果粒橙',10),(2,'三元酸奶',10),(3,'加多寶',10);如果沒有為訂單表創(chuàng)建觸發(fā)器,每次買家下訂單,系統(tǒng)都需要執(zhí)行兩步操作:第一步是向訂單表中插入一條記錄,第二步是更新商品表中商品的庫存。如果為訂單表創(chuàng)建觸發(fā)器,就可以在向訂單表插入記錄的同時(shí)自動(dòng)更新商品表中商品的庫存。下面通過實(shí)例介紹觸發(fā)器的創(chuàng)建和應(yīng)用?!緦?shí)例14-2】為訂單表創(chuàng)建INSERT型觸發(fā)器,并驗(yàn)證其應(yīng)用。步驟1執(zhí)行SQL語句,為訂單表創(chuàng)建觸發(fā)器。SQL語句及其執(zhí)行結(jié)果如下:mysql>DELIMITER$$mysql>CREATETRIGGERtg1->AFTERINSERTONorders->FOREACHROW->BEGIN->UPDATEgoodsSETnum=num-1WHEREid=1;->END$$QueryOK,0rowsaffected(0.11sec)mysql>DELIMITER;步驟

2執(zhí)行SQL語句,在訂單表orders中插入一條記錄。SQL語句及其執(zhí)行結(jié)果如下:mysql>INSERTINTOorders(oid,gid,amount)VALUES(1,1,1);QueryOK,1rowaffected(0.03sec)步驟3執(zhí)行SQL語句,查看goods表中數(shù)據(jù)。SQL語句及其執(zhí)行結(jié)果如下:mysql>SELECT*FROMgoods;++++|id|name|num|++++|1|果粒橙|9||2|三元酸奶|10||3|加多寶|10|++++3rowsinset(0.02sec)由結(jié)果可以看出,goods表中果粒橙的庫存變?yōu)?,說明在插入一條訂單后,觸發(fā)器自動(dòng)執(zhí)行更新操作,將果粒橙的數(shù)量減去1。以上實(shí)例中,由于觸發(fā)器tg1里的num值和id值都是固定的,所以無論買家購買哪個(gè)商品,購買多少件商品,goods表中的變化都是第1件商品的數(shù)量減1。為使觸發(fā)器更加符合實(shí)際需求,接下來重新創(chuàng)建觸發(fā)器tg2,將訂單中的id值和num值傳到觸發(fā)器中,使goods表根據(jù)實(shí)際情況進(jìn)行更新?!緦?shí)例14-3】為訂單表重新創(chuàng)建觸發(fā)器,使其更符合實(shí)際需要。步驟

1執(zhí)行SQL語句,為訂單表創(chuàng)建觸發(fā)器tg2。SQL語句及其執(zhí)行結(jié)果如下:mysql>DELIMITER$$mysql>CREATETRIGGERtg2->AFTERINSERTONorders->FOREACHROW->BEGIN->UPDATEgoodsSETnum=num-NEW.amountWHEREid=NEW.gid;->END$$QueryOK,0rowsaffected(0.06sec)mysql>DELIMITER;對于INSERT型觸發(fā)器而言,新插入的行使用NEW表示,引用行中的字段值可以使用“NEW.字段名”。步驟

2激活觸發(fā)器tg2之前,需要先把觸發(fā)器tg1刪除。執(zhí)行以下SQL語句刪除觸發(fā)器tg1。DROPTRIGGERtg1;步驟3執(zhí)行以下SQL語句,向orders表中插入一條新記錄。INSERTINTOorders(oid,gid,amount)VALUES(2,2,3);步驟4執(zhí)行SQL語句,查看goods表。SQL語句及其執(zhí)行結(jié)果如下:mysql>SELECT*FROMgoods;++++|id|name|num|++++|1|果粒橙|9||2|三元酸奶|7||3|加多寶|10|++++3rowsinset(0.00sec)由結(jié)果可以看出,第2件商品的數(shù)量變?yōu)?,說明觸發(fā)器執(zhí)行更新操作所需的參數(shù)值會(huì)隨著觸發(fā)事件中插入值的改變而改變。2.UPDATE型依然以前面創(chuàng)建的商品表和訂單表為例進(jìn)行介紹。假設(shè)買家修改了訂單中的商品購買數(shù)量,系統(tǒng)首先需要修改orders表中的訂單記錄,然后goods表中對應(yīng)的商品庫存先要恢復(fù)為原來的數(shù)量,接著再減去新訂單中商品的數(shù)量?!緦?shí)例14-4】創(chuàng)建UPDATE型觸發(fā)器tg3,并驗(yàn)證其效果。步驟

1執(zhí)行SQL語句,為訂單表創(chuàng)建觸發(fā)器tg3。SQL語句及其執(zhí)行結(jié)果如下:mysql>DELIMITER$$mysql>CREATETRIGGERtg3->AFTERUPDATEONorders->FOREACHROW->BEGIN->UPDATEgoodsSETnum=num+OLD.amount-NEW.amountWHEREid=NEW.gid;->END$$QueryOK,0rowsaffected(0.07sec)mysql>DELIMITER;【提示】對于UPDATE型觸發(fā)器而言,修改操作之前的記錄使用OLD表示,引用此條記錄中的字段值可以使用“OLD.字段名”;修改操作后的記錄使用NEW表示,引用此條記錄中的字段值可以使用“NEW.字段名”。步驟2執(zhí)行以下SQL語句,修改orders表中的第2條記錄。UPDATEordersSETamount=5WHEREoid=2;步驟3執(zhí)行SQL語句,查看goods表中的記錄。SQL語句及其執(zhí)行結(jié)果如下:mysql>SELECT*FROMgoods;++++|id|name|num|++++|1|果粒橙|9||2|三元酸奶|5||3|加多寶|10|++++3rowsinset(0.00sec)由查詢結(jié)果可以看出,當(dāng)訂單中第2條記錄中第2種商品的購買數(shù)量修改為5后,goods表中第2種商品的庫存修改為5,這說明觸發(fā)器tg3已經(jīng)生效。3.DELETE型依然以前面創(chuàng)建的商品表和訂單表為例進(jìn)行介紹。假設(shè)買家直接取消訂單,系統(tǒng)要執(zhí)行的操作是先刪除orders表中的訂單,然后goods表中對應(yīng)的商品數(shù)量要恢復(fù)為原來的值。【實(shí)例14-5】為orders表創(chuàng)建DELETE型觸發(fā)器tg4,并驗(yàn)證其效果。步驟1執(zhí)行SQL語句,創(chuàng)建觸發(fā)器tg4。SQL語句及其執(zhí)行結(jié)果如下:mysql>DELIMITER$$mysql>CREATETRIGGERtg4->AFTERDELETEONorders->FOREACHROW->BEGIN->UPDATEgoodsSETnum=num+OLD.amountWHEREid=OLD.gid;->END$$QueryOK,0rowsaffected(0.06sec)mysql>DELIMITER;對于DELETE型觸發(fā)器而言,被刪除的一行記錄使用OLD表示,引用此條記錄中的字段值可以使用“OLD.字段名”。步驟2執(zhí)行以下SQL語句,刪除orders表中的第2條記錄。DELETEFROMordersWHEREoid=2;步驟3執(zhí)行SQL語句,查看goods表中的記錄。SQL語句及其執(zhí)行結(jié)果如下:mysql>SELECT*FROMgoods;++++|id|name|num|++++|1|果粒橙|9||2|三元酸奶|10||3|加多寶|10|++++3rowsinset(0.00sec)由結(jié)果可以看出,goods表中第2種商品的庫存恢復(fù)為10,這說明觸發(fā)器tg4已經(jīng)生效。14.2.2創(chuàng)建BEFORE觸發(fā)器?【教師】組織學(xué)生掃碼觀看“創(chuàng)建BEFORE觸發(fā)器”視頻(詳見教材),讓學(xué)生對相關(guān)知識(shí)有一個(gè)大致了解BEFORE觸發(fā)器是指觸發(fā)器在所監(jiān)視的觸發(fā)事件執(zhí)行之前激活,激活后執(zhí)行的操作先于監(jiān)視的事件,這樣就有機(jī)會(huì)進(jìn)行一些判斷,或修改即將發(fā)生的操作。?【教師】隨機(jī)邀請學(xué)生回答以下問題:觸發(fā)器有哪些類型??【學(xué)生】聆聽、思考、回答?【教師】總結(jié)學(xué)生的回答B(yǎng)EFORE觸發(fā)器也可以根據(jù)監(jiān)視事件分為三種,分別是INSERT型、UPDATE型和DELETE型,本節(jié)主要講解INSERT型。依然以前面創(chuàng)建的商品表和訂單表為例進(jìn)行介紹。假設(shè)訂單中某商品的數(shù)量大于goods表中所對應(yīng)商品的總量,goods表中的商品庫存會(huì)出現(xiàn)負(fù)數(shù)。為避免這類問題,可以創(chuàng)建BEFORE觸發(fā)器,這種情況下,系統(tǒng)會(huì)先判斷訂單中商品的購買數(shù)量,如果大于庫存,則拋出異常,終止操作。【實(shí)例14-6】為orders表創(chuàng)建BEFORE觸發(fā)器tg5。步驟1執(zhí)行SQL語句,創(chuàng)建觸發(fā)器tg5。SQL語句及其執(zhí)行結(jié)果如下:mysql>DELIMITER$$mysql>CREATETRIGGERtg5->BEFOREINSERTONorders->FOREACHROW->BEGIN->DECLAREmsgVARCHAR(200);->UPDATEgoodsSETnum=num-NEW.amountWHEREid=NEW.gidANDnum>=NEW.amount;->IFROW_COUNT()<>1THEN->SELECTCONCAT(name,'庫存不足')INTOmsgFROMgoodsWHEREid=NEW.gid;->SIGNALSQLSTATE'TX000'SETMESSAGE_TEXT=msg;->ENDIF;->END$$QueryOK,0rowsaffected(0.16sec)mysql>DELIMITER;【提示】ROW_COUNT()函數(shù)用于記錄更新操作影響的行數(shù),如果其值不等于1,就說明訂單中商品的數(shù)量大于庫存數(shù)量,goods表沒有更新,此時(shí)將執(zhí)行下面的語句,將“商品名+庫存不足”賦給變量msg。SIGNAL語句用于在存儲(chǔ)程序(例如存儲(chǔ)過程、存儲(chǔ)函數(shù)、觸發(fā)器或事件)中向調(diào)用者返回錯(cuò)誤或警告條件。此外,它還提供對錯(cuò)誤特征(錯(cuò)誤編號(hào),SQLSTATE值,消息)的控制。步驟2執(zhí)行SQL語句,在orders表中新增一條訂單記錄。SQL語句及其執(zhí)行結(jié)果如下:mysql>INSERTINTOorders(gid,amount)VALUES(3,20);ERROR1644(TX000):加多寶庫存不足步驟3執(zhí)行SQL語句,查看goods表,結(jié)果如下:mysql>SELECT*FROMgoods;++++|id|name|num|++++|1|果粒橙|9||2|三元酸奶|10||3|加多寶|10|++++3rowsinset(0.00sec)由查詢結(jié)果可以看出,訂單中商品的購買數(shù)量大于庫存,訂單不會(huì)被插入orders表,goods表中的商品庫存也不會(huì)改變。14.2.3使用圖形化工具創(chuàng)建觸發(fā)器使用NavicatforMySQL可以非常方便地創(chuàng)建觸發(fā)器,具體操作如下:步驟1使用NavicatforMySQL連接MySQL后,雙擊需要操作的數(shù)據(jù)庫“test_db”。步驟2選中需要?jiǎng)?chuàng)建觸發(fā)器的表orders,單擊“設(shè)計(jì)表”按鈕,然后選擇“觸發(fā)器”選項(xiàng)卡。步驟

3單擊“添加觸發(fā)器”按鈕,填寫觸發(fā)器的名稱及其特性,然后在“定義”編輯區(qū)填寫觸發(fā)器激活后需執(zhí)行的SQL語句,最后單擊“保存”按鈕即可?!ㄔ斠娊滩模緦W(xué)生】聆聽、思考、記錄通過教師的講解和演示,使學(xué)生了解應(yīng)用觸發(fā)器、創(chuàng)建觸發(fā)器的相關(guān)知識(shí)第二節(jié)課問題導(dǎo)入(5min)【教師】提出以下問題:如何查看創(chuàng)建好的觸發(fā)器?【學(xué)生】思考、舉手回答通過問題導(dǎo)入,引導(dǎo)學(xué)生主動(dòng)思考,激發(fā)學(xué)生的學(xué)習(xí)興趣傳授新知(20min)【教師】通過學(xué)生的回答引入新知,介紹查看和刪除觸發(fā)器的相關(guān)知識(shí)14.3查看觸發(fā)器?【教師】組織學(xué)生掃碼觀看“查看和刪除觸發(fā)器”視頻(詳見教材),讓學(xué)生對相關(guān)知識(shí)有一個(gè)大致了解在MySQL中,查看觸發(fā)器有兩種方法,一種是使用SHOWTRIGGERS語句,一種是在information_schema數(shù)據(jù)庫的triggers表中查看觸發(fā)器的詳細(xì)信息。14.3.1查看觸發(fā)器在MySQL中,對同一個(gè)表相同觸發(fā)時(shí)機(jī)的相同觸發(fā)事件,只能定義一個(gè)觸發(fā)器。例如,對于某個(gè)表的不同字段的AFTER更新觸發(fā)器,只能定義成一個(gè)觸發(fā)器,在觸發(fā)器中通過判斷更新的字段進(jìn)行相應(yīng)的處理。所以在創(chuàng)建觸發(fā)器之前,最好能夠查看MySQL中是否已經(jīng)存在該觸發(fā)器。使用SHOWTRIGGERS語句可以查看MySQL中已經(jīng)存在的觸發(fā)器,基本語法形式如下:SHOWTRIGGERS\G【實(shí)例14-7】執(zhí)行SQL語句,查看MySQL中已經(jīng)存在的觸發(fā)器,結(jié)果如下:mysql>SHOWTRIGGERS\G***************************1.row***************************Trigger:tg5Event:INSERTTable:ordersStatement:BEGINDECLAREmsgVARCHAR(200);UPDATEgoodsSETnum=num-NEW.amountWHEREid=NEW.gidANDnum>=NEW.amount;IFROW_COUNT()<>1THENSELECTCONCAT(name,'庫存不足')INTOmsgFROMgoodsWHEREid=NEW.gid;SIGNALSQLSTATE'TX000'SETMESSAGE_TEXT=msg;ENDIF;ENDTiming:BEFORECreated:2018-06-1711:19:48.81sql_mode:STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTIONDefiner:root@localhostcharacter_set_client:gbkcollation_connection:gbk_chinese_ciDatabaseCollation:utf8_general_ci***************************2.row***************************Trigger:tg2Event:INSERTTable:ordersStatement:BEGINUPDATEgoodsSETnum=num-new.amountWHEREid=new.gid;ENDTiming:AFTERCreated:2018-06-1511:11:42.81sql_mode:STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTIONDefiner:root@localhostcharacter_set_client:gbkcollation_connection:gbk_chinese_ciDatabaseCollation:utf8_general_ci由執(zhí)行結(jié)果可以看出,執(zhí)行SHOWTRIGGERS語句后,前面定義的所有觸發(fā)器的信息都顯示出來,由于篇幅原因,此處只給出了前兩條信息。查詢結(jié)果中主要參數(shù)及其意義如下:Trigger:表示觸發(fā)器名稱。Event:表示觸發(fā)器的激活事件,如INSERT,UPDATE或DELETE。Table:表示定義觸發(fā)器的表。Statement:表示觸發(fā)器體,即觸發(fā)器激活時(shí)執(zhí)行的語句。Timing:表示觸發(fā)器的觸發(fā)時(shí)機(jī)。值為BEFORE或AFTER。使用SHOWTRIGGERS語句不僅可以查看所有觸發(fā)器,也可以查看某個(gè)表上創(chuàng)建的觸發(fā)器,其基本語法格式如下:SHOWTRIGGERSFROMdb_nameLIKE'table_name'\G其中db_name表示數(shù)據(jù)庫名,table_name表示表名。另外,如果用戶需要精確查看某一個(gè)觸發(fā)器,也可以使用SHOWTRIGGERS語句,其基本語法格式如下:SHOWTRIGGERSWHERE`TRIGGER`LIKE'trigger_name%'\G【實(shí)例14-8】執(zhí)行SQL語句,查看觸發(fā)器tg3,SQL語句及其執(zhí)行結(jié)果如下:mysql>SHOWTRIGGERSWHERE`TRIGGER`LIKE'tg3%'\G***************************1.row***************************Trigger:tg3Event:UPDATETable:ordersStatement:BEGINUPDATEgoodsSETnum=num+OLD.amount-NEW.amountWHEREid=NEW.gid;ENDTiming:AFTERCreated:2018-06-1513:50:49.91sql_mode:STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTIONDefiner:root@localhostcharacter_set_client:gbkcollation_connection:gbk_chinese_ciDatabaseCollation:utf8_general_ci1rowinset(0.00sec)【提示】精確查看某一個(gè)觸發(fā)器時(shí),WHERE子句中的列名TRIGGER需要使用反引號(hào)“`”,該符號(hào)位于鍵盤左上角。14.3.2查看觸發(fā)器的詳細(xì)信息MySQL中所有觸發(fā)器的定義都存儲(chǔ)在系統(tǒng)數(shù)據(jù)庫information_schema中的triggers表中,可以通過查詢語句SELECT查看,具體語法形式如下:SELECT*FROMinformation_schema.triggersWHEREtrigger_name='tri_name';【實(shí)例14-9】通過SELECT語句查看觸發(fā)器tg5,SQL語句及其執(zhí)行結(jié)果如下:mysql>SELECT*FROMinformation_schema.triggersWHEREtrigger_name='tg5'\G***************************1.row***************************TRIGGER_CATALOG:defTRIGGER_SCHEMA:test_dbTRIGGER_NAME:tg5EVENT_MANIPULATION:INSERTEVENT_OBJECT_CATALOG:defEVENT_OBJECT_SCHEMA:test_dbEVENT_OBJECT_TABLE:ordersACTION_ORDER:1ACTION_CONDITION:NULLACTION_STATEMENT:BEGINDECLAREmsgVARCHAR(200);UPDATEgoodsSETnum=num-NEW.amountWHEREid=NEW.gidANDnum>=NEW.amount;IFROW_COUNT()<>1THENSELECTCONCAT(name,'庫存不足')INTOmsgFROMgoodsWHEREid=NEW.gid;SIGNALSQLSTATE'TX000'SETMESSAGE_TEXT=msg;ENDIF;ENDACTION_ORIENTATION:ROWACTION_TIMING:BEFOREACTION_REFERENCE_OLD_TABLE:NULLACTION_REFERENCE_NEW_TABLE:NULLACTION_REFERENCE_OLD_ROW:OLDACTION_REFERENCE_NEW_ROW:NEWCREATED:2018-06-1711:19:48.81SQL_MODE:STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTIONDEFINER:root@localhostCHARACTER_SET_CLIENT:gbkCOLLATION_CONNECTION:gbk_chinese_ciDATABASE_COLLATION:utf8_general_ci1rowinset(0.03sec)其中的主要參數(shù)及其意義如下:TRIGGER_SCHEMA:表示觸發(fā)器所屬數(shù)據(jù)庫。TRIGGER_NAME:表示觸發(fā)器名。EVENT_MANIPULATION:表示觸發(fā)器的激活事件。EVENT_OBJECT_TABLE:表示觸發(fā)器所屬數(shù)據(jù)表。ACTION_ORIENTATION:表示每條記錄發(fā)生改變都會(huì)激活觸發(fā)器。ACTION_TIMING:表示觸發(fā)器執(zhí)行的時(shí)機(jī)。CREATED:表示觸發(fā)器創(chuàng)建時(shí)間。14.4刪除觸發(fā)器14.4.1刪除觸發(fā)器使用DROPTRIGGER語句可以刪除MySQL中定義的觸發(fā)器,基本語法形式如下:DROPTRIGGERdata_name.trigger_name;上述語句中,data_name表示數(shù)據(jù)庫名,trigger_name表示觸發(fā)器名?!緦?shí)例14-10】執(zhí)行SQL語句,刪除觸發(fā)器tg3,SQL語句及其執(zhí)行結(jié)果如下:mysql>DROPTRIGGERtest_db.tg3;QueryOK,0rowsaffected(0.04sec)使用SHOWTRIGGERS語句查詢觸發(fā)器tg3,驗(yàn)證刪除結(jié)果,SQL語句及其執(zhí)行結(jié)果如下:mysql>SHOWTRIGGERSWHERE`TRIGGER`LIKE'tg3%'\GEmptyset(0.00sec)由結(jié)果可以看出,觸發(fā)器tg3沒有查詢到,說明已經(jīng)被刪除。14.4.2使用圖形化工具查看和刪除觸發(fā)器使用NavicatforMySQL可以非常方便地查看和刪除觸發(fā)器,具體操作如下:步驟

1使用NavicatforMySQL連接MySQ

溫馨提示

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

評論

0/150

提交評論