在postgresql动态语句中插入触发器
我试图向表中添加一个insert触发器以实现分区。 以下代码起作用:在postgresql动态语句中插入触发器,postgresql,stored-procedures,Postgresql,Stored Procedures,我试图向表中添加一个insert触发器以实现分区。 以下代码起作用: 创建或替换功能项\u行\u插入\u触发器() 将触发器返回为$$ 开始 插入项目_行_分区.p11_1值(新。*); 返回NULL; 结束; $$ 语言plpgsql; 我的问题是,当我试图使它成为动态的(这样我就可以根据我得到的值重定向到一个表),我就是不能将记录(NEW.*)插入到动态语句中。 以下是我试图做的: 创建或替换功能项\u行\u插入\u触发器() 将触发器返回为$$ 开始 执行格式('INSERT INTO
创建或替换功能项\u行\u插入\u触发器()
将触发器返回为$$
开始
插入项目_行_分区.p11_1值(新。*);
返回NULL;
结束;
$$
语言plpgsql;
我的问题是,当我试图使它成为动态的(这样我就可以根据我得到的值重定向到一个表),我就是不能将记录(NEW.*)插入到动态语句中。
以下是我试图做的:
创建或替换功能项\u行\u插入\u触发器()
将触发器返回为$$
开始
执行格式('INSERT INTO item_line_partitions.p%s_%s VALUES',NEW.tenant_id,NEW.store_id)| quote_literal(NEW.*);
返回NULL;
结束;
动态语句出现如下语法错误:
PG::SyntaxError:ERROR:语法错误位于或接近“”(49563,1,11100125100125,1,,…)
我还尝试使用executeusingnew.*
,但效果不太好
关于如何在动态语句中插入新的.*表达式,您有什么想法吗
谢谢!试试这个:
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
用作语句的参数,并将类型转换为适当的表类型
构造表字符串的方法不安全,因此我更改了它。谢谢。它不起作用。我得到以下错误:
PG::cannotimprove:error:无法将类型item_行强制转换为item_行分区。p11_1
其中item_行是父表名(我使用表继承进行分区)现在我得到以下结果:ActiveRecord::StatementInvalid(PG::DatatypeMismatch:ERROR:列“id”的类型为integer,但表达式的类型为item\u lines\u partitions.p11\u 1)
我假设这是因为该表中有许多列类型。非常感谢您的帮助。如果有帮助,我可以提供表架构,但通常我有文本、整数、浮点、日期和时间的数据类型。非常感谢:-)