Триггеры строк должны быть определены на отдельных разделах, а не на секционированной таблице. Смотри https://www.postgresql.org/docs/10/ddl-partitioning.html#DDL-PARTITIONING-DECLARATIVE-LIMITATIONS
Я не знаю, почему в документации по 9.6 это не упоминается
рабочий триггер обновления:
CREATE FUNCTION update_timestamp()
RETURNS trigger AS
$$
BEGIN
NEW.updated_at = now();
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER test_update BEFORE UPDATE ON performance_test
FOR EACH ROW EXECUTE PROCEDURE update_timestamp();
если вы делаете UPDATE test SET score = 30, updated_at=DEFAULT;
или UPDATE test SET score = 30, updated_at=current_timestamp;
, вам может не потребоваться триггер обновления.
Разбиение не является бесплатным обедом, поскольку оно неочевидно влияет как на поведение, так и на производительность, как вы заметили, что триггер не ведет себя так, как вы ожидали. Если вы допустите ошибку, это может легко привести к ошибочным запросам и даже к неверным данным.
Если вы действительно уверены, что вам это нужно, вам следует убедиться, что вы понимаете это в деталях, а в противном случае я бы порекомендовал вам этого избегать, большинство проблем с медленными запросами можно решить, убедившись, что статистика таблицы обновлена, использование правильных индексов, оптимизация запросов, изменение конфигурации Postgres или добавление дополнительного оборудования.