Redrock Postgres 搜索 英文
版本: 9.3 / 9.4 / 9.5 / 9.6 / 10 / 11 / 12 / 13 / 14 / 15 / 16

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

F.38.1. postgres_fdw 的 FDW 选项
F.38.2. 函数
F.38.3. 连接管理
F.38.4. 事务管理
F.38.5. 远程查询优化
F.38.6. 远程查询执行环境
F.38.7. 跨版本兼容性
F.38.8. 配置参数
F.38.9. 示例
F.38.10. 作者

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.38.1. postgres_fdw 的 FDW 选项 #

F.38.1.1. 连接选项 #

使用 postgres_fdw 外部数据包装器的外部服务器可以具有 libpq 在连接字符串中接受的相同选项,如 第 34.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.38.1.2. 对象名称选项 #

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

schema_name (string)

此选项可以为外部表指定,它提供要用于远程服务器上外部表的模式名称。如果省略此选项,将使用外部表模式的名称。

table_name (string)

此选项可以为外部表指定,它提供要用于远程服务器上外部表的表名称。如果省略此选项,将使用外部表的名称。

column_name (string)

此选项可以为外部表的列指定,它提供要用于远程服务器上列的列名称。如果省略此选项,将使用列的名称。

F.38.1.3. 成本估算选项 #

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

use_remote_estimate (boolean)

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

fdw_startup_cost (floating point)

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

fdw_tuple_cost (floating point)

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

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

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

analyze_sampling (text)

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

F.38.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.38.1.5. 异步执行选项 #

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

async_capable (boolean)

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

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

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

F.38.1.6. 事务管理选项 #

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

parallel_commit (boolean)

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

parallel_abort (boolean)

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

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

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

F.38.1.7. 可更新选项 #

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

updatable (boolean)

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

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

F.38.1.8. 可截断选项 #

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

truncatable (boolean)

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

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

F.38.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 表达式包含在从外来服务器导入的外来表的定义中。默认值为 trueIMPORT 将完全失败,如果导入的生成表达式使用本地不存在的函数或操作符。

import_not_null (boolean)

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

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

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

F.38.1.10. 连接管理选项 #

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

keep_connections (boolean)

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

F.38.2. 函数 #

postgres_fdw_get_connections(OUT server_name text, OUT valid boolean) 返回 setof 记录

此函数返回 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) 返回布尔值

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

postgres=# SELECT postgres_fdw_disconnect('loopback1');
 postgres_fdw_disconnect
-------------------------
 t
postgres_fdw_disconnect_all() 返回布尔值

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

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

F.38.3. 连接管理 #

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

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

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

F.38.4. 事务管理 #

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

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

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

F.38.5. 远程查询优化 #

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

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

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

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

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

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

search_path 相比,这些不太可能出现问题,但如果需要,可以使用函数 SET 选项进行处理。

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

F.38.7. 跨版本兼容性 #

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

F.38.8. 配置参数 #

postgres_fdw.application_name (string) #

指定 application_name 配置参数的值,当 postgres_fdw 建立与外来服务器的连接时使用。这将覆盖服务器对象的 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.38.9. 示例 #

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

CREATE EXTENSION postgres_fdw;

然后使用 CREATE SERVER 创建一个外部服务器。在此示例中,我们希望连接到侦听端口 5432 的主机 192.83.123.89 上的 PostgreSQL 服务器。在远程服务器上,连接到的数据库名为 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.38.10. 作者 #

Shigeru Hanada