2024年9月26日: PostgreSQL 17 发布!
支持的版本:当前 (17) / 16 / 15 / 14 / 13 / 12
开发版本:devel
不受支持的版本:11 / 10 / 9.6 / 9.5 / 9.4 / 9.3

F.36. postgres_fdw — 访问存储在外部 PostgreSQL 服务器中的数据 #

postgres_fdw 模块提供了外部数据包装器 postgres_fdw,可用于访问存储在外部 PostgreSQL 服务器中的数据。

此模块提供的功能与较旧的 dblink 模块的功能有很大程度的重叠。但是 postgres_fdw 为访问远程表提供了更透明且符合标准的语法,并且在许多情况下可以提供更好的性能。

准备使用 postgres_fdw 进行远程访问

  1. 使用 CREATE EXTENSION 安装 postgres_fdw 扩展。

  2. 使用 CREATE SERVER 创建一个外部服务器对象,以表示您要连接的每个远程数据库。除了 userpassword 之外,将连接信息指定为服务器对象的选项。

  3. 为每个您希望允许访问每个外部服务器的数据库用户,使用 CREATE USER MAPPING 创建用户映射。将要使用的远程用户名和密码指定为用户映射的 userpassword 选项。

  4. 为每个您要访问的远程表,使用 CREATE FOREIGN TABLEIMPORT FOREIGN SCHEMA 创建一个外部表。外部表的列必须与引用的远程表匹配。但是,如果您将正确的远程名称指定为外部表对象的选项,则可以使用与远程表不同的表和/或列名。

现在,您只需从外部表中进行 SELECT 即可访问其底层远程表中存储的数据。您还可以使用 INSERTUPDATEDELETECOPYTRUNCATE 修改远程表。(当然,您在用户映射中指定的远程用户必须具有执行这些操作的权限。)

请注意,在访问或修改远程表时,在 SELECTUPDATEDELETETRUNCATE 中指定的 ONLY 选项无效。

请注意,postgres_fdw 目前不支持带有 ON CONFLICT DO UPDATE 子句的 INSERT 语句。但是,如果省略唯一索引推断规范,则支持 ON CONFLICT DO NOTHING 子句。另请注意,postgres_fdw 支持由在分区表上执行的 UPDATE 语句调用的行移动,但它目前不处理将移动的行插入其中选择的远程分区也恰好是将在同一命令的其他地方更新的 UPDATE 目标分区的情况。

通常建议将外部表的列声明为与远程表的引用列具有完全相同的数据类型,以及适用的排序规则。尽管 postgres_fdw 目前在需要时执行数据类型转换方面相当宽容,但由于远程服务器对查询条件的解释方式与本地服务器不同,因此当类型或排序规则不匹配时,可能会出现令人惊讶的语义异常。

请注意,外部表可以声明更少的列,或者与底层远程表相比具有不同的列顺序。列与远程表的匹配是按名称进行的,而不是按位置进行的。

F.36.1. postgres_fdw 的 FDW 选项 #

F.36.1.1. 连接选项 #

