在SQL中,名詞觸發(fā)器指“在數(shù)據(jù)庫(kù)中為響應(yīng)一個(gè)特殊表格中的某些事件而自動(dòng)執(zhí)行的程序代碼?!?Wikipedia)說得簡(jiǎn)單一些,它是在一個(gè)特殊的數(shù)據(jù)庫(kù)事件,如INSERT或DELETE發(fā)生時(shí),自動(dòng)激活的一段代碼。觸發(fā)器可方便地用于日志記錄、對(duì)單個(gè)表格到其他鏈接式表格進(jìn)行自動(dòng)的“層疊式”更改、或保證對(duì)表格關(guān)系進(jìn)行自動(dòng)更新。當(dāng)一個(gè)新整數(shù)值增加到數(shù)據(jù)庫(kù)域中時(shí),自動(dòng)更新運(yùn)行的總數(shù)的代碼段是一個(gè)觸發(fā)器。自動(dòng)記錄對(duì)一個(gè)特殊數(shù)據(jù)庫(kù)表格所作更改的SQL命令塊也是一個(gè)觸發(fā)器實(shí)例。
觸發(fā)器是MySQL 5.x的新功能,隨著5.x代碼樹新版本的出現(xiàn),這一功能也逐漸得到改善。在本文中,我將簡(jiǎn)單介紹如何定義并使用觸發(fā)器,查看觸發(fā)器狀態(tài),并如何在使用完畢后刪除觸發(fā)器。我還將為你展示一個(gè)觸發(fā)器在現(xiàn)實(shí)世界中的應(yīng)用實(shí)例,并檢驗(yàn)它對(duì)數(shù)據(jù)庫(kù)記錄的改變。
一個(gè)簡(jiǎn)單實(shí)例
通過簡(jiǎn)單(雖然是人為的)實(shí)例來說明是了解MySQL觸發(fā)器應(yīng)用的最佳辦法。首先我們建立兩個(gè)單域的表格。一個(gè)表格中為姓名列表(表格名:data),另一個(gè)表格中是所插入字符的字符數(shù)(表格名:chars)。我希望在data表格中定義一個(gè)觸發(fā)器,每次在其中插入一個(gè)新姓名時(shí),chars表格中運(yùn)行的總數(shù)就會(huì)根據(jù)新插入記錄的字符數(shù)目進(jìn)行自動(dòng)更新。(見列表A)
|
理解上面代碼的關(guān)鍵在于CREATE TRIGGER命令,它被用來定義一個(gè)新觸發(fā)器。這個(gè)命令建立一個(gè)新觸發(fā)器,假定的名稱為t1,每次有一個(gè)新記錄插入到data表格中時(shí),t1就被激活。
在這個(gè)觸發(fā)器中有兩個(gè)重要的子句:
AFTER INSERT子句表明觸發(fā)器在新記錄插入data表格后激活。
UPDATE chars SET count = count + CHAR_LENGTH(NEW.name)子句表示觸發(fā)器激活后執(zhí)行的SQL命令。在本例中,該命令表明用新插入的data.name域的字符數(shù)來更新chars.count欄。這一信息可通過內(nèi)置的MySQL函數(shù)CHAR_LENGTH()獲得。
放在源表格域名前面的NEW關(guān)鍵字也值得注意。這個(gè)關(guān)鍵字表明觸發(fā)器應(yīng)考慮域的new值(也就是說,剛被插入到域中的值)。MySQL還支持相應(yīng)的OLD前綴,可用它來指域以前的值。
你可以通過調(diào)用SHOW TRIGGER命令來檢查觸發(fā)器是否被激活,如列表B所示。
|
激活觸發(fā)器后,開始對(duì)它進(jìn)行測(cè)試。試著在data表格中插入幾個(gè)記錄:
|
然后檢查chars表格看觸發(fā)器是否完成它該完成的任務(wù):
|
如你所見,data表格中的INSERT命令激活觸發(fā)器,它計(jì)算插入記錄的字符數(shù),并將結(jié)果存儲(chǔ)在chars表格中。如果你往data表格中增加另外的記錄,chars.count值也會(huì)相應(yīng)增加。
觸發(fā)器應(yīng)用完畢后,可有DROP TRIGGER命令輕松刪除它。
|
注意:理想情況下,你還需要一個(gè)倒轉(zhuǎn)觸發(fā)器,每當(dāng)一個(gè)記錄從源表格中刪除時(shí),它從字符總數(shù)中減去記錄的字符數(shù)。這很容易做到,你可以把它當(dāng)作練習(xí)來完成。提示:應(yīng)用BEFORE DELETE ON子句是其中一種方法。
現(xiàn)在,我想建立一個(gè)審計(jì)記錄來追蹤對(duì)這個(gè)表格所做的改變。這個(gè)記錄將反映表格的每項(xiàng)改變,并向用戶說明由誰做出改變以及改變的時(shí)間。我需要建立一個(gè)新表格來存儲(chǔ)這一信息(表格名:audit),如下所示。(列表C)
|
接下來,我將在accounts表格中定義一個(gè)觸發(fā)器。(列表D)
|
如果你已經(jīng)走到這一步,就很容易理解。accounts表格每經(jīng)歷一次UPDATE,觸發(fā)器插入(INSERT)對(duì)應(yīng)記錄的id、新的余額、當(dāng)前時(shí)間和登錄audit表格的用戶的名稱。
新聞熱點(diǎn)
疑難解答
圖片精選