如果你在你的触发器函数里执行 SQL 命令,并且这些命令访问触发器所在的表, 那么你必须知道触发器的可视性规则,因为这些规则决定这些 SQL 命令是否能看到触发触发器的数据改变。 简单说:
语句级别的触发器遵循简单的可视性原则:在语句之前(before)触发的触发器看不到所有语句做的修改, 而所有修改都可以被语句之后(after)触发的触发器看到。
导致触发器触发的数据改变(插入,更新,或者删除)通常是不能被一个before触发器里面执行的 SQL 命令看到的, 因为它还没有发生。
不过,在 before 触发器里执行的 SQL 命令将会看到在同一个外层命令前面处理的行做的数据改变。 这一点需要我们仔细,因为这些改变时间的顺序通常是不可预期的; 一个影响多行的 SQL 命令可能以任意顺序访问这些行。
在一个 after 触发器被触发的时候,所有外层命令产生的数据改变都已经完成, 可以被所执行的 SQL 命令看到。
有关数据可视性规则的更多信息可以在 Section 39.4 找到。 Section 32.4 里的例子包含这些规则的演示。