Дамп не может воссоздать индекс по массиву столбца hstore - PullRequest
0 голосов
/ 03 мая 2018

Я сбрасываю большую базу данных с pg_dump -O -U <user> <db> >dump.sql.

Вот суть dump.sql со всем, что не имеет отношения к делу.

При импорте дампа в другой экземпляр Postgres (идентичные настройки) с psql -f dump.sql -U <user> <db> в строке CREATE INDEX 147 возникает следующая ошибка:

psql:dumped.sql:147: ERROR:  type "hstore" does not exist
LINE 5:           element hstore;
                          ^
QUERY:
        DECLARE
          arrHstore ALIAS FOR $1;
          key ALIAS FOR $2;
          element hstore;
          string text;
        BEGIN
          FOREACH element IN ARRAY arrHstore LOOP
            string := concat(string, ' ', element->key);
          END LOOP;
          RETURN trim(leading from string, ' ');
        END;

CONTEXT:  compilation of PL/pgSQL function "immutable_array_to_string" near line 5

Так что все, кроме последнего CREATE INDEX сработало.

Теперь я подключаюсь к базе данных с помощью psql -U <user> <db> и вставляю ранее ошибочную команду CREATE INDEX ... индекс создается без проблем.

Несколько вещей, которые я пробовал:

  • Создание дампа только структуры с --schema-only создает дамп, который импортируется очень хорошо. Проблема возникает только в том случае, если в качестве дампа вставлена ​​хотя бы одна строка.
  • Я склонен исключить владельца / разрешения в качестве причины, потому что я создаю дамп с -O.
  • Этому конкретному индексу уже несколько лет, и подобные свалки до недавнего времени работали нормально. Следовательно, это может быть связано с обновлением до Postgres 10.3. Однако у меня нет простого способа проверить дамп на старых версиях, так как он не совместим с предыдущими версиями.

Есть идеи, что здесь происходит? Большое спасибо заранее!

1 Ответ

0 голосов
/ 03 мая 2018

Это связано с исправлениями безопасности, касающимися схемы public в последней версии PostgreSQL.

Либо измените функцию так, чтобы она ссылалась на тип hstore со своей схемой: public.hstore, либо добавьте SET search_path = public в оператор CREATE FUNCTION.

Чтобы квалифицировать схему hstore оператор ->, вы можете заменить

element -> key

с

element OPERATOR(public.->) key

Аналогично для других операторов.

...