转储无法在hstore列

时间:2018-05-03 14:44:21

标签: postgresql pg-dump postgresql-10

我正在使用pg_dump -O -U <user> <db> >dump.sql转储大型数据库。

Here is the gist of dump.sql一切都无关紧要。

将转储导入到psql -f dump.sql -U <user> <db>的另一个Postgres实例(相同设置)时,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 :(得分:1)

这是因为PostgreSQL最新版本中有关public架构的安全修复。

更改函数,使其引用hstore类型及其架构:public.hstore,或将SET search_path = public添加到CREATE FUNCTION语句。

要对hstore运算符->进行架构限定,您可以替换

element -> key

element OPERATOR(public.->) key

与其他运营商相似。