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 字符串的方式不安全,所以我更改了它。
我正在尝试向 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 字符串的方式不安全,所以我更改了它。