首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >转储无法在hstore列数组上重新创建索引。

转储无法在hstore列数组上重新创建索引。
EN

Stack Overflow用户
提问于 2018-05-03 14:44:21
回答 1查看 274关注 0票数 1

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

以下是dump.sql的要点把所有无关的东西都去掉了。

当使用psql -f dump.sql -U <user> <db>将转储导入到另一个Postgres实例(相同的设置)时,CREATE INDEX第147行发生以下错误:

代码语言:javascript
复制
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有关。但是,我没有简单的方法来测试旧版本的转储,因为它并不是向下兼容的。

知道这是怎么回事吗?提前谢谢一堆人!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-05-03 14:49:18

这是因为在最新的public点版本中与PostgreSQL模式有关的安全修复。

要么更改函数,使其引用hstore类型及其模式:public.hstore,要么将SET search_path = public添加到CREATE FUNCTION语句中。

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

代码语言:javascript
复制
element -> key

使用

代码语言:javascript
复制
element OPERATOR(public.->) key

其他运营商也是如此。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50157849

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档