PostgreSQL/Hologres 外部服务器系统表 pg_foreign_server 详解

发布于:2025-06-24 ⋅ 阅读:(18) ⋅ 点赞:(0)

pg_foreign_server 是 PostgreSQL 和 Hologres 中定义外部数据服务器连接信息的核心系统表,它存储了所有外部服务器的配置信息。

表结构定义解析

CREATE TABLE pg_catalog.pg_foreign_server (
    srvname name NOT NULL,      -- 外部服务器名称
    srvowner oid NOT NULL,      -- 服务器所有者的OID
    srvfdw oid NOT NULL,        -- 外部数据包装器(FDW)的OID
    srvtype text,               -- 服务器类型标识符(可选)
    srvversion text,            -- 服务器版本信息(可选)
    srvacl aclitem[],           -- 访问权限控制列表
    srvoptions text[]           -- 服务器特定的选项,以"option=value"格式存储
) WITH OIDS;

字段详细说明

  1. srvname (name类型,非空)
    • 外部服务器的名称,用于在创建外部表时引用
    • 必须唯一,不能与现有服务器重名
  1. srvowner (oid类型,非空)
    • 服务器所有者的OID,关联到pg_authid系统表
    • 决定谁可以修改或删除此服务器定义
  1. srvfdw (oid类型,非空)
    • 外部数据包装器(Foreign Data Wrapper)的OID
    • 关联到pg_foreign_data_wrapper系统表
    • 决定此服务器使用哪种数据源连接器(如mysql_fdw, postgres_fdw等)
  1. srvtype (text类型,可选)
    • 服务器类型的描述性标识符
    • 例如:'mysql', 'oracle', 'hdfs'等
  1. srvversion (text类型,可选)
    • 服务器版本信息
    • 由FDW实现决定如何填充
  1. srvacl (aclitem[]类型)
    • 访问控制列表,定义哪些用户/角色可以使用此服务器
    • 格式示例:{user1=U/user1,user2=U/user1}
  1. srvoptions (text[]类型)
    • 服务器级别的选项设置,以键值对数组形式保存
    • 例如MySQL连接可能包含:{host='mysql.example.com', port='3306', dbname='mydb'}

外部数据架构关系

pg_foreign_data_wrapper (FDW定义)
  ↑
pg_foreign_server (服务器连接定义)
  ↑
pg_foreign_table (外部表定义)
  ↑
pg_class (表的基本属性)

实际应用示例

  1. 查询所有外部服务器信息
SELECT 
    s.srvname AS server_name,
    fdw.fdwname AS wrapper_name,
    pg_get_userbyid(s.srvowner) AS owner,
    s.srvtype,
    s.srvoptions
FROM 
    pg_foreign_server s
    JOIN pg_foreign_data_wrapper fdw ON s.srvfdw = fdw.oid;
  1. 创建外部服务器的标准方法(推荐)
CREATE SERVER mysql_server
FOREIGN DATA WRAPPER mysql_fdw
OPTIONS (host 'mysql.example.com', port '3306');
  1. 修改服务器选项
ALTER SERVER mysql_server OPTIONS (SET dbname 'newdb');

Hologres中的特殊说明

在阿里云Hologres中:

  1. 支持多种外部数据源连接,如MaxCompute、OSS等
  2. 可能有阿里云特定的FDW实现
  3. 某些选项可能与原生PostgreSQL不同

重要安全警告

您代码中显示的DROP TABLECREATE TABLE语句是直接操作系统表的危险操作:

  1. 绝对不要直接操作系统表,这会导致数据库损坏
  2. 只应使用标准DDL命令管理外部服务器:
-- 创建服务器
CREATE SERVER ... FOREIGN DATA WRAPPER ... OPTIONS (...);

-- 删除服务器
DROP SERVER IF EXISTS server_name;
  1. 权限管理应使用GRANT/REVOKE:
GRANT USAGE ON FOREIGN SERVER server_name TO user_name;

网站公告

今日签到

点亮在社区的每一天
去签到