PostgreSQL中如何实现类似T-SQL EXECUTE AT的链接服务器远程查询?
PostgreSQL 访问链接服务器的替代方案
PostgreSQL 中没有与 T-SQL 里 EXECUTE AT 或 EXEC [LINKEDSERVERNAME].[DB]... 完全对等的语法,它主要通过**外部数据包装器(Foreign Data Wrapper, FDW)**或 dblink 扩展来实现跨服务器查询的需求,以下是具体实现方式:
方法一:使用外部数据包装器(FDW)
FDW 是 PostgreSQL 官方推荐的访问外部数据源的方式,支持连接 PostgreSQL、MySQL、SQL Server 等多种数据库,以连接另一台 PostgreSQL 为例:
启用对应的 FDW 扩展(不同数据库对应不同扩展,比如连接 SQL Server 用
tds_fdw,MySQL 用mysql_fdw)CREATE EXTENSION postgres_fdw;创建外部服务器,配置远程连接信息
CREATE SERVER my_linked_server FOREIGN DATA WRAPPER postgres_fdw OPTIONS (host '远程服务器IP/域名', port '5432', dbname '远程数据库名');创建用户映射,将本地用户关联到远程服务器的账号
CREATE USER MAPPING FOR 本地用户名 SERVER my_linked_server OPTIONS (user '远程用户名', password '远程密码');导入远程表结构到本地,或手动创建外部表
- 批量导入远程 schema 下的所有表:
IMPORT FOREIGN SCHEMA 远程schema名 FROM SERVER my_linked_server INTO 本地schema名; - 手动创建单个外部表:
CREATE FOREIGN TABLE 本地schema名.外部表名 ( id INT, name VARCHAR(100) ) SERVER my_linked_server OPTIONS (schema_name '远程schema名', table_name '远程表名');
- 批量导入远程 schema 下的所有表:
像查询本地表一样访问远程数据
SELECT * FROM 本地schema名.外部表名;
方法二:使用 dblink 扩展执行动态远程 SQL
如果需要像 EXECUTE AT 那样动态执行远程自定义 SQL,可以用 dblink 扩展:
启用 dblink 扩展
CREATE EXTENSION dblink;直接执行远程 SQL(两种方式)
- 直接传入连接字符串:
SELECT * FROM dblink( 'host=远程服务器IP port=5432 dbname=远程数据库名 user=远程用户名 password=远程密码', 'SELECT id, name FROM 远程schema名.远程表名' ) AS 结果集别名(id INT, name VARCHAR(100)); - 引用已创建的外部服务器(无需重复写连接信息):
SELECT * FROM dblink('my_linked_server', 'SELECT id, name FROM 远程schema名.远程表名') AS 结果集别名(id INT, name VARCHAR(100));
- 直接传入连接字符串:
总结
- FDW 适合常规的、长期的跨服务器表访问,能将远程表映射为本地表,使用方式更贴近本地查询;
- dblink 更适合临时的、动态的远程 SQL 执行,灵活性更高。
内容的提问来源于stack exchange,提问作者Lunae Lumen
相关产品推荐
相关产品推荐

