PostgreSQL Trigger для переопределения вставки в таблицу с наследованием - PullRequest
0 голосов
/ 21 мая 2019

У нас есть таблица 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.

Спасибо!

...