postgresql Postgres FDW扩展的问题:为连接查询导入外部架构时出错

nom7f22z  于 5个月前  发布在  PostgreSQL
关注(0)|答案(2)|浏览(63)

我在尝试使用Postgres FDW扩展从同一数据库服务器导入外来模式以执行联接查询时遇到错误。下面,为了更清楚起见,我提供了pgAdmin的快照,沿着示例表创建脚本:

-- Create the enumerated type
CREATE TYPE UserType AS ENUM ('INTERNAL', 'EXTERNAL');

-- Create the User table using the enumerated type
CREATE TABLE "users" (
    id          SERIAL PRIMARY KEY,
    type        UserType,
    created_at  TIMESTAMP WITHOUT TIME ZONE DEFAULT CURRENT_TIMESTAMP
);

字符串
为了将上述数据库及其公共模式导入“阿基勒”数据库,我使用以下代码:

CREATE SCHEMA temp_0_schema;

CREATE EXTENSION IF NOT EXISTS postgres_fdw;

CREATE SERVER temp_0_server
FOREIGN DATA WRAPPER postgres_fdw
OPTIONS (dbname 'temp_0', host 'localhost', port '5432');

CREATE USER MAPPING FOR CURRENT_USER
SERVER temp_0_server
OPTIONS (user 'akil', password '');

IMPORT FOREIGN SCHEMA public
FROM SERVER temp_0_server
INTO temp_0_schema;


但是,我遇到了以下错误:

ERROR:  type "public.usertype" does not exist
LINE 3:   type public.usertype OPTIONS (column_name 'type'),
               ^
QUERY:  CREATE FOREIGN TABLE users (
  id integer OPTIONS (column_name 'id') NOT NULL,
  type public.usertype OPTIONS (column_name 'type'),
  created_at timestamp without time zone OPTIONS (column_name 'created_at')
) SERVER temp_0_server
OPTIONS (schema_name 'public', table_name 'users');
CONTEXT:  importing foreign table "users" 

SQL state: 42704


我很难理解错误的性质,并希望了解可能导致此问题的任何见解。


的数据

w6mmgewl

w6mmgewl1#

该错误意味着您忘记在本地数据库中创建usertype。如果没有这样做,应该如何定义外部表?请参阅文档:
通常建议使用与远程表的引用列完全相同的数据类型和排序规则(如果适用)来声明外部表的列。尽管postgres_fdw目前对在需要时执行数据类型转换相当宽容,但当类型或排序规则不匹配时,可能会出现令人惊讶的语义异常,这是由于远程服务器与本地服务器不同地解释查询条件。

gjmwrych

gjmwrych2#

在文档的下面:
如果要导入的远程表具有用户定义数据类型的列,则本地服务器必须具有同名的兼容类型。
这意味着你需要单独设置匹配的用户定义类型,因为扩展不处理这个问题。检查外部服务器上public.usertype的定义,并在本地定义相同的类型:在psql客户端中,\dT元命令显示类型定义,而\dt可以告诉你给定表定义的类型。

相关问题