powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Автоматическое создание партиций в PG11
3 сообщений из 3, страница 1 из 1
Автоматическое создание партиций в PG11
    #39872400
maxikus2008
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго всем времени суток !

Есть таблица
Код: sql
1.
2.
3.
4.
5.
6.
CREATE TABLE tor
(
  events_date timestamp without time zone NOT NULL,
  message text
  CONSTRAINT tor_pkey PRIMARY KEY (events_date, message)
)PARTITION BY RANGE (events_date);


У неё есть партиция по умолчанию
Код: sql
1.
CREATE TABLE tor_part_default partition OF tor default;



На эту партицию повешан триггер, по которому должна создаваться партиция под данные
Код: sql
1.
2.
3.
4.
5.
CREATE TRIGGER tor_create_next_part
    BEFORE INSERT
    ON tor_part_default
    FOR EACH ROW
    EXECUTE PROCEDURE create_next_part();



Собственно само тело триггера
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
CREATE OR REPLACE FUNCTION create_next_part()
    RETURNS trigger
    LANGUAGE 'plpgsql'
    COST 100
    VOLATILE NOT LEAKPROOF
AS $BODY$
DECLARE
    partname VARCHAR(16);
    startdate VARCHAR(10);
    enddate VARCHAR(10);
BEGIN
    partname = 'tor_part_'||to_char(NEW.events_date, 'YYYYMM');
    startdate = to_char(NEW.events_date, 'YYYY-MM-01');
    enddate = to_char(TO_DATE(startdate,'YYYY-MM-DD') + interval '1 month','YYYY-MM-DD');
    RAISE NOTICE '    Start date: %',startdate;
    RAISE NOTICE '      End date: %',enddate;
    IF NOT EXISTS (SELECT 1 FROM information_schema.tables WHERE  table_name = partname) 
    THEN
        EXECUTE 'CREATE TABLE '||partname||' partition OF tor FOR VALUES FROM ('''||startdate||''') TO ('''||enddate||''')';
        RAISE NOTICE 'Partition created';
        EXECUTE 'INSERT INTO '||partname||' VALUES(NEW.*)';
        RAISE NOTICE 'Data inserted!';
    END IF;
    RETURN NEW;
END;
$BODY$;



При вставке данных получаю ошибку
Код: sql
1.
2.
3.
4.
5.
NOTICE:      Start date: 2016-06-01
NOTICE:        End date: 2016-07-01
ERROR:  cannot CREATE TABLE .. PARTITION OF "tor" because it is being used by active queries in this session
CONTEXT:  SQL statement "CREATE TABLE tor_part_201606 partition OF tor FOR VALUES FROM ('2016-06-01') TO ('2016-07-01')"
PL/pgSQL function create_next_part() line 14 at EXECUTE



Что я делаю не так ?
...
Рейтинг: 0 / 0
Автоматическое создание партиций в PG11
    #39872434
Melkij
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maxikus2008,

потому что из запроса нельзя менять структуру уже открытой в этой транзакции таблицы.
https://github.com/postgres/postgres/blob/REL_11_STABLE/src/backend/commands/tablecmds.c#L2012
https://github.com/postgres/postgres/blob/REL_11_STABLE/src/backend/commands/tablecmds.c#L3239
...
Рейтинг: 0 / 0
Автоматическое создание партиций в PG11
    #39872584
maxikus2008
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Melkij,

Справедливо. Я искал способ автоматического создания партиций. Но видимо cron мой выход :)
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Автоматическое создание партиций в PG11
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]