У нас есть таблица documents
, которая разбита по времени на дочерние таблицы, такие как documents_2019_01
, documents_2019_02
. Мы делаем это, используя триггер BEFORE
на родительской таблице documents
для вставки в правильную дочернюю таблицу, а затем возвращаем NULL
, чтобы прервать конвейер, поэтому он вставляется только в дочернюю таблицу (как вы уже догадались), Это затрудняет вставку документов, так как вы должны повторно запросить созданные идентификаторы. Мы рассмотрели использование типа триггера INSTEAD OF
, но их нельзя применять к таблицам, только к представлениям.
Вот наша текущая функция, используемая триггером:
CREATE OR REPLACE FUNCTION create_article_partition_and_insert() RETURNS TRIGGER
LANGUAGE plpgsql
AS
$$
DECLARE
partition_date TEXT;
partition TEXT;
resultId BIGINT;
BEGIN
partition_date := to_char(NEW.updated, 'YYYY_MM');
partition := TG_RELNAME || '_' || partition_date;
IF NOT EXISTS(SELECT relname FROM pg_class WHERE relname = partition)
THEN
RAISE NOTICE 'A partition has been created %',partition;
EXECUTE 'CREATE TABLE ' || partition || ' (LIKE ' || TG_RELNAME || ' INCLUDING ALL) INHERITS (' || TG_RELNAME ||
'); ';
END IF;
RAISE NOTICE 'Inserting into %',partition;
EXECUTE 'INSERT INTO ' || partition || ' SELECT(' || TG_RELNAME || ' ' || quote_literal(NEW) || ').* RETURNING id;'
INTO resultId;
NEW.id := resultId;
RETURN NEW;
END;
$$;
Есть ли лучший способ разделить вставки по времени и вернуть вставленную строку дочерней таблицы, не вставляя также в родительскую таблицу?
Использование версии PG 9.6.11
.
Спасибо!