Trigger
FOR STATEMENT 觸發器的實際用途是什麼?
我非常了解觸發器背後的想法,以及如何以及何時使用它們。
我也看到了
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 億行的操作是不可行的
- 您想記錄任何人對錶進行更新的任何時間,但您不關心更新是什麼,也不關心受影響的行數。