涂 鐵
安徽商貿(mào)職業(yè)技術(shù)學(xué)院 安徽 蕪湖241000
觸發(fā)器是SQLite數(shù)據(jù)庫教學(xué)中的重難點內(nèi)容之一,初學(xué)者往往很難真正理解掌握其原理,本文從案例圖解的角度去對教學(xué)方式進行探究,以幫助學(xué)生更好地使用觸發(fā)器完成相關(guān)操作。
觸發(fā)器作為一種特殊的回調(diào)函數(shù),其與表緊密相連,可以理解成表的一個部分,當(dāng)數(shù)據(jù)表中的數(shù)據(jù)進行了任何修改之后立即激活。其主要用來保證引用完整性或相應(yīng)的業(yè)務(wù)規(guī)則,
SQLite 只支持FOR EACH ROW 觸發(fā)器(行級觸發(fā)器),不支持FOR EACH STATEMENT觸發(fā)器(語句觸發(fā)器),下文以實際案例來講解如何剖析觸發(fā)器的實際教學(xué)過程。
案例:學(xué)生成績數(shù)據(jù)庫中學(xué)生表與成績表之間的觸發(fā)關(guān)系研究(引用完整性)
圖1 源表中的數(shù)據(jù)
根據(jù)筆者多年的教學(xué)經(jīng)驗,很多學(xué)生無法正確的理解觸發(fā)器是建立在學(xué)生表還是成績表上。對于這種情況,一定要讓學(xué)生理解正確的邏輯關(guān)系,也就是要強調(diào)主從關(guān)系。對于這兩個表來說,引用完整性體現(xiàn)在Studentno列上,而Studentno列對于Student表來說首先它是唯一主鍵,其次在實際的業(yè)務(wù)關(guān)系中學(xué)號的修改通常只能學(xué)生表中完成.而Score表中的Studentno列中的值有重復(fù)值,如果在這個地方修改Studentno的值的話,只能修改特定的記錄行中Studentno。其他記錄行中Studentno不會發(fā)生變化。從上述角度出發(fā),觸發(fā)器只能建立在Student上,如果建立在Score表上則會導(dǎo)致邏輯上的錯亂,也就是Student表是主表,而Score表是從表。
部分學(xué)生對于觸發(fā)器中觸發(fā)的概念一直難以理解。在教學(xué)過程中,一方面可以從觸發(fā)這個詞的中文定義來講解。觸發(fā)指因觸動而激發(fā)起某種反應(yīng),對于表來說,在它上面建立觸發(fā)器意味著當(dāng)在表上進行相應(yīng)的操作會引起某種連鎖反應(yīng),這種連鎖反應(yīng)既可以體現(xiàn)在表自身也可以體現(xiàn)在其它表上。對于抽象概念的講解,以現(xiàn)實生活中的可見實例更容易讓學(xué)生理解。在講解觸發(fā)這個概念時,如果用按門鈴---門鈴響這個生活中的常見事件,學(xué)生能夠很直觀的感受到這種過程。按門鈴這個動作就相當(dāng)于我們的觸發(fā)動作,而門鈴響實際上就是連鎖反應(yīng)的結(jié)果。如果墻上或者門上沒有裝門鈴,無論怎么按都不會有任何結(jié)果,這就相當(dāng)于表上沒有建立觸發(fā)器,那么你對表的相關(guān)操作就不會有對應(yīng)的連鎖反應(yīng),即使裝了門鈴,你沒按到按扭它也不會響,說明不是對表的所有操作都是觸發(fā)行為。通過這種生活事件的代入能夠更好的讓學(xué)生理解特定知識點,這也是在各種教學(xué)中重點需要使用的手段。
對于觸發(fā)器來說,其作用機制實際上依賴于NEW表和OLD表這兩個虛擬表,在實際教學(xué)過程中,學(xué)生對這兩個表的作用以及其與原表之間的數(shù)據(jù)變換往往難以準(zhǔn)確掌握,這時候如果用圖解的方式更容易讓學(xué)生理解他們的作用機制。示例觸發(fā)器各表數(shù)據(jù)變化示例圖:
圖2 觸發(fā)示意圖
圖3 觸發(fā)數(shù)據(jù)傳遞示意圖
從上圖可見,NEW表、OLD表和Student表在表結(jié)構(gòu)是完全一致的,從某種意義上來說這兩個表就是按照Student表的結(jié)構(gòu)作了兩個臨時復(fù)制品,用來存放變更的數(shù)據(jù)。OLD 表用于存儲DELETE和UPDATE語句所影響的行的副本。NEW表用于存儲INSERT和UPDATE語句所影響的行的副本。
同時,要給學(xué)生強調(diào)在數(shù)據(jù)庫表中的UPDATE操作實際上是由的DELETE操作和INSERT操作組成的,也就是說一個更新操作實際上是先將某一行中的數(shù)據(jù)先刪除掉再插入新的數(shù)據(jù)。對于大多數(shù)初學(xué)者來說,由于對這個過程不是很清楚,也就無法正確的理解NEW表和OLD表的作用。為了讓學(xué)生能夠準(zhǔn)確的掌握各種觸發(fā)器和NEW表以及OLD表的對應(yīng)關(guān)系,還可以通過以下圖示的形式來加深他們的記憶:
圖4 各觸發(fā)器與NEW表與OLD表對應(yīng)關(guān)系示意圖
例:創(chuàng)建一個觸發(fā)器,當(dāng)更改某位同學(xué)的學(xué)號時,成績表中的記錄行能同步更新。
示例程序:
在講解上述題目時首先要明確這是一個什么樣的觸發(fā)器,在這個地方要讓學(xué)生仔細的閱讀題目。如上所示,在題干中出現(xiàn)了更改和更新等字樣,這意味著這是一個更新觸發(fā)器。其次要讓學(xué)生明確觸發(fā)器是建立在Student表上,這樣它們在創(chuàng)建觸發(fā)器的時候就會明晰對應(yīng)的SQL語句,同時要讓學(xué)生注意創(chuàng)建觸發(fā)器時只有BEGIN與END之間的SQL語句結(jié)尾處有分號,這也是它們在書寫SQL語句經(jīng)常容易犯的錯誤。
更改過后的表中的數(shù)據(jù)如下:
本文從原理、結(jié)構(gòu)、應(yīng)用等方面對SQLite數(shù)據(jù)庫中觸發(fā)器的使用進行了探討,并著重強調(diào)了在課堂教學(xué)中需要注意的問題。上述思路實際運用到安徽商貿(mào)職業(yè)技術(shù)學(xué)院移動數(shù)據(jù)庫技術(shù)課程的教學(xué)過程中。實踐表明,該方法可以幫助學(xué)生掌握更為輕松的掌握觸發(fā)器的實現(xiàn)過程,提高了學(xué)生的學(xué)習(xí)效率。
圖5 觸發(fā)過后表中數(shù)據(jù)