Доброго времени суток, я новичёк в работе с бд Postgres.
В документации нашёл описание секционирования таблицы, попробовал сделать подобное с таблицей новостей вот код тригера:
CREATE OR REPLACE FUNCTION public.news_insert_trigger()
RETURNS TRIGGER AS $$
BEGIN
/* для 2013 года */
IF (NEW.publicdate >= TIMESTAMP '2013-01-01 00:00:00' AND NEW.publicdate < TIMESTAMP '2013-02-01 00:00:00') THEN INSERT INTO public.news_01012011 VALUES (NEW.*);
...
ELSIF (NEW.publicdate >= TIMESTAMP '2010-12-01 00:00:00' AND NEW.publicdate < TIMESTAMP '2011-01-01 00:00:00') THEN INSERT INTO public.news_01122010 VALUES (NEW.*);
/* всё что раньше 01.01.2010 года */
ELSIF (NEW.publicdate < TIMESTAMP '2010-01-01 00:00:00') THEN INSERT INTO public.news_before2010 VALUES (NEW.*);
ELSE
RAISE EXCEPTION 'Date % is out of range. Fix public.news_insert_trigger', NEW.publicdate;
END IF;
RETURN NULL;
END;
$$
LANGUAGE plpgsql;
/* тригер переназначения */
CREATE TRIGGER news_before_insert
BEFORE INSERT ON public.news
FOR EACH ROW EXECUTE PROCEDURE public.news_insert_trigger();
Проблема в том, что после добавления записи она вносится и в таблицу мастер и а соответствующую дочернюю таблицу. В дакументации написано что таблица мастер должна быть пустой, можете подсказать где искать ошибку?По идее триггер возвращает же ноль и я не пойму почему тогда записывается запись
И еще вопрос, возможно ли как то сохранить id записи в дочерних таблицах, у меня уже есть таблица новостей с id записями и мне надо её разбить на секции но к id записей привязано много функционала, возможно ли это или я вообще не в том месте копаю и секционирование не для такого варианта?
Читали?
http://postgresql.ru.net/manual/ddl-partitioning.html
Да читал, может что не так
Да читал, может что не так понял триггер делал как раз по примеру из этой документации и ещё вот этой статьёй пользовался http://habrahabr.ru/post/74984/ так же пробовал полностью повторить код из статьи с хабры, но данные все равно добавлялись в обе таблицы (мастер и дочернюю)
А как данные-то читаете из
А как данные-то читаете из таблиц? ONLY используете?
Нет ONLY не использовал,
Нет ONLY не использовал, вообще делал так, была таблица news, я скопировал её назвав oldnews и перенёс туда данные
INSER INTO oldnews SELECT * FROM news;
После стёр данные из таблицы news и создал по ней партиции, индексы по дате, тригер и функцию к тригеру. Сделал обратныю операцию по переносу INSER INTO news SELECT * FROM oldnews;
Данные записались в обе таблицы, я опять отчистел её и попробовал просто добавить запись вручную для теста, тоже аналогично получились данные в соответствующей партиции и в основной таблице
вот SQL для создания партиций полностью SQL
Так используйте ONLY и
Так используйте ONLY и посмотрите что в таблицах.