PostgreSQL下如何指定触发器执行顺序?

Fra*_*eil 9 postgresql trigger

我正在使用触发器使用“经典”基于时间的分区。我发现需要一个单独的触发器,它在原始表上运行。

CREATE TABLE twitter_interactions(...);
CREATE OR REPLACE FUNCTION insert_twitter_interactions ...;
CREATE TRIGGER insert_twitter_interactions_trig
  BEFORE INSERT OR UPDATE on twitter_interactions
  FOR EACH ROW EXECUTE PROCEDURE insert_twitter_interactions();

CREATE OR REPLACE FUNCTION maintain_data_pointers ...;
CREATE TRIGGER maintain_data_pointers_trig
  BEFORE INSERT OR UPDATE on twitter_interactions
  FOR EACH ROW EXECUTE PROCEDURE insert_twitter_interactions();
Run Code Online (Sandbox Code Playgroud)

我还没有完全验证,但我怀疑分区逻辑在维护触发器之前运行,并且由于该行没有出现在父表中,因此第二个触发器永远不会触发。

如果我也想运行,会发生什么AFTER INSERT OR UPDATE?由于该行未将其放入原始表中,因此我无法实现 after 逻辑。

小智 12

PostgreSQL 按名称的字母顺序执行触发器。因此,请确保使用按照您想要的顺序获取它们的名称。从文档

SQL 指定应按创建时间顺序触发多个触发器。PostgreSQL 使用名称顺序,这样被判断为更方便。

顺便说一句,您的 SQL 创建了两次相同的触发器。


Erw*_*ter 11

我不能说它比手册在这里做得更好:

如果 anyBEFOREINSTEAD OFtrigger 返回NULL,则放弃该行的操作,并且不会触发后续触发器(针对该行)。

AFTER如果BEFORE触发器取消,则(按字母顺序)稍后在同一事件上触发或任何触发器都不会触发。