postgresql中插入触发器,动态语句

Insert trigger in postgresql, dynamic statement

我正在尝试向 table 添加一个插入触发器以实现分区。 以下代码有效:

CREATE OR REPLACE FUNCTION item_lines_insert_trigger()
RETURNS TRIGGER AS $$
BEGIN
    INSERT INTO item_lines_partitions.p11_1 VALUES (NEW.*);
    RETURN NULL;
END;
$$
LANGUAGE plpgsql;

我的问题 - 是当我尝试使其动态化(以便我可以根据我获得的值重定向到 table)时,我无法插入记录(NEW. *) 变成一个动态语句。 这是我尝试做的事情:

CREATE OR REPLACE FUNCTION item_lines_insert_trigger()
RETURNS TRIGGER AS $$
BEGIN
    EXECUTE format('INSERT INTO item_lines_partitions.p%s_%s VALUES ',NEW.tenant_id,NEW.store_id) || quote_literal(NEW.*);
    RETURN NULL;
END;

我在动态语句中收到如下语法错误: PG::SyntaxError: ERROR: syntax error at or near "'(49563,,1,11,100125,100125,1,,...

我也尝试过使用 EXECUTE <expression ... > USING NEW.*,但效果不佳。

关于如何将 NEW.* 表达式插入动态语句有什么想法吗?

谢谢!

试试这个:

EXECUTE
   format(
      'INSERT INTO item_lines_partitions.%I SELECT (::text::item_lines_partitions.%I).*',
      'p' || NEW.tenant_id || '_' || NEW.store_id,
      'p' || NEW.tenant_id || '_' || NEW.store_id
   )
   USING NEW;

此处,NEW 用作语句的参数并将类型转换为适当的 table 类型。

您构造 table 字符串的方式不安全,所以我更改了它。