PostgreSQL 数据改变的可见性
如果你在你的触发器函数中执行 SQL 命令,并且这些命令会访问触发器所在的表,那么你需要注意数据可见性规则。因为这些规则决定了这些 SQL 命令是否将能看见引发触发器的数据改变。简单地:
-
语句级触发器遵循简单的可见性规则:一个语句所作的改变对于语句级
BEFORE
触发器都不可见,而所有修改对于语句级AFTER
触发器都是可见的。 -
导致触发器被引发的数据更改(插入、更新或删除)自然对于在一个行级
BEFORE
触发器中执行的 SQL 命令不可见,因为它还没有发生。 -
但是,在一个行级
BEFORE
触发器中执行的 SQL 命令将会看见之前在同一个外层命令中所作的数据更改的效果。这里需要小心,因为这些更改时间的顺序通常是不可预测的,一个影响多行的 SQL 命令可能以任何顺序访问这些行。 -
类似地,一个行级
INSTEAD OF
触发器将会看见之前在同一个外层命令中INSTEAD OF
触发器引发所作的数据更改。 -
当一个行级
AFTER
触发器被引发时,所有由外层命令所作的数据更改已经完成,并且对于该被调用的触发器函数是可见的。
如果你的触发器函数使用任何一种标准过程语言编写的,那么只有在该函数被声明为VOLATILE
时上述陈述才适用。被声明为STABLE
或IMMUTABLE
的函数在任何情况下将不能看到由调用命令所作出的更改。
有关数据可见性规则的更多信息可见第 46.5 节。第 38.4 节中的例子包含了对这些规则的示范。