转储无法在 hstore 列的数组上重新创建索引
Dump fails to re-create index over array of hstore column
我正在使用 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 ;
key ALIAS FOR ;
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
的结构会创建一个可以正常导入的转储。只有在转储中至少插入一行时才会出现此问题。
- 我倾向于排除 owner/permissions 的原因,因为我使用
-O
创建转储。
- 这个特定的索引已有多年历史,类似的转储直到最近都运行良好。因此,它可能与升级到 Postgres 10.3 有关。但是,我没有简单的方法来测试旧版本的转储,因为它不向下兼容。
知道这里发生了什么吗?提前致谢!
这是因为在 PostgreSQL 的最新点版本中对 public
架构进行了安全修复。
要么更改函数,使其引用类型 hstore
及其架构:public.hstore
,要么将 SET search_path = public
添加到 CREATE FUNCTION
语句。
要对 hstore
运算符 ->
进行模式限定,您可以替换
element -> key
和
element OPERATOR(public.->) key
与其他运算符类似。
我正在使用 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 ;
key ALIAS FOR ;
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
的结构会创建一个可以正常导入的转储。只有在转储中至少插入一行时才会出现此问题。 - 我倾向于排除 owner/permissions 的原因,因为我使用
-O
创建转储。 - 这个特定的索引已有多年历史,类似的转储直到最近都运行良好。因此,它可能与升级到 Postgres 10.3 有关。但是,我没有简单的方法来测试旧版本的转储,因为它不向下兼容。
知道这里发生了什么吗?提前致谢!
这是因为在 PostgreSQL 的最新点版本中对 public
架构进行了安全修复。
要么更改函数,使其引用类型 hstore
及其架构:public.hstore
,要么将 SET search_path = public
添加到 CREATE FUNCTION
语句。
要对 hstore
运算符 ->
进行模式限定,您可以替换
element -> key
和
element OPERATOR(public.->) key
与其他运算符类似。