我非常了解触发器背后的想法、如何以及何时使用它们。
我还看到了触发器的实际用途FOR EACH ROW。
但我找不到何时使用触发器的具体示例FOR STATEMENT。我能用它做什么?
谁能给我一个现实生活中使用它的例子吗?
我无法谈论所有支持语句级触发器的数据库平台,但 DB2 LUW 也支持行级触发器和语句级触发器。
参考 DB2 LUW 的文档(突出显示我的)-指定触发触发器的原因(触发语句或事件)
当触发器被激活时,它会根据其粒度级别运行,如下所示:
对于每一行
它运行的次数与受影响行集中的行数相同。
如果需要引用受触发操作影响的特定行,请使用 FOR EACH ROW 粒度。一个示例是在 AFTER UPDATE 触发器中比较更新行的新值和旧值。
对于每个语句
它在整个触发事件中运行一次。
如果受影响的行集为空(即,在搜索 UPDATE 或 DELETE 的情况下,其中 WHERE 子句未限定任何行),则 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
Run Code Online (Sandbox Code Playgroud)
通过使用FOR EACH STATMENT的粒度,您可以通过一次更新实现相同的效果。
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)
Run Code Online (Sandbox Code Playgroud)
您可能希望使用语句级触发器而不是行级触发器的一些示例: