Trigger

FOR STATEMENT 觸發器的實際用途是什麼?

  • February 23, 2019

我非常了解觸發器背後的想法,以及如何以及何時使用它們。

我也看到了FOR EACH ROW觸發器的實際用途。

但是我找不到一個具體的例子來說明何時使用FOR STATEMENT觸發器。我能用它做什麼?

誰能給我一個在現實生活中使用它的例子嗎?

我不能說所有支持語句級觸發器的數據庫平台,但 DB2 LUW 還支持行級觸發器和語句級觸發器。

參考 DB2 LUW 的文件(突出顯示我的) -指定觸發觸發器的原因(觸發語句或事件)

當觸發器被啟動時,它會根據其粒度級別執行,如下所示:

每一行

它執行的次數與受影響行集中的行數一樣多。

如果您需要引用受觸發操作影響的特定行,請使用 FOR EACH ROW 粒度。這方面的一個範例是在 AFTER UPDATE 觸發器中比較更新行的新值和舊值。

對於每個聲明

它為整個觸發事件執行一次。

如果受影響的行集為空(即,在 WHERE 子句未限定任何行的搜尋 UPDATE 或 DELETE 的情況下),則 FOR EACH ROW 觸發器不會執行。但是 FOR EACH STATEMENT 觸發器仍然執行一次。


例如,可以使用FOR EACH ROW來計算員工人數。

CREATE TRIGGER NEW_HIRED 
 AFTER INSERT ON EMPLOYEE 
 FOR EACH ROW
 UPDATE COMPANY_STATS SET NBEMP = NBEMP + 1 

通過使用FOR EACH STATEMENT的粒度,您可以通過一次更新獲得相同的效果。

CREATE TRIGGER NEW_HIRED 
 AFTER INSERT ON EMPLOYEE 
 REFERENCING NEW_TABLE AS NEWEMPS 
 FOR EACH STATEMENT
 UPDATE COMPANY_STATS 
 SET NBEMP = NBEMP + (SELECT COUNT(*) FROM NEWEMPS) 

為什麼您可能希望在行級觸發器上使用語句級觸發器的一些範例:

  • 您想記錄更新了多少行,但不一定關心更新了哪些行
  • 您希望在針對錶執行語句時執行操作,即使沒有更新任何行
  • 您的表有 400 億行,有時會針對錶的 10% 進行更新。由於資源限制,一次記錄 40 億行的操作是不可行的
  • 您想記錄任何人對錶進行更新的任何時間,但您不關心更新是什麼,也不關心受影響的行數。

引用自:https://dba.stackexchange.com/questions/230500