postgres_fdw
模块提供了外部数据包装器 postgres_fdw
,它可用于访问存储在外部 PostgreSQL 服务器中的数据。
此模块提供的功能与较旧的 dblink 模块的功能有很大重叠。但是 postgres_fdw
提供了更透明且符合标准的语法来访问远程表,并且在许多情况下可以提供更好的性能。
要准备使用 postgres_fdw
进行远程访问
使用 CREATE EXTENSION 安装 postgres_fdw
扩展。
使用 CREATE SERVER 创建外部服务器对象,以表示您要连接的每个远程数据库。将连接信息指定为服务器对象的选项,但 user
和 password
除外。
使用 CREATE USER MAPPING 为您要允许访问每个外部服务器的每个数据库用户创建用户映射。将要使用的远程用户名和密码指定为用户映射的 user
和 password
选项。
使用 CREATE FOREIGN TABLE 或 IMPORT FOREIGN SCHEMA 为您要访问的每个远程表创建外部表。外部表的列必须与引用的远程表匹配。但是,如果将正确的远程名称指定为外部表对象的选项,则可以使用与远程表不同的表和/或列名。
现在,您只需要从外部表 SELECT
即可访问其基础远程表中存储的数据。您还可以使用 INSERT
、UPDATE
、DELETE
、COPY
或 TRUNCATE
修改远程表。(当然,您在用户映射中指定的远程用户必须具有执行这些操作的权限。)
请注意,在访问或修改远程表时,在 SELECT
、UPDATE
、DELETE
或 TRUNCATE
中指定的 ONLY
选项无效。
请注意,postgres_fdw
当前不支持带有 ON CONFLICT DO UPDATE
子句的 INSERT
语句。但是,如果省略唯一的索引推断规范,则支持 ON CONFLICT DO NOTHING
子句。另请注意,postgres_fdw
支持由在分区表上执行的 UPDATE
语句调用的行移动,但它当前不处理将移动的行插入到的远程分区也是将在同一命令中的其他地方更新的 UPDATE
目标分区的情况。
通常建议使用与远程表的引用列完全相同的数据类型(如果适用,还包括排序规则)来声明外部表的列。尽管 postgres_fdw
当前在按需执行数据类型转换方面相当宽容,但是当类型或排序规则不匹配时,可能会出现令人惊讶的语义异常,这是由于远程服务器对查询条件的解释与本地服务器不同。
请注意,外部表可以声明的列比其基础远程表少,或者列顺序不同。列与远程表的匹配是通过名称而不是位置进行的。
使用 postgres_fdw
外部数据包装器的外部服务器可以具有 libpq 在连接字符串中接受的相同选项,如 第 32.1.2 节 中所述,但这些选项是不允许的或具有特殊处理
user
、password
和 sslpassword
(请在用户映射中指定这些,或使用服务文件)
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
)
sslkey
和 sslcert
- 这些可能出现在连接和用户映射中两者之一或两者都。如果两者都存在,则用户映射设置将覆盖连接设置。
只有超级用户才能使用 sslcert
或 sslkey
设置创建或修改用户映射。
非超级用户可以使用密码身份验证或使用 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
等。他们还可以使用身份验证模式(例如 peer
或 ident
身份验证)授予的任何信任关系。
这些选项可用于控制发送到远程 PostgreSQL 服务器的 SQL 语句中使用的名称。当创建的外部表名称与基础远程表的名称不同时,需要这些选项。
schema_name
(string
)此选项可以为外部表指定,它给出了用于远程服务器上外部表的模式名称。如果省略此选项,则使用外部表的模式名称。
table_name
(string
)此选项可以为外部表指定,它给出了用于远程服务器上外部表的表名称。如果省略此选项,则使用外部表的名称。
column_name
(string
)此选项可以为外部表的列指定,它给出了用于远程服务器上列的列名称。如果省略此选项,则使用列的名称。
postgres_fdw
通过针对远程服务器执行查询来检索远程数据,因此,理想情况下,扫描外部表的估计成本应该是在远程服务器上完成的成本,再加上一些通信开销。获取此类估计的最可靠方法是询问远程服务器,然后添加一些开销 — 但是对于简单查询,获取成本估计的额外远程查询可能不值得。因此,postgres_fdw
提供了以下选项来控制成本估算的方式
use_remote_estimate
(boolean
)此选项可以为外部表或外部服务器指定,它控制 postgres_fdw
是否发出远程 EXPLAIN
命令来获取成本估算。外部表的设置将覆盖其服务器的任何设置,但仅适用于该表。默认值为 false
。
fdw_startup_cost
(floating point
)这个选项可以为外部服务器指定,是一个浮点数值,会被添加到该服务器上任何外部表扫描的预估启动成本中。这代表了建立连接、在远程端解析和规划查询等额外开销。默认值是 100
。
fdw_tuple_cost
(浮点数
)这个选项可以为外部服务器指定,是一个浮点数值,用作该服务器上外部表扫描的每个元组的额外成本。这代表了服务器之间数据传输的额外开销。您可以增加或减少此数字,以反映到远程服务器的较高或较低的网络延迟。默认值是 0.2
。
当 use_remote_estimate
为 true 时,postgres_fdw
会从远程服务器获取行数和成本估计,然后将 fdw_startup_cost
和 fdw_tuple_cost
添加到成本估计中。当 use_remote_estimate
为 false 时,postgres_fdw
执行本地行数和成本估计,然后将 fdw_startup_cost
和 fdw_tuple_cost
添加到成本估计中。除非可以获得远程表统计数据的本地副本,否则这种本地估计不太可能非常准确。在外部表上运行 ANALYZE 是更新本地统计信息的方法;这将执行对远程表的扫描,然后像该表是本地表一样计算并存储统计信息。保留本地统计信息可以有效地减少远程表的每个查询的规划开销,但是如果远程表经常更新,则本地统计信息很快就会过时。
以下选项控制 ANALYZE
操作的行为
analyze_sampling
(字符串
)此选项可以为外部表或外部服务器指定,它决定在外部表上使用 ANALYZE
时,是在远程端对数据进行采样,还是读取并传输所有数据并在本地执行采样。支持的值有 off
、random
、system
、bernoulli
和 auto
。off
禁用远程采样,因此所有数据都会被传输并在本地采样。random
使用 random()
函数选择返回的行来执行远程采样,而 system
和 bernoulli
依赖于那些名称的内置 TABLESAMPLE
方法。random
适用于所有远程服务器版本,而 TABLESAMPLE
仅从 9.5 版本开始支持。auto
(默认值)会自动选择推荐的采样方法;目前,它表示根据远程服务器版本使用 bernoulli
或 random
。
默认情况下,只有使用内置运算符和函数的 WHERE
子句会被考虑在远程服务器上执行。包含非内置函数的子句在获取行后会在本地进行检查。如果这些函数在远程服务器上可用,并且可以保证产生与本地相同的结果,则可以通过发送这些 WHERE
子句进行远程执行来提高性能。可以使用以下选项控制此行为
extensions
(字符串
)此选项是以逗号分隔的 PostgreSQL 扩展的名称列表,这些扩展以兼容版本安装在本地和远程服务器上。属于列出扩展的不可变函数和运算符将被视为可运送到远程服务器。此选项只能为外部服务器指定,不能按表指定。
当使用 extensions
选项时,用户有责任确保列出的扩展存在并且在本地和远程服务器上的行为相同。否则,远程查询可能会失败或行为异常。
fetch_size
(整数
)此选项指定 postgres_fdw
在每次获取操作中应获取的行数。可以为外部表或外部服务器指定此选项。在表上指定的选项会覆盖为服务器指定的选项。默认值是 100
。
batch_size
(整数
)此选项指定 postgres_fdw
在每次插入操作中应插入的行数。可以为外部表或外部服务器指定此选项。在表上指定的选项会覆盖为服务器指定的选项。默认值是 1
。
请注意,postgres_fdw
一次实际插入的行数取决于列数和提供的 batch_size
值。该批次作为单个查询执行,libpq 协议(postgres_fdw
使用该协议连接到远程服务器)将单个查询中的参数数量限制为 65535。当列数 * batch_size
超过限制时,将调整 batch_size
以避免错误。
此选项也适用于复制到外部表。在这种情况下,postgres_fdw
一次复制的实际行数以类似于插入情况的方式确定,但由于 COPY
命令的实现限制,最多限制为 1000。
postgres_fdw
支持异步执行,它并发运行 Append
节点的多个部分,而不是串行运行,以提高性能。可以使用以下选项控制此执行
async_capable
(布尔值
)此选项控制 postgres_fdw
是否允许并发扫描外部表以进行异步执行。可以为外部表或外部服务器指定此选项。表级选项会覆盖服务器级选项。默认值是 false
。
为了确保从外部服务器返回的数据是一致的,postgres_fdw
将只为给定的外部服务器打开一个连接,并且即使涉及多个外部表,也会按顺序针对该服务器运行所有查询,除非这些表受不同的用户映射影响。在这种情况下,禁用此选项以消除与异步运行查询相关的开销可能会更有效。
即使 Append
节点包含同步执行的子计划和异步执行的子计划,也会应用异步执行。在这种情况下,如果异步子计划是使用 postgres_fdw
处理的,则在至少一个同步子计划返回所有元组之后,才会返回来自异步子计划的元组,因为该子计划在异步子计划等待发送到外部服务器的异步查询的结果时执行。此行为可能会在未来的版本中更改。
如事务管理部分所述,在 postgres_fdw
中,事务是通过创建相应的远程事务来管理的,子事务是通过创建相应的远程子事务来管理的。当多个远程事务参与当前本地事务时,默认情况下,当本地事务提交或中止时,postgres_fdw
会串行提交或中止这些远程事务。当多个远程子事务参与当前本地子事务时,默认情况下,当本地子事务提交或中止时,postgres_fdw
会串行提交或中止这些远程子事务。可以使用以下选项提高性能
parallel_commit
(布尔值
)此选项控制当本地事务提交时,postgres_fdw
是否并行提交在本地事务中在外部服务器上打开的远程事务。此设置也适用于远程和本地子事务。此选项只能为外部服务器指定,不能按表指定。默认值是 false
。
parallel_abort
(布尔值
)此选项控制当本地事务中止时,postgres_fdw
是否并行中止在本地事务中在外部服务器上打开的远程事务。此设置也适用于远程和本地子事务。此选项只能为外部服务器指定,不能按表指定。默认值是 false
。
如果启用了这些选项的多个外部服务器参与了本地事务,则当本地事务提交或中止时,这些外部服务器上的多个远程事务将在这些外部服务器之间并行提交或中止。
当启用这些选项时,具有许多远程事务的外部服务器在提交或中止本地事务时可能会看到负面的性能影响。
默认情况下,使用 postgres_fdw
的所有外部表都被假定为可更新。可以使用以下选项覆盖此行为
updatable
(布尔值
)此选项控制 postgres_fdw
是否允许使用 INSERT
、UPDATE
和 DELETE
命令修改外部表。可以为外部表或外部服务器指定此选项。表级选项会覆盖服务器级选项。默认值是 true
。
当然,如果远程表实际上不可更新,则仍然会发生错误。使用此选项主要允许在本地抛出错误,而无需查询远程服务器。但是请注意,information_schema
视图将根据此选项的设置报告 postgres_fdw
外部表是可更新的还是不可更新的,而不检查远程服务器。
默认情况下,使用 postgres_fdw
的所有外部表都被假定为可截断。可以使用以下选项覆盖此行为
truncatable
(布尔值
)此选项控制 postgres_fdw
是否允许使用 TRUNCATE
命令截断外部表。它可以为外部表或外部服务器指定。表级别的选项会覆盖服务器级别的选项。默认值为 true
。
当然,如果远程表实际上不能截断,仍然会发生错误。使用此选项主要允许在不查询远程服务器的情况下在本地抛出错误。
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 中排除。由于可以通过作为分区层次结构根的分区表访问所有数据,因此仅导入分区表应允许访问所有数据,而无需创建额外的对象。
默认情况下,postgres_fdw
建立到外部服务器的所有连接都在本地会话中保持打开以供重用。
keep_connections
(boolean
)此选项控制 postgres_fdw
是否保持与外部服务器的连接打开,以便后续查询可以重用它们。它只能为外部服务器指定。默认值为 on
。如果设置为 off
,则在每个事务结束时,将丢弃与此外部服务器的所有连接。
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
postgres_fdw
在第一个使用与外部服务器关联的外部表的查询期间建立与外部服务器的连接。默认情况下,此连接将保留并在同一会话中的后续查询中重用。可以使用外部服务器的 keep_connections
选项控制此行为。如果使用多个用户身份(用户映射)来访问外部服务器,则为每个用户映射建立连接。
更改或删除外部服务器或用户映射的定义时,将关闭关联的连接。但是请注意,如果当前本地事务中有任何连接正在使用,则它们将保留到事务结束。当未来的查询使用外部表时,将重新建立关闭的连接。
一旦建立了与外部服务器的连接,默认情况下会保持该连接,直到本地或相应的远程会话退出。要显式断开连接,可以禁用外部服务器的 keep_connections
选项,或者可以使用 postgres_fdw_disconnect
和 postgres_fdw_disconnect_all
函数。例如,这些对于关闭不再需要的连接非常有用,从而释放外部服务器上的连接。
在引用外部服务器上任何远程表的查询期间,如果尚未打开与当前本地事务对应的事务,则 postgres_fdw
在远程服务器上打开一个事务。当本地事务提交或中止时,远程事务将提交或中止。保存点也通过创建相应的远程保存点来管理。
当本地事务具有 SERIALIZABLE
隔离级别时,远程事务使用 SERIALIZABLE
隔离级别;否则,它使用 REPEATABLE READ
隔离级别。此选择确保如果查询在远程服务器上执行多次表扫描,它将获得所有扫描的快照一致的结果。一个结果是,即使由于其他活动在远程服务器上发生并发更新,单个事务内的连续查询也将看到来自远程服务器的相同数据。如果本地事务使用 SERIALIZABLE
或 REPEATABLE READ
隔离级别,则无论如何都会预期此行为,但是对于 READ COMMITTED
本地事务而言,这可能会令人惊讶。未来的 PostgreSQL 版本可能会修改这些规则。
请注意,postgres_fdw
当前不支持准备远程事务以进行两阶段提交。
postgres_fdw
尝试优化远程查询,以减少从外部服务器传输的数据量。这是通过将查询的 WHERE
子句发送到远程服务器执行,以及不检索当前查询不需要的表列来实现的。为了降低查询执行错误的风险,只有当 WHERE
子句仅使用内置数据类型、操作符和函数,或者属于外部服务器的 extensions
选项中列出的扩展时,才将其发送到远程服务器。此类子句中的操作符和函数也必须是 IMMUTABLE
的。对于 UPDATE
或 DELETE
查询,如果不存在无法发送到远程服务器的查询 WHERE
子句,查询没有本地连接,目标表上没有行级本地 BEFORE
或 AFTER
触发器或存储的生成列,以及没有父视图的 CHECK OPTION
约束,postgres_fdw
会尝试通过将整个查询发送到远程服务器来优化查询执行。在 UPDATE
中,要赋值给目标列的表达式必须仅使用内置数据类型、IMMUTABLE
操作符或 IMMUTABLE
函数,以降低查询执行错误的风险。
当 postgres_fdw
遇到同一外部服务器上外部表之间的连接时,它会将整个连接发送到外部服务器,除非它认为从每个表单独获取行会更有效,或者除非所涉及的表引用受不同的用户映射约束。在发送 JOIN
子句时,它会采取与上述 WHERE
子句相同的预防措施。
可以使用 EXPLAIN VERBOSE
来检查实际发送到远程服务器执行的查询。
在 postgres_fdw
打开的远程会话中,search_path 参数被设置为仅包含 pg_catalog
,以便只有内置对象在没有模式限定的情况下可见。对于 postgres_fdw
本身生成的查询,这不成问题,因为它始终提供此类限定。然而,这可能会对通过远程表上的触发器或规则在远程服务器上执行的函数造成风险。例如,如果一个远程表实际上是一个视图,则该视图中使用的任何函数都将使用受限的搜索路径执行。建议在这些函数中限定所有名称的模式,或者为这些函数附加 SET search_path
选项(请参阅 CREATE FUNCTION),以建立其预期的搜索路径环境。
postgres_fdw
同样为各种参数建立远程会话设置
TimeZone 设置为 UTC
DateStyle 设置为 ISO
IntervalStyle 设置为 postgres
extra_float_digits 对于 9.0 及更高版本的远程服务器设置为 3
,对于较旧版本设置为 2
这些参数不如 search_path
那样容易引起问题,但如果需要,可以使用函数 SET
选项进行处理。
不建议您通过更改这些参数的会话级设置来覆盖此行为;这很可能会导致 postgres_fdw
运行异常。
postgres_fdw
可以与追溯到 PostgreSQL 8.3 的远程服务器一起使用。只读功能可追溯到 8.1。但是,一个限制是 postgres_fdw
通常假设不可变的内置函数和操作符可以安全地发送到远程服务器执行,如果它们出现在外部表的 WHERE
子句中。因此,在远程服务器发布后添加的内置函数可能会被发送到它执行,从而导致“函数不存在”或类似的错误。可以通过重写查询来解决此类故障,例如通过将外部表引用嵌入到带有 OFFSET 0
作为优化屏障的子 SELECT
中,并将有问题的函数或操作符放置在子 SELECT
之外。
postgres_fdw
可以在等待事件类型 Extension
下报告以下等待事件
PostgresFdwCleanupResult
正在等待远程服务器上的事务中止。
PostgresFdwConnect
正在等待建立与远程服务器的连接。
PostgresFdwGetResult
正在等待接收来自远程服务器的查询结果。
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'
。
以下是使用 postgres_fdw
创建外部表的示例。首先安装扩展:
CREATE EXTENSION postgres_fdw;
然后使用 CREATE SERVER 创建外部服务器。在本例中,我们希望连接到位于主机 192.83.123.89
上、监听端口 5432
的 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
比手动构造外部表定义更可取。
Shigeru Hanada <[email protected]>
如果您在文档中看到任何不正确的内容、与您使用特定功能的经验不符的内容,或者需要进一步澄清的内容,请使用此表单报告文档问题。