如何解决在postgresql中插入触发器,动态语句
我正在尝试向表中添加插入触发器以实现分区。 以下代码有效:
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,...
我也尝试过使用 EXECUTE <expression ... $1> USING NEW.*
,但效果不佳。
关于如何将 NEW.* 表达式插入到动态语句中的任何想法?
谢谢!
解决方法
试试这个:
kvp.value.GetType()
此处,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;
用作语句的参数并将类型转换为适当的表类型。
你构造表格字符串的方式不安全,所以我改变了。