Ваш триггер определен
BEFORE INSERT OR DELETE OR UPDATE
Но NEW
не определен для DELETE
.Таким образом, ваша функция триггера обречена на сбой, как и раньше.
Либо запишите отдельные функции триггера и триггеры для INSERT
/ UPDATE
/ DELETE
(рекомендуется).Отображаемая функция запуска имеет дело только с INSERT
.Таким образом, этот триггер имеет смысл:
CREATE TRIGGER im_partition_trigger
BEFORE INSERT -- !!
ON core.inventory_movement
FOR EACH ROW EXECUTE PROCEDURE child_tables.func_inventory_movement_insert_trigger();
Или вкладывать все вызовы OLD
и NEW
в комбинированную функцию триггера в конструкциях IF
или CASE
, проверяя на TG_OP
.
Примеры кода во многих смежных вопросах.
Тем не менее, реализовать разбиение таблицы Я быгораздо лучше использовать декларативное разбиение в Postgres 10 или новее.В идеале, используйте предстоящий Postgres 12, который принесет значительные улучшения для разбиения.
Кроме того, в Postgres 11 или более поздних версиях лучше использовать фиксированный синтаксис для триггеров:
...
FOR EACH ROW EXECUTE FUNCTION child_tables.func_inventory_movement_insert_trigger();
Это функция,не "процедура".