Postgresql 错误类型 " " 不存在



我收到此错误:

Caused by: org.postgresql.util.PSQLException: ERROR: type 
"tool_parse_numbers_record" does not exist
Where: compilation of PL/pgSQL function "tool_parse_numbers" near line 2

我正在像这样在 docker 容器中恢复我的数据库:

FROM postgres:9.4
ENV POSTGRES_USER iwb
ENV POSTGRES_PASSWORD 1907
ENV POSTGRES_DB iwb
ADD ./1_schema.sql /docker-entrypoint-initdb.d/
ADD ./2_data.sql /docker-entrypoint-initdb.d/

下面是 schema.sql 文件中的类型定义:

CREATE TYPE tool_parse_numbers_record AS (
satir character varying(4000)
);

以下是 schema.sql 中函数定义的顶部部分:

CREATE FUNCTION tool_parse_numbers(pstr text, pdelimeter text DEFAULT 
'|'::text) RETURNS SETOF tool_parse_numbers_record
LANGUAGE plpgsql SECURITY DEFINER
AS $$
DECLARE

这就是数据库的还原方式:

CREATE FUNCTION tool_parse_numbers(pstr text, pdelimeter text DEFAULT 
'|'::text) RETURNS SETOF tool_parse_numbers_record
LANGUAGE plpgsql SECURITY DEFINER
AS $BODY$
DECLARE

编辑:我更改了 dockerfile 以在函数之前创建类型:

ADD ./1_type.sql /docker-entrypoint-initdb.d/
ADD ./2_table.sql /docker-entrypoint-initdb.d/
ADD ./3_func.sql /docker-entrypoint-initdb.d/
ADD ./4_rest_table.sql /docker-entrypoint-initdb.d/
ADD ./5_data.sql /docker-entrypoint-initdb.d/

我该如何解决?

您确定在函数之前创建类型吗?

在与函数相同的架构中创建的类型是否相同?(不是在sql文件中的某个地方使用了SET search_path吗?

$$ 和 $BODY$ 以 "dolar 引号字符串"开头,它们以相同的 ($$ 或 $BODY$ 结尾(。代替 BODY,您可以拥有任何字符(或任何字符(,它只允许在字符串中写入 $$、" 等,而不会出现问题。 为什么 postgres 使用 $BODY$ 而不是 $ILOVEBEER$ 仍然未知。

当我将数据库提取到 schema.sql 文件时,所有者设置为 postgres:

ALTER FUNCTION iwb.tool_parse_numbers(pstr text, pdelimeter text) OWNER TO postgres; 

所以我将所有者更改为 iwb,因为它在 docker 文件中是这样的

ENV POSTGRES_USER iwb

它奏效了!

相关内容

最新更新