【发布时间】:2014-06-08 10:50:43
【问题描述】:
我正在尝试对 Postgres 中的日志条目进行动态分区。我有 53 个子表(1 个用于每周的日志条目),并且希望使用触发器将 INSERT 路由到子表。
我使用INSERT INTO log5 VALUES (NEW.*) 运行该函数,它可以工作。
我改为使用EXECUTE 语句运行该函数,但它失败了。在EXECUTE 语句中,它将NEW 识别为表名,而不是传递给触发器函数的变量。关于如何解决的任何想法?谢谢!
错误:
查询:插入 log5 值(新。*)
上下文:PL/pgSQL 函数 log_roll_test() 第 6 行在 EXECUTE 语句
错误:缺少表“新”SQL 状态的 FROM 子句条目: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;
我的触发器:
CREATE TRIGGER log_roll_test
BEFORE INSERT ON log FOR EACH ROW
EXECUTE PROCEDURE log_roll_test();
【问题讨论】:
-
NEW无法识别,因为EXECUTE无法引用外部变量。尝试使用USING子句。 postgresql.org/docs/9.3/static/… -
谢谢!我已经尝试过了,但它不起作用。它将 NEW 记录传递给语句,而 EXECUTE 语句将其视为字符串。即'(value1, value2, value3,,,)'。 Postgres 不喜欢将逗号放在一起,也不喜欢在值周围加上引号。我需要做一个 regexp_replace 来修改字符串,出于性能原因,我真的很想避免这种情况。
-
我什么都试过了,顺便说一句。非常接近于放弃并使用 CASE WHEN 语句(53 行)编写触发器并编写 pgScript 来创建 53 个单独的触发器函数。
标签: postgresql triggers plpgsql dynamic-sql