PostgreSQL 9.4.4 中文手册
上一页 | 上一级 | 章 36. 触发器 | 下一页

# 36.2. 数据改变的可视性

如果在触发器函数里执行SQL命令，并且这些命令访问触发器所在的表， 那么你必须知道触发器的可视性规则， 因为这些规则决定这些SQL命令是否能看到触发触发器的数据改变。简单说：

- 语句级别的触发器遵循简单的可视性原则： 在语句之前(before)触发的触发器看不到语句所做的修改， 而所有修改都可以被`AFTER`语句级别触发的触发器看到。

- 导致触发器触发的数据改变(插入、更新、删除)通常是不能被 一个`BEFORE`触发器里面执行的SQL命令看到的，因为它还没有发生。

- 不过，在`BEFORE`触发器里执行的SQL 命令将能够看到在同一个外层命令前面处理的行的改变。 这一点需要仔细，因为这些改变的顺序通常是不可预期的； 一个影响多行的SQL命令可能以任意顺序访问这些行。

- 同样的，行级别`INSTEAD OF`触发器将看到通过先前同一外部命令 触发的`INSTEAD OF`触发器形成的数据变化的影响。

- 在一个行级`AFTER`触发器被触发的时候， 所有外层命令产生的数据改变都已经完成， 对于触发的触发器函数是可见的。

如果是用任何一种标准过程语言写的触发器函数， 那么只有当函数声明了`VOLATILE`才会应用上面的语句。 声明了`STABLE`或者`IMMUTABLE`的函数在任何情况 下都不会看到请求中做出的改变。

有关数据可视性规则的更多信息可以在第 44.4 节找到。 第 36.4 节里的例子包含这些规则的演示。

上一页 | 起始页 | 下一页
触发器行为概述 | 上一级 | 用C写触发器