You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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 为例:

  1. 启用对应的 FDW 扩展(不同数据库对应不同扩展,比如连接 SQL Server 用 tds_fdw,MySQL 用 mysql_fdw)

    CREATE EXTENSION postgres_fdw;
    
  2. 创建外部服务器,配置远程连接信息

    CREATE SERVER my_linked_server
    FOREIGN DATA WRAPPER postgres_fdw
    OPTIONS (host '远程服务器IP/域名', port '5432', dbname '远程数据库名');
    
  3. 创建用户映射,将本地用户关联到远程服务器的账号

    CREATE USER MAPPING FOR 本地用户名
    SERVER my_linked_server
    OPTIONS (user '远程用户名', password '远程密码');
    
  4. 导入远程表结构到本地,或手动创建外部表

    • 批量导入远程 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 '远程表名');
      
  5. 像查询本地表一样访问远程数据

    SELECT * FROM 本地schema名.外部表名;
    

如果需要像 EXECUTE AT 那样动态执行远程自定义 SQL,可以用 dblink 扩展:

  1. 启用 dblink 扩展

    CREATE EXTENSION dblink;
    
  2. 直接执行远程 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 12:34:53