如何在触发器函数中将 NEW.* 传递给 EXECUTE

How to pass NEW.* to EXECUTE in trigger function

我有一个简单的任务是将巨大的 MD5 值插入 tables(分区 table),并创建了一个触发器和一个触发器函数来代替 INSERT 操作.在函数中,我检查了 NEW.md5 的前两个字符以确定应该插入哪个 table。

DECLARE
  tb text;
BEGIN
  IF TG_OP = 'INSERT' THEN
    tb = 'samples_' || left(NEW.md5, 2);
    EXECUTE(format('INSERT INTO %s VALUES (%s);', tb, NEW.*)); <- WRONG
  END IF;
  RETURN NULL;
END;

问题是如何将 NEW.* 连接到 SQL 语句中?

最适合 USING clause of EXECUTE:

CREATE FUNCTION foo ()
  RETURNS trigger AS
$func$
BEGIN
  IF TG_OP = 'INSERT' THEN
     EXECUTE format('INSERT INTO %s SELECT .*'
                  , 'samples_' || left(NEW.md5, 2);
     USING NEW;
  END IF;
  RETURN NULL;
END
$func$ LANGUAGE plpgsql;

EXECUTE不需要括号。
并且您知道标识符被折叠为小写,除非在必要时引用(%I 而不是 format() 中的 %s)。

更多详情:

  • INSERT with dynamic table name in trigger function
  • How to dynamically use TG_TABLE_NAME in PostgreSQL 8.2?