【发布时间】:2020-01-21 00:44:59
【问题描述】:
我正在尝试实现表分区,并且我在 PostgreSQL 中有以下代码(来自https://www.postgresql.org/docs/9.6/ddl-partitioning.html)
CREATE or replace FUNCTION child_tables.func_inventory_movement_insert_trigger()
RETURNS trigger
LANGUAGE 'plpgsql'
COST 100
VOLATILE NOT LEAKPROOF
AS $BODY$BEGIN
IF ( NEW.report_date >= '2019-04-01 ' AND
NEW.report_date < '2019-05-01 ' ) THEN
INSERT INTO child_tables.inventory_movement_y2019m03 VALUES (NEW.*);
ELSIF ( NEW.report_date >= '2019-06-01 ' AND
NEW.report_date < '2019-07-01 ' ) THEN
INSERT INTO child_tables.inventory_movement_y2019m04 VALUES (NEW.*);
ELSE
RAISE EXCEPTION
' out of range exception. Fix the child_tables.func_inventory_movement_insert_trigger() function. ';
END IF;
RETURN NULL;
END;
$BODY$;
触发功能:
CREATE TRIGGER im_partition_trigger
BEFORE INSERT OR DELETE OR UPDATE
ON core.inventory_movement
FOR EACH ROW
EXECUTE PROCEDURE child_tables.func_inventory_movement_insert_trigger();
在上述触发器之后或之前都尝试过。
ERROR: record "new" is not assigned yet DETAIL: The tuple structure of a not-yet-assigned record is indeterminate.
仅供参考,相同的代码适用于另一个表。
有什么建议吗?
【问题讨论】:
-
你的错误是什么时候出现的?在
CREATE TRIGGER或触发触发器时?如果开火,在哪种类型的事件上?我觉得问题是NEW与DELETE结合使用。 -
嗨,当我触发触发器时,现在它是插入事件
-
请添加此信息和触发触发器的命令。您说相同的代码正在另一张桌子上工作。触发器是否用于相同的事件,您是否触发相同的事件?
-
是的,两者都是相同的事件。我有一个存储过程,我将调用该过程,它将从其他阶段表中提取数据,然后将其插入到我的核心表中。所以在插入这个表之前触发器会自动触发。
标签: postgresql function triggers plpgsql table-partitioning