會通資訊|ArgoERP 提供全方位數位化轉型方案|立即諮詢相關資訊!

TOP

ArgoERP

Aug. 1 2022

深入探究 COMPOUND TRIGGER

作者:Sean

在先前七月份電子報文章「淺談Oracle資料庫觸發器」當中,我們初步介紹了Oracle觸發器,可以了解有兩種形式Row Trigger (逐列觸發) 與 Statement Trigger (敘述語句觸發)。觸發器看似方便,卻也是開發團隊的雙面刃,一來容易造成維護成本增加,二來開發時要注意避免觸發器的工作會觸發另一個觸發器,進而造成難以追蹤的連鎖效應,對資料庫造成效能上的影響。

在實務面上,我們管理財務資料沖銷時,須注意沖銷金額是否大於立帳金額,又必須做到即時且全面管控時,常常仰賴觸發器的協助,需要逐列觸發,又需要針對表格進行DML,此時會發現Row Trigger (逐列觸發) 與 Statement Trigger (敘述語句觸發)受限於Oracle DB本身開發上限制,兩者無法共存,使得開發者必須將兩者分開撰寫與獨立管理。

然而Oracle 11G 提供了一項便捷的觸發器,Compound Trigger,又可稱做複合式觸發器。此功能既是Row Trigger (逐列觸發)又是Statement Trigger (敘述語句觸發)。有了Compound Trigger之後,可以為我們大大減低維護上困擾,只需要一個觸發器就可以定義完全部的四個功能,使Compound Trigger可以讓我們同時進行下列四種觸發層級:

●觸發執行語句之前(BEFORE STATEMENT)
●觸發語句中的每一行發生變化之前(BEFORE EACH ROW)
●觸發語句中的每一行發生變化之後(AFTER EACH ROW)
●觸發執行語句之後(AFTER STATEMENT)

我們透過實例,進一步了解Compound Trigger,假設要檢查付款金額是否已大於立帳金額,我們可以這麼做:

從上面例子當中可以觀察到,Compound Trigger可以結合兩種類型的Trigger,快速且有效的從每一筆資料異動當中,檢查當前表格沖銷金額是否已大於立帳金額。

此外,Compound Trigger可以協助我們處理大量資料,而在處理大量資料過程當中,我們更可以透過Oracle DB 功能[bulk collect]以及[forall],可協助我們更有效率的進行處理資料,這兩個工具都可以加強SQL引擎到PL/SQL引擎的交换,BULK COLLECT,可以更加快速且有效率的協助DB對數據的檢索,而FORALL,可以幫助改進INSERT、UPDATE和DELETE對於DB操作的效能,其概念如下:


整體而言,Compound Trigger這工具,對於改善DB效能以及降低維護人員負擔扮演著功不可沒的角色,透過文章分享,希望有助於維護人員有不同思維去建構及維護資料。


(02)2521-2589#110
winnie@argotek.com.tw

 

成功!
感謝您訂閱會通電子報
OK
成功!
您已取消訂閱會通電子報
OK