Postgresql错误类型“”不存在

时间:2018-06-07 06:54:52

标签: postgresql docker dockerfile postgresql-9.4

我收到此错误:

    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/

我该如何解决?

2 个答案:

答案 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

它有效!