SQL:创建具有枚举列的外部表时出错

shf*_*888 4 sql postgresql enums foreign-data-wrapper

我正在foo_tabledatabase_a 中创建一个外部表 ( )。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

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

shf*_*888 7

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

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

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