规则和命令状态

PostgreSQL服务器为它收到的每个命令返回一个命令状态字符串,例如INSERT 149592 1。没有涉及规则时这很简单,但是查询被规则重写时会发生什么呢。

规则对命令状态的影响如下:

  • 如果没有查询的无条件INSTEAD规则,那么原始给出的查询将会被执行,并且它的命令状态将像平常一样被返回(但是请注意如果存在任何有条件INSTEAD规则,那么它们的反条件将被加到原始查询中。这样可能会减少它处理的行数,并且报告的状态将受影响)。

  • 如果有查询的任何无条件INSTEAD规则,那么原始查询将完全不被执行。在这种情况下,服务器将返回由INSTEAD规则(有条件的或无条件的)插入的最后一条和原始查询命令类型(INSERTUPDATEDELETE)相同的查询的命令状态。如果任何规则添加的查询都不符合这些要求,那么返回的命令状态显示原始查询类型并且行计数和 OID 域为零。

通过为任何想要的INSTEAD规则指定在活动规则中排名最后的规则名,程序员可以确保该规则都是在第二种情况里设置命令状态的规则,因为它会被最后一个应用。