我收到此错误:
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/
我该如何解决?
答案 0 :(得分:1)
您确定在函数之前创建了类型吗?
是否在与函数相同的模式中创建了类型? (在sql文件中的某处使用了SET search_path吗?)
$$和$ BODY $启动“dolar quoted string”,由相同的($$或$ BODY $)终止。而不是BODY你可以拥有任何字符(或任何字符),它只允许在字符串中写入$$,“等等而没有问题。 为什么postgres使用$ BODY $而不是$ ILOVEBEER $仍然未知。
答案 1 :(得分:0)
当我将数据库解压缩到schema.sql文件时,owner被设置为postgres:
ALTER FUNCTION iwb.tool_parse_numbers(pstr text, pdelimeter text) OWNER TO postgres;
所以我将所有者更改为iwb,因为它就像在docker文件中那样
ENV POSTGRES_USER iwb
它有效!