PostgreSQL 9.3触发函数插入到具有参数化名称的表中

Dav*_*lis 3 postgresql triggers dynamic-sql plpgsql

我正在尝试动态分区Postgres中的日志条目.我有53个子表(每周有1个日志条目),并希望使用触发器将INSERT路由到子表.

我运行该函数INSERT INTO log5 VALUES (NEW.*),它的工作原理.

我用EXECUTE语句运行函数,但它失败了.在EXECUTE语句中,它识别NEW为表名而不是传递给触发器函数的变量.有关如何修复的任何想法?谢谢!

错误:

QUERY:INSERT INTO log5 VALUES(NEW.*)
CONTEXT:PL/pgSQL函数log_roll_test()EXECUTE语句中的第6行
错误:缺少表"new"的FROM子句条目SQL状态:42P01

我的功能:

CREATE FUNCTION log_roll_test() RETURNS trigger AS $body$
DECLARE t text;
BEGIN
    t := 'log' || extract(week FROM NEW.updt_ts); --child table name
    --INSERT INTO log5 VALUES (NEW.*);
    EXECUTE format('INSERT INTO %I VALUES (NEW.*);', t);
    RETURN NULL;
END;
$body$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)

我的触发器:

CREATE TRIGGER log_roll_test
BEFORE INSERT ON log FOR EACH ROW
EXECUTE PROCEDURE log_roll_test();
Run Code Online (Sandbox Code Playgroud)

Erw*_*ter 6

CREATE FUNCTION log_roll_test()
  RETURNS trigger AS
$func$
BEGIN
   EXECUTE format('INSERT INTO %I SELECT ($1).*'
                , to_char(NEW.updt_ts, '"log"WW'))   -- child table name
   USING NEW;
   RETURN NULL;
END
$func$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)

您无法NEW在查询字符串中引用.NEW在函数体中可见,但在EXECUTE环境中不可见.最好的解决方案是传递USING子句中的值.

我还替换to_char(NEW.updt_ts, '"log"WW')了表名的等价物.to_char()这里更快更简单.