阅读(810) (10)

PostgreSQL 数据改变的可见性

2021-08-21 11:05:27 更新

如果你在你的触发器函数中执行 SQL 命令,并且这些命令会访问触发器所在的表,那么你需要注意数据可见性规则。因为这些规则决定了这些 SQL 命令是否将能看见引发触发器的数据改变。简单地:

  • 语句级触发器遵循简单的可见性规则:一个语句所作的改变对于语句级 BEFORE触发器都不可见,而所有修改对于语句级 AFTER触发器都是可见的。

  • 导致触发器被引发的数据更改(插入、更新或删除)自然对于在一个行级BEFORE触发器中执行的 SQL 命令可见,因为它还没有发生。

  • 但是,在一个行级BEFORE触发器中执行的 SQL 命令将会看见之前在同一个外层命令中所作的数据更改的效果。这里需要小心,因为这些更改时间的顺序通常是不可预测的,一个影响多行的 SQL 命令可能以任何顺序访问这些行。

  • 类似地,一个行级INSTEAD OF触发器将会看见之前在同一个外层命令中INSTEAD OF触发器引发所作的数据更改。

  • 当一个行级AFTER触发器被引发时,所有由外层命令所作的数据更改已经完成,并且对于该被调用的触发器函数是可见的。

如果你的触发器函数使用任何一种标准过程语言编写的,那么只有在该函数被声明为VOLATILE时上述陈述才适用。被声明为STABLEIMMUTABLE的函数在任何情况下将不能看到由调用命令所作出的更改。

有关数据可见性规则的更多信息可见第 46.5 节。第 38.4 节中的例子包含了对这些规则的示范。