繁体   English   中英

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

[英]Insert trigger in postgresql, dynamic statement

我正在尝试将插入触发器添加到表中以实现分区。 以下代码有效:

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;

我的问题是,当我尝试使其动态化时(以便我可以根据获得的值重定向到表),我无法将记录(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... $1> USING NEW.*但效果不佳。

关于如何将 NEW.* 表达式插入动态语句的任何想法?

谢谢!

尝试这个:

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

在这里, NEW用作语句的参数并将类型转换为适当的表类型。

你构造表格字符串的方式不安全,所以我改变了它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM