FOR STATEMENT 触发器的实际用途是什么?

Ste*_*roz 2 trigger

我非常了解触发器背后的想法、如何以及何时使用它们。

我还看到了触发器的实际用途FOR EACH ROW

但我找不到何时使用触发器的具体示例FOR STATEMENT。我能用它做什么?

谁能给我一个现实生活中使用它的例子吗?

Sco*_*red 6

我无法谈论所有支持语句级触发器的数据库平台,但 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)

您可能希望使用语句级触发器而不是行级触发器的一些示例:

  • 您想记录更新了多少行,但不一定关心更新了哪些行
  • 您希望在对表执行语句时执行操作,即使没有更新任何行
  • 您的表有 400 亿行,有时会针对表的 10% 进行更新。由于资源限制,一次记录 40 亿行的操作是不可行的
  • 您希望记录任何人对表进行更新的任何时间,但您不关心更新内容,也不关心有多少行受到影响。