У меня есть секционированные таблицы в PostgreSQL 9.2, каждая из которых имеет функцию секционирования, которая выглядит следующим образом:
CREATE OR REPLACE FUNCTION myPartitionSelectionFunction()
RETURNS trigger AS
$BODY$
BEGIN
IF ( NEW.PartitionColumn < DATE '2010-08-08 00:00:00') THEN INSERT INTO MyPartitionedTable_Week_31_2010 VALUES (NEW.*);
ELSIF ( NEW.PartitionColumn < DATE '2010-08-15 00:00:00' AND NEW.PartitionColumn >= DATE '2010-08-08 00:00:00') THEN INSERT INTO MyPartitionedTable_Week_32_2010 VALUES (NEW.*);
ELSE
RAISE EXCEPTION 'PartitionColumn out of range. Update myPartitionSelectionFunction()';
END IF;
RETURN NULL;
END;
$BODY$
LANGUAGE plpgsql
Итак, каждую неделю — новый раздел. Проблема заключается в обновлении сотен функций каждую неделю. Я должен автоматизировать это, и триггер для каждой вставки невозможен. Идея состоит в том, чтобы создать функцию, которую будет вызывать cron, которая обновляет каждую функцию раздела, добавляя еще один ELSIF перед окончательным ELSE. Однако я не могу найти способ выполнить итерацию по каждой функции, имеющей имя «раздел», а затем получить ее код (команды psql, такие как \d, не будут работать в функции, верно?), чтобы добавить новый ELSIF и соответственно обновите (ALTER) каждую функцию, создав в процессе новый раздел.
Итак, самый большой вопрос, который у меня есть сейчас:
Как выполнить итерацию (используя курсор?) через каждую функцию, которая имеет имя «раздела», затем получить ее код, добавить еще один ELSIF перед ELSE и обновить (ALTER) его содержимое, не рискуя застрять в бесконечном цикле?
Буду признателен за любую оказанную помощь. Спасибо.