使用 postgres_fdw 外部数据包装器的外部服务器可以具有与 libpq 在连接字符串中接受的相同选项,如 第 32.1.2 节 中所述,但这些选项不允许或具有特殊处理

  • userpasswordsslpassword(在用户映射中指定这些选项,或使用服务文件)

  • client_encoding(此选项会自动从本地服务器编码中设置)

  • application_name - 这可能出现在连接和 postgres_fdw.application_name 中的 任意一个或两个 中。如果两者都存在,则 postgres_fdw.application_name 会覆盖连接设置。与 libpq 不同,postgres_fdw 允许 application_name 包含 转义序列。有关详细信息,请参阅 postgres_fdw.application_name

  • fallback_application_name(始终设置为 postgres_fdw

  • sslkeysslcert - 这些选项可能出现在连接和用户映射中的 任意一个或两个 中。如果两者都存在,则用户映射设置会覆盖连接设置。

只有超级用户才能创建或修改带有 sslcertsslkey 设置的用户映射。

非超级用户可以使用密码身份验证或 GSSAPI 委派凭据连接到外部服务器,因此为属于非超级用户的用户映射指定 password 选项,其中需要密码身份验证。

超级用户可以通过设置用户映射选项 password_required 'false' 在每个用户映射的基础上覆盖此检查,例如:

ALTER USER MAPPING FOR some_non_superuser SERVER loopback_nopw
OPTIONS (ADD password_required 'false');

为了防止特权用户利用 postgres 服务器正在运行的 unix 用户的身份验证权限提升为超级用户权限,只有超级用户才能在用户映射上设置此选项。

需要谨慎操作以确保这不会允许映射的用户能够根据 CVE-2007-3278 和 CVE-2007-6601 以超级用户身份连接到映射的数据库。不要在 public 角色上设置 password_required=false。请记住,映射的用户可能可以使用 postgres 服务器运行的系统用户的 unix 主目录中的任何客户端证书、.pgpass.pg_service.conf 等。他们还可以使用诸如 peerident 身份验证之类的身份验证模式授予的任何信任关系。

F.36.1.2. 对象名称选项 #

这些选项可用于控制发送到远程 PostgreSQL 服务器的 SQL 语句中使用的名称。当创建具有与底层远程表名称不同的名称的外部表时,需要这些选项。

schema_name (string)

此选项可用于外部表,它提供了要在远程服务器上用于外部表的模式名称。如果省略此选项,则使用外部表模式的名称。

table_name (string)

此选项可用于外部表,它提供了要在远程服务器上用于外部表的表名称。如果省略此选项,则使用外部表的名称。

column_name (string)

此选项可用于外部表的列,它提供了要在远程服务器上用于该列的列名称。如果省略此选项,则使用该列的名称。

F.36.1.3. 成本估算选项 #

postgres_fdw 通过对远程服务器执行查询来检索远程数据,因此理想情况下,扫描外部表的估计成本应该是它在远程服务器上完成的成本,加上一些通信开销。获取此类估计的最可靠方法是询问远程服务器,然后为开销添加一些内容——但对于简单的查询,获取成本估计的额外远程查询的成本可能不值得。因此,postgres_fdw 提供了以下选项来控制如何进行成本估算

use_remote_estimate (boolean)

此选项可用于外部表或外部服务器,它控制 postgres_fdw 是否发出远程 EXPLAIN 命令以获取成本估算。外部表的设置会覆盖其服务器的任何设置,但仅限于该表。默认值为 false

fdw_startup_cost (浮点数)

此选项可用于外部服务器,它是一个浮点值,会添加到该服务器上任何外部表扫描的估计启动成本中。这表示建立连接、在远程端解析和计划查询等的额外开销。默认值为 100

fdw_tuple_cost (浮点数)

此选项可用于外部服务器,它是一个浮点值,用作该服务器上外部表扫描的每个元组的额外成本。它表示服务器之间数据传输的额外开销。您可以增加或减少此数字以反映到远程服务器的网络延迟较高或较低。默认值为0.2

use_remote_estimate为真时,postgres_fdw从远程服务器获取行数和成本估算,然后将fdw_startup_costfdw_tuple_cost添加到成本估算中。当use_remote_estimate为假时,postgres_fdw执行本地行数和成本估算,然后将fdw_startup_costfdw_tuple_cost添加到成本估算中。除非可以使用远程表的本地统计信息副本,否则这种本地估算不太可能非常准确。在外部表上运行ANALYZE是更新本地统计信息的方法;这将执行远程表的扫描,然后计算并存储统计信息,就像表是本地的一样。保持本地统计信息可以有效地减少远程表的每个查询计划开销——但如果远程表经常更新,本地统计信息很快就会过时。

以下选项控制此类ANALYZE操作的行为

analyze_sampling (string)

此选项可用于外部表或外部服务器,它确定ANALYZE在外部表上是否对远程端的数据进行采样,或者读取和传输所有数据并在本地执行采样。支持的值为offrandomsystembernoulliautooff禁用远程采样,因此所有数据都将在本地传输和采样。random使用random()函数执行远程采样以选择返回的行,而systembernoulli则依赖于这些名称的内置TABLESAMPLE方法。random适用于所有远程服务器版本,而TABLESAMPLE仅从9.5版本开始支持。auto(默认值)自动选择推荐的采样方法;目前,这意味着根据远程服务器版本使用bernoullirandom

F.36.1.4. 远程执行选项 #

默认情况下,仅使用内置运算符和函数的WHERE子句将被视为在远程服务器上执行。涉及非内置函数的子句在获取行后将在本地检查。如果这些函数在远程服务器上可用,并且可以依赖于它们产生与本地相同的結果,则可以通过发送此类WHERE子句以供远程执行来提高性能。此行为可以使用以下选项进行控制

extensions (string)

此选项是本地和远程服务器上都安装了兼容版本的PostgreSQL扩展名称的逗号分隔列表。不可变且属于列出扩展的函数和运算符将被视为可发送到远程服务器。此选项只能指定给外部服务器,而不能指定给每个表。

使用extensions选项时,用户有责任确保列出的扩展在本地和远程服务器上都存在并行为相同。否则,远程查询可能会失败或行为异常。

fetch_size (integer)

此选项指定postgres_fdw在每次提取操作中应获取的行数。它可以指定给外部表或外部服务器。为表指定的选项会覆盖为服务器指定的选项。默认值为100

batch_size (integer)

此选项指定postgres_fdw在每次插入操作中应插入的行数。它可以指定给外部表或外部服务器。为表指定的选项会覆盖为服务器指定的选项。默认值为1

请注意,postgres_fdw一次插入的行数的实际数量取决于列数和提供的batch_size值。批处理作为单个查询执行,而libpq协议(postgres_fdw用于连接到远程服务器)将单个查询中的参数数量限制为65535。当列数 * batch_size超过限制时,将调整batch_size以避免错误。

此选项也适用于复制到外部表的情况。在这种情况下,postgres_fdw一次复制的行数的实际数量以类似于插入情况的方式确定,但由于COPY命令的实现限制,它最多限制为1000。

F.36.1.5. 异步执行选项 #

postgres_fdw支持异步执行,它并行运行Append节点的多个部分,而不是串行运行,以提高性能。此执行可以使用以下选项进行控制

async_capable (boolean)

此选项控制postgres_fdw是否允许并行扫描外部表以进行异步执行。它可以指定给外部表或外部服务器。表级选项会覆盖服务器级选项。默认值为false

为了确保从外部服务器返回的数据一致,postgres_fdw将仅为给定的外部服务器打开一个连接,并将对该服务器上的所有查询按顺序运行,即使涉及多个外部表,除非这些表受制于不同的用户映射。在这种情况下,禁用此选项以消除与异步运行查询相关的开销可能性能更高。

即使Append节点包含同步执行的子计划和异步执行的子计划,也会应用异步执行。在这种情况下,如果异步子计划是使用postgres_fdw处理的子计划,则在至少一个同步子计划返回所有元组之后才会返回异步子计划的元组,因为该子计划是在异步子计划等待发送到外部服务器的异步查询结果时执行的。此行为可能会在将来的版本中更改。

F.36.1.6. 事务管理选项 #

如事务管理部分所述,在postgres_fdw中,事务通过创建相应的远程事务进行管理,子事务通过创建相应的远程子事务进行管理。当当前本地事务涉及多个远程事务时,默认情况下,postgres_fdw在本地事务提交或中止时按顺序提交或中止这些远程事务。当当前本地子事务涉及多个远程子事务时,默认情况下,postgres_fdw在本地子事务提交或中止时按顺序提交或中止这些远程子事务。可以使用以下选项提高性能

parallel_commit (boolean)

此选项控制postgres_fdw是否在本地事务提交时并行提交在本地事务中在外部服务器上打开的远程事务。此设置也适用于远程和本地子事务。此选项只能指定给外部服务器,而不能指定给每个表。默认值为false

parallel_abort (boolean)

此选项控制postgres_fdw是否在本地事务中止时并行中止在本地事务中在外部服务器上打开的远程事务。此设置也适用于远程和本地子事务。此选项只能指定给外部服务器,而不能指定给每个表。默认值为false

如果本地事务涉及多个启用了这些选项的外部服务器,则在本地事务提交或中止时,这些外部服务器上的多个远程事务将在这些外部服务器之间并行提交或中止。

启用这些选项时,具有许多远程事务的外部服务器在本地事务提交或中止时可能会遇到负面的性能影响。

F.36.1.7. 可更新性选项 #

默认情况下,假定使用postgres_fdw的所有外部表都是可更新的。可以使用以下选项覆盖此设置

updatable (boolean)

此选项控制postgres_fdw是否允许使用INSERTUPDATEDELETE命令修改外部表。它可以指定给外部表或外部服务器。表级选项会覆盖服务器级选项。默认值为true

当然,如果远程表实际上不可更新,则无论如何都会发生错误。此选项的使用主要允许在不查询远程服务器的情况下在本地引发错误。但是请注意,information_schema视图将根据此选项的设置报告postgres_fdw外部表是否可更新(或不可更新),而不会检查远程服务器。

F.36.1.8. 可截断性选项 #

默认情况下,假定使用postgres_fdw的所有外部表都是可截断的。可以使用以下选项覆盖此设置

truncatable (boolean)

此选项控制postgres_fdw是否允许使用TRUNCATE命令截断外部表。它可以指定给外部表或外部服务器。表级选项会覆盖服务器级选项。默认值为true

当然,如果远程表实际上不可截断,则无论如何都会发生错误。此选项的使用主要允许在不查询远程服务器的情况下在本地引发错误。

F.36.1.9. 导入选项 #

postgres_fdw能够使用IMPORT FOREIGN SCHEMA导入外部表定义。此命令在本地服务器上创建与远程服务器上存在的表或视图匹配的外部表定义。如果要导入的远程表具有用户定义数据类型的列,则本地服务器必须具有相同名称的兼容类型。

可以使用以下选项(在IMPORT FOREIGN SCHEMA命令中给出)自定义导入行为

import_collate (boolean)

此选项控制是否在从外部服务器导入的外部表的定义中包含列COLLATE选项。默认值为true。如果远程服务器与本地服务器具有不同的排序规则名称集,则可能需要将其关闭,如果它在不同的操作系统上运行,则很可能出现这种情况。但是,如果您这样做,则存在非常严重的风险,即导入的表列的排序规则将与底层数据不匹配,从而导致查询行为异常。

即使将此参数设置为true,导入排序规则为远程服务器默认排序规则的列也可能存在风险。它们将使用COLLATE "default"导入,这将选择本地服务器的默认排序规则,而这可能有所不同。

import_default (boolean)

此选项控制是否将列DEFAULT表达式包含在从外部服务器导入的外部表的定义中。默认值为false。如果启用此选项,请注意在本地服务器上计算的默认值可能与在远程服务器上计算的不同;nextval()是常见的问题来源。如果导入的默认表达式使用了本地不存在的函数或运算符,则IMPORT将完全失败。

import_generated (boolean)

此选项控制是否将列GENERATED表达式包含在从外部服务器导入的外部表的定义中。默认值为true。如果导入的生成表达式使用了本地不存在的函数或运算符,则IMPORT将完全失败。

import_not_null (boolean)

此选项控制是否将列NOT NULL约束包含在从外部服务器导入的外部表的定义中。默认值为true

请注意,除了NOT NULL之外的其他约束永远不会从远程表中导入。尽管PostgreSQL确实支持外部表上的检查约束,但由于约束表达式在本地和远程服务器上的评估结果可能存在差异,因此没有自动导入它们的规定。检查约束行为的任何此类不一致都可能导致查询优化中难以检测到的错误。因此,如果您希望导入检查约束,则必须手动执行此操作,并且应仔细验证每个约束的语义。有关外部表上检查约束处理的更多详细信息,请参阅CREATE FOREIGN TABLE

仅当在LIMIT TO子句中显式指定其他表的某个分区的表或外部表时,才会导入这些表。否则,它们将自动从IMPORT FOREIGN SCHEMA中排除。由于可以通过作为分区层次结构根的分区表访问所有数据,因此仅导入分区表应该允许访问所有数据,而无需创建额外的对象。

F.36.1.10. 连接管理选项 #

默认情况下,postgres_fdw建立到外部服务器的所有连接都将保留在本地会话中以供重复使用。

keep_connections (boolean)

此选项控制postgres_fdw是否保持与外部服务器的连接处于打开状态,以便后续查询可以重复使用它们。它只能为外部服务器指定。默认值为on。如果设置为off,则在每个事务结束时将丢弃与该外部服务器的所有连接。

F.36.2. 函数 #

postgres_fdw_get_connections(OUT server_name text, OUT valid boolean) returns setof record

此函数返回postgres_fdw从本地会话到外部服务器建立的所有打开连接的外部服务器名称。它还返回每个连接是否有效。false表示如果外部服务器连接在当前本地事务中使用,但其外部服务器或用户映射已更改或删除(请注意,如果服务器已删除,则无效连接的服务器名称将为NULL),然后在该事务结束时将关闭此类无效连接。true表示否则。如果没有打开的连接,则不返回任何记录。函数的示例用法

postgres=# SELECT * FROM postgres_fdw_get_connections() ORDER BY 1;
 server_name | valid
-------------+-------
 loopback1   | t
 loopback2   | f
postgres_fdw_disconnect(server_name text) returns boolean

此函数丢弃postgres_fdw从本地会话到具有给定名称的外部服务器建立的打开连接。请注意,可以使用不同的用户映射建立到给定服务器的多个连接。如果连接在当前本地事务中使用,则不会断开连接,并报告警告消息。如果断开至少一个连接,则此函数返回true,否则返回false。如果找不到具有给定名称的外部服务器,则会报告错误。函数的示例用法

postgres=# SELECT postgres_fdw_disconnect('loopback1');
 postgres_fdw_disconnect
-------------------------
 t
postgres_fdw_disconnect_all() returns boolean

此函数丢弃postgres_fdw从本地会话到外部服务器建立的所有打开连接。如果连接在当前本地事务中使用,则不会断开连接,并报告警告消息。如果断开至少一个连接,则此函数返回true,否则返回false。函数的示例用法

postgres=# SELECT postgres_fdw_disconnect_all();
 postgres_fdw_disconnect_all
-----------------------------
 t

F.36.3. 连接管理 #

postgres_fdw在第一次使用与外部服务器关联的外部表的查询期间建立到外部服务器的连接。默认情况下,此连接将保留并重复用于同一会话中的后续查询。可以使用外部服务器的keep_connections选项控制此行为。如果使用多个用户身份(用户映射)访问外部服务器,则将为每个用户映射建立一个连接。

更改外部服务器或用户映射的定义或删除外部服务器或用户映射时,将关闭关联的连接。但请注意,如果任何连接在当前本地事务中使用,则将保留这些连接直到事务结束。当未来查询使用外部表需要时,将重新建立已关闭的连接。

一旦建立了与外部服务器的连接,默认情况下它将保留到本地或相应的远程会话退出为止。要显式断开连接,可以禁用外部服务器的keep_connections选项,或使用postgres_fdw_disconnectpostgres_fdw_disconnect_all函数。例如,这些对于关闭不再需要的连接很有用,从而释放外部服务器上的连接。

F.36.4. 事务管理 #

在引用外部服务器上任何远程表的查询期间,如果当前本地事务没有打开相应的远程事务,则postgres_fdw将在远程服务器上打开一个事务。当本地事务提交或中止时,远程事务将提交或中止。保存点也以类似的方式通过创建相应的远程保存点进行管理。

当本地事务具有SERIALIZABLE隔离级别时,远程事务使用SERIALIZABLE隔离级别;否则,它使用REPEATABLE READ隔离级别。此选择确保如果查询在远程服务器上执行多个表扫描,它将获取所有扫描的快照一致结果。结果是,单个事务内的连续查询将看到来自远程服务器的相同数据,即使由于其他活动在远程服务器上发生并发更新也是如此。如果本地事务使用SERIALIZABLEREPEATABLE READ隔离级别,则无论如何都会期望这种行为,但对于READ COMMITTED本地事务来说,这可能令人惊讶。未来的PostgreSQL版本可能会修改这些规则。

请注意,目前postgres_fdw不支持为两阶段提交准备远程事务。

F.36.5. 远程查询优化 #

postgres_fdw尝试优化远程查询以减少从外部服务器传输的数据量。这是通过将查询WHERE子句发送到远程服务器以执行,以及不检索当前查询不需要的表列来完成的。为了降低查询执行错误的风险,除非查询WHERE子句仅使用内置数据类型、运算符和函数或属于外部服务器的extensions选项中列出的扩展,否则不会将这些子句发送到远程服务器。此类子句中的运算符和函数也必须是IMMUTABLE。对于UPDATEDELETE查询,如果没有任何无法发送到远程服务器的查询WHERE子句、没有查询的本地连接、目标表上没有行级本地BEFOREAFTER触发器或存储的生成列,以及来自父视图的CHECK OPTION约束,则postgres_fdw尝试通过将整个查询发送到远程服务器来优化查询执行。在UPDATE中,要分配给目标列的表达式必须仅使用内置数据类型、IMMUTABLE运算符或IMMUTABLE函数,以降低查询执行错误的风险。

postgres_fdw遇到同一外部服务器上外部表之间的连接时,它会将整个连接发送到外部服务器,除非由于某种原因它认为单独从每个表获取行效率更高,或者除非所涉及的表引用受制于不同的用户映射。在发送JOIN子句时,它会采取与上述WHERE子句相同的预防措施。

可以使用EXPLAIN VERBOSE检查实际发送到远程服务器以执行的查询。

F.36.6. 远程查询执行环境 #

postgres_fdw打开的远程会话中,search_path参数仅设置为pg_catalog,以便只有内置对象在没有模式限定的情况下可见。对于postgres_fdw本身生成的查询,这不是问题,因为它始终提供此类限定。但是,这可能会对通过远程表上的触发器或规则在远程服务器上执行的函数造成危害。例如,如果远程表实际上是一个视图,则该视图中使用的任何函数都将使用受限的搜索路径执行。建议在这些函数中限定所有名称的模式,或者将SET search_path选项(请参阅CREATE FUNCTION)附加到这些函数以建立其预期的搜索路径环境。

postgres_fdw同样为各种参数建立远程会话设置

这些不太可能像search_path那样成问题,但如果需要,可以使用函数SET选项进行处理。

不建议您通过更改这些参数的会话级设置来覆盖此行为;这很可能导致postgres_fdw出现故障。

F.36.7. 跨版本兼容性 #

postgres_fdw 可以用于连接回溯到 PostgreSQL 8.3 的远程服务器。只读功能可回溯到 8.1。但是,一个限制是 postgres_fdw 通常假设不可变的内置函数和运算符是安全的,可以发送到远程服务器执行,如果它们出现在外表的 WHERE 子句中。因此,自远程服务器发布以来添加的内置函数可能会被发送到它进行执行,从而导致 函数不存在 或类似的错误。这种类型的错误可以通过重写查询来解决,例如,将外表引用嵌入到带有 OFFSET 0 作为优化屏障的子 SELECT 中,并将有问题的函数或运算符放在子 SELECT 之外。

F.36.8. 等待事件 #

postgres_fdw 可以在等待事件类型 Extension 下报告以下等待事件

PostgresFdwCleanupResult

等待远程服务器上的事务中止。

PostgresFdwConnect

等待建立与远程服务器的连接。

PostgresFdwGetResult

等待从远程服务器接收查询结果。

F.36.9. 配置参数 #

postgres_fdw.application_name (string) #

指定 postgres_fdw 建立与外来服务器的连接时使用的 application_name 配置参数的值。这将覆盖服务器对象的 application_name 选项。请注意,此参数的更改不会影响任何现有的连接,直到它们重新建立。

postgres_fdw.application_name 可以是任何长度的任何字符串,甚至包含非 ASCII 字符。但是,当它传递到外来服务器并用作 application_name 时,请注意它将被截断为小于 NAMEDATALEN 个字符。除可打印的 ASCII 字符之外的所有字符都将替换为 C 样式十六进制转义序列。有关详细信息,请参阅 application_name

% 字符开始 转义序列,这些序列将替换为如下所述的状态信息。无法识别的转义序列将被忽略。其他字符将直接复制到应用程序名称中。请注意,不允许在 % 之后和选项之前指定加号/减号或数字文字,以进行对齐和填充。

转义序列 效果
%a 本地服务器上的应用程序名称
%c 本地服务器上的会话 ID(有关详细信息,请参阅 log_line_prefix
%C 本地服务器上的集群名称(有关详细信息,请参阅 cluster_name
%u 本地服务器上的用户名
%d 本地服务器上的数据库名称
%p 本地服务器上后端的进程 ID
%% 文字 %

例如,假设用户 local_user 从数据库 local_db 建立到 foreign_db 的连接,作为用户 foreign_user,设置 'db=%d, user=%u' 将替换为 'db=local_db, user=local_user'

F.36.10. 示例 #

以下是如何使用 postgres_fdw 创建外表的示例。首先安装扩展

CREATE EXTENSION postgres_fdw;

然后使用 CREATE SERVER 创建外来服务器。在此示例中,我们希望连接到主机 192.83.123.89 上侦听端口 5432PostgreSQL 服务器。连接到的数据库名为远程服务器上的 foreign_db

CREATE SERVER foreign_server
        FOREIGN DATA WRAPPER postgres_fdw
        OPTIONS (host '192.83.123.89', port '5432', dbname 'foreign_db');

还需要一个使用 CREATE USER MAPPING 定义的用户映射来标识将在远程服务器上使用的角色

CREATE USER MAPPING FOR local_user
        SERVER foreign_server
        OPTIONS (user 'foreign_user', password 'password');

现在可以使用 CREATE FOREIGN TABLE 创建外表。在此示例中,我们希望访问远程服务器上名为 some_schema.some_table 的表。它的本地名称将为 foreign_table

CREATE FOREIGN TABLE foreign_table (
        id integer NOT NULL,
        data text
)
        SERVER foreign_server
        OPTIONS (schema_name 'some_schema', table_name 'some_table');

CREATE FOREIGN TABLE 中声明的列的数据类型和其他属性必须与实际的远程表匹配。列名也必须匹配,除非您将 column_name 选项附加到各个列以显示它们在远程表中的名称。在许多情况下,使用 IMPORT FOREIGN SCHEMA 比手动构造外表定义更可取。

F.36.11. 作者 #

花田茂

提交更正

如果您在文档中看到任何不正确的内容、与您对特定功能的体验不符的内容或需要进一步说明的内容,请使用 此表单 报告文档问题。