Поскольку SELECT count(*)
является очень дорогой операцией, я не думаю, что будет хорошей идеей запускать ее при каждом изменении данных. Кроме того, количество строк не скажет вам много о размере таблицы.
Мой подход заключается в использовании триггера с использованием pg_total_relation_size()
, например:
CREATE OR REPLACE FUNCTION size_trig() RETURNS trigger
LANGUAGE plpgsql AS
$$BEGIN
IF pg_total_relation_size(TG_RELID) > (TG_ARGV[0])::bigint THEN
RETURN NULL;
ELSE
RETURN NEW;
END IF;
END;$$;
CREATE TRIGGER size_trig BEFORE INSERT ON big
FOR EACH ROW
EXECUTE PROCEDURE size_trig(819200);
Это ограничило бы общий размер таблицы, включая индексы и таблицу TOAST, до 100 блоков, и это сравнительно дешево.
Вам все еще нужно определить триггер для всех таблиц, которые вы хотите проверить, но нет никакого способа изменить PostgreSQL.
Вы видите, что вы можете динамически устанавливать предел для каждой таблицы. Вы также можете найти решение, которое использует таблицу соответствия для ограничения размера.