【问题标题】:SQL: error when creating a foreign table that has an enum columnSQL:创建具有枚举列的外部表时出错
【发布时间】:2015-05-19 17:55:46
【问题描述】:

我正在 database_a 中创建一个外部表 (foo_table)。 foo_table 位于 database_b 中。 foo_table 有一个枚举 (bar_type) 作为其列之一。因为此枚举在 database_b 中,所以在 database_a 中创建外部表失败。 database_a 不理解列类型。在 database_a 中运行以下命令

CREATE FOREIGN TABLE foo_table (id integer NOT NULL, bar bar_type) SERVER database_b

一个得到错误:

ERROR: type "bar_type" does not exist

我可以在 database_a 中创建 bar_type 的副本,但这感觉是重复的,并且可能是未来不一致的原因。有人对处理的最佳做法有想法吗?

【问题讨论】:

    标签: sql postgresql enums foreign-data-wrapper


    【解决方案1】:

    我总结一下我从 pgsql-general 邮件列表收到的答案:

    1. 外部表基本上是本地数据库的临时远程数据源,因此本地数据库有责任维护其对远程表的定义,无论是在另一个(甚至是同一个)PostgreSQL服务器还是完全不同的数据源,尤其是本地定义可能与远程定义不同。
    2. 这确实意味着没有简单的方法可以确保本地服务器上存在任何远程依赖项。 PostgreSQL 9.5 将提供 IMPORT FOREIGN SCHEMA 命令,但这仅限于表/视图定义。
    3. 如果枚举的定义变得不一致,我们预计在检索具有本地未知值的行时会发生错误。
    4. 解决此问题的一种可能方法是将外部表的列声明为“文本”而不​​是枚举;您将在本地丢失一些错误检查,但远程服务器将在您执行时强制执行有效性 存储了一些东西。
    5. 但是,不清楚这种 hack 是否会在枚举列上的 WHERE 条件下表现得令人满意。我将检查 WHERE 条件的性能,并在我有更多详细信息时更新此答案。

    所有功劳都归于 pgsql-general 邮件列表中的优秀人员。

    【讨论】:

    【解决方案2】:

    在真正的紧要关头(当您没有太多枚举/域时)。它可以在运行导入之前在新的本地外部架构中手动创建每一个。

    在我的例子中,我使用 postgres_fdw 在数据库之间进行罕见的大容量迁移,这些迁移受益于纯粹在 SQL 中运行,而不是通过某处的应用程序服务器。

    由于我们只是偶尔这样做,并且 Postgres 枚举的编号是 10 秒而不是 100 秒,因此这种解决方法可以保持在 Postgres 服务器上运行迁移的性能优势。

    【讨论】:

      【解决方案3】:

      您可以创建一个脚本来通过进行此查询来传输枚举,然后在您的服务器上创建它们:

      SELECT format(
                'CREATE TYPE %s AS ENUM (%s);',
                enumtypid::regtype,
                string_agg(quote_literal(enumlabel), ', ')
             )
      FROM pg_enum
      GROUP BY enumtypid;
      

      感谢@laurenz-albe Postgres how to transfer all enums from foreign server

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-22
        相关资源
        最近更新 更多