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

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

F.36.1. postgres_fdw 的 FDW 选项
F.36.2. 函数
F.36.3. 连接管理
F.36.4. 事务管理
F.36.5. 远程查询优化
F.36.6. 远程查询执行环境
F.36.7. 跨版本兼容性
F.36.8. 等待事件
F.36.9. 配置参数
F.36.10. 示例
F.36.11. 作者

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 (floating point)

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

fdw_tuple_cost (floating point)

此选项可以针对外服指定,是浮点值,用作该服务器上外表扫描的每元组额外成本。这表示服务器之间数据传输的额外开销。您可以增加或减少此数字以反映到远程服务器的更高或更低网络延迟。默认值为 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也会为各种参数建立远程会话设置

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

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

F.36.7. 跨版本兼容性 #

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

F.36.8. 等待事件 #

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

PostgresFdwCleanupResult

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

PostgresFdwConnect

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

PostgresFdwGetResult

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

F.36.9. 配置参数 #

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.36.10. 示例 #

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

CREATE EXTENSION postgres_fdw;

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

Shigeru Hanada