【问题标题】:FOR EACH STATEMENT and FOR EACH ROW triggers order of executionFOR EACH STATEMENT 和 FOR EACH ROW 触发执行顺序
【发布时间】:2020-10-08 17:54:04
【问题描述】:

在一个 postgres 数据库中,假设我有 3 个表,tb1tb2tb3

tb2tb1 上使用触发器 T1 为每一行插入后更新,tb3 在之后更新使用触发器 T2 为每个语句插入 tb1

我的情况是在 tb1 和 tb2 完成更新之前我不希望 tb3 得到更新,因为她同时使用两者。

现在,如果我在 tb1 中插入最后一行之后执行在 tb1 上插入 10k 行的查询,则语句将结束。并且触发器 T2 将触发。我的问题是,T2 会在 tb2 到达最后 10k 行之前还是之后触发?

如果之前,您能否提出一个解决方案,使 tb3 直到两个表都完成所有插入后才更新?

【问题讨论】:

  • 这听起来很像 XY 问题。
  • 是的,也许你是对的,但我也解释了情况,所以如果你有完全不同的解决方案,请分享。
  • 您能否添加一个实际示例来说明您要实现的目标? FOR EACH 会让人怀疑您在做事而不是在 RDBMS 中做事。
  • 该语句直到插入最后一行后才完成,因此 FOR STATMENT 直到那时才会触发。设置测试和验证。

标签: postgresql triggers plpgsql


【解决方案1】:

The documentation 有想要的信息:

语句级BEFORE 触发器在语句开始执行任何操作之前自然触发,而语句级AFTER 触发器在语句的最后触发。这些类型的触发器可以在表、视图或外部表上定义。行级BEFORE 触发器在操作特定行之前立即触发,而行级AFTER 触发器在语句结束时触发(但在任何语句级AFTER 触发器之前)。

[...]

如果为同一关系上的同一事件定义了多个触发器,则触发器将按触发器名称的字母顺序触发。

所以你可以依靠t2t1 之后运行。

【讨论】:

    猜你喜欢
    • 2014-08-03
    • 2014-08-03
    • 1970-01-01
    • 2013-01-07
    • 2011-11-05
    • 2021-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多