涂 鐵
安徽商貿職業技術學院 安徽 蕪湖241000
觸發器是SQLite數據庫教學中的重難點內容之一,初學者往往很難真正理解掌握其原理,本文從案例圖解的角度去對教學方式進行探究,以幫助學生更好地使用觸發器完成相關操作。
觸發器作為一種特殊的回調函數,其與表緊密相連,可以理解成表的一個部分,當數據表中的數據進行了任何修改之后立即激活。其主要用來保證引用完整性或相應的業務規則,
SQLite 只支持FOR EACH ROW 觸發器(行級觸發器),不支持FOR EACH STATEMENT觸發器(語句觸發器),下文以實際案例來講解如何剖析觸發器的實際教學過程。
案例:學生成績數據庫中學生表與成績表之間的觸發關系研究(引用完整性)

圖1 源表中的數據
根據筆者多年的教學經驗,很多學生無法正確的理解觸發器是建立在學生表還是成績表上。對于這種情況,一定要讓學生理解正確的邏輯關系,也就是要強調主從關系。對于這兩個表來說,引用完整性體現在Studentno列上,而Studentno列對于Student表來說首先它是唯一主鍵,其次在實際的業務關系中學號的修改通常只能學生表中完成.而Score表中的Studentno列中的值有重復值,如果在這個地方修改Studentno的值的話,只能修改特定的記錄行中Studentno。其他記錄行中Studentno不會發生變化。從上述角度出發,觸發器只能建立在Student上,如果建立在Score表上則會導致邏輯上的錯亂,也就是Student表是主表,而Score表是從表。
部分學生對于觸發器中觸發的概念一直難以理解。在教學過程中,一方面可以從觸發這個詞的中文定義來講解。觸發指因觸動而激發起某種反應,對于表來說,在它上面建立觸發器意味著當在表上進行相應的操作會引起某種連鎖反應,這種連鎖反應既可以體現在表自身也可以體現在其它表上。對于抽象概念的講解,以現實生活中的可見實例更容易讓學生理解。在講解觸發這個概念時,如果用按門鈴---門鈴響這個生活中的常見事件,學生能夠很直觀的感受到這種過程。按門鈴這個動作就相當于我們的觸發動作,而門鈴響實際上就是連鎖反應的結果。如果墻上或者門上沒有裝門鈴,無論怎么按都不會有任何結果,這就相當于表上沒有建立觸發器,那么你對表的相關操作就不會有對應的連鎖反應,即使裝了門鈴,你沒按到按扭它也不會響,說明不是對表的所有操作都是觸發行為。通過這種生活事件的代入能夠更好的讓學生理解特定知識點,這也是在各種教學中重點需要使用的手段。
對于觸發器來說,其作用機制實際上依賴于NEW表和OLD表這兩個虛擬表,在實際教學過程中,學生對這兩個表的作用以及其與原表之間的數據變換往往難以準確掌握,這時候如果用圖解的方式更容易讓學生理解他們的作用機制。示例觸發器各表數據變化示例圖:

圖2 觸發示意圖

圖3 觸發數據傳遞示意圖
從上圖可見,NEW表、OLD表和Student表在表結構是完全一致的,從某種意義上來說這兩個表就是按照Student表的結構作了兩個臨時復制品,用來存放變更的數據。OLD 表用于存儲DELETE和UPDATE語句所影響的行的副本。NEW表用于存儲INSERT和UPDATE語句所影響的行的副本。
同時,要給學生強調在數據庫表中的UPDATE操作實際上是由的DELETE操作和INSERT操作組成的,也就是說一個更新操作實際上是先將某一行中的數據先刪除掉再插入新的數據。對于大多數初學者來說,由于對這個過程不是很清楚,也就無法正確的理解NEW表和OLD表的作用。為了讓學生能夠準確的掌握各種觸發器和NEW表以及OLD表的對應關系,還可以通過以下圖示的形式來加深他們的記憶:

圖4 各觸發器與NEW表與OLD表對應關系示意圖
例:創建一個觸發器,當更改某位同學的學號時,成績表中的記錄行能同步更新。
示例程序:

在講解上述題目時首先要明確這是一個什么樣的觸發器,在這個地方要讓學生仔細的閱讀題目。如上所示,在題干中出現了更改和更新等字樣,這意味著這是一個更新觸發器。其次要讓學生明確觸發器是建立在Student表上,這樣它們在創建觸發器的時候就會明晰對應的SQL語句,同時要讓學生注意創建觸發器時只有BEGIN與END之間的SQL語句結尾處有分號,這也是它們在書寫SQL語句經常容易犯的錯誤。
更改過后的表中的數據如下:
本文從原理、結構、應用等方面對SQLite數據庫中觸發器的使用進行了探討,并著重強調了在課堂教學中需要注意的問題。上述思路實際運用到安徽商貿職業技術學院移動數據庫技術課程的教學過程中。實踐表明,該方法可以幫助學生掌握更為輕松的掌握觸發器的實現過程,提高了學生的學習效率。

圖5 觸發過后表中數據