pg_foreign_data_wrapper
是 PostgreSQL 和 Hologres 中定义外部数据源连接器(FDW)的核心系统表,它存储了所有可用的外部数据包装器的元数据信息。
表结构定义解析
sql
CREATE TABLE pg_catalog.pg_foreign_data_wrapper (
fdwname name NOT NULL, -- 外部数据包装器名称
fdwowner oid NOT NULL, -- 包装器所有者的OID
fdwhandler oid NOT NULL, -- 处理函数的OID
fdwvalidator oid NOT NULL, -- 验证函数的OID
fdwacl aclitem[], -- 访问权限控制列表
fdwoptions text[] -- 包装器级别的选项
) WITH OIDS;
字段详细说明
- fdwname (name类型,非空)
-
- 外部数据包装器的名称(如'mysql_fdw', 'postgres_fdw')
- 在创建外部服务器时引用此名称
- fdwowner (oid类型,非空)
-
- 包装器所有者的OID,关联到
pg_authid
系统表 - 所有者可以修改或删除此包装器
- 包装器所有者的OID,关联到
- fdwhandler (oid类型,非空)
-
- 处理函数的OID,关联到
pg_proc
系统表 - 该函数负责实际执行外部数据访问操作
- 处理函数的OID,关联到
- fdwvalidator (oid类型,非空)
-
- 验证函数的OID,关联到
pg_proc
系统表 - 用于验证服务器和表选项的有效性
- 验证函数的OID,关联到
- fdwacl (aclitem[]类型)
-
- 访问控制列表,定义哪些用户/角色可以使用此包装器
- 格式示例:
{user1=U/user1,role1=U/admin}
- fdwoptions (text[]类型)
-
- 包装器级别的全局选项,以键值对数组形式保存
- 例如:
{debug=true, batch_size='1000'}
外部数据架构层级
sql
pg_foreign_data_wrapper (FDW定义)
↓
pg_foreign_server (服务器连接定义)
↓
pg_foreign_table (外部表定义)
实际应用示例
- 查询已安装的FDW:
sql
SELECT
fdwname AS wrapper_name,
pg_get_userbyid(fdwowner) AS owner,
fdwoptions
FROM pg_foreign_data_wrapper;
- 创建FDW的标准方法(推荐):
sql
-- 安装扩展(如果FDW以扩展形式提供)
CREATE EXTENSION mysql_fdw;
-- 创建包装器
CREATE FOREIGN DATA WRAPPER mysql_fdw
HANDLER mysql_fdw_handler
VALIDATOR mysql_fdw_validator;
- 使用FDW创建外部服务器:
sql
CREATE SERVER mysql_server
FOREIGN DATA WRAPPER mysql_fdw
OPTIONS (host 'mysql.example.com', port '3306');
Hologres中的特殊说明
在阿里云Hologres中:
- 支持特定的外部数据源连接器,如连接MaxCompute的FDW
- 可能有预安装的专有FDW实现
- 某些功能可能与原生PostgreSQL有差异
重要安全警告
您代码中显示的DROP TABLE
和CREATE TABLE
语句是极其危险的操作:
- 绝对不要直接操作系统表,这会导致:
-
- 数据库服务崩溃
- 外部数据访问功能失效
- 数据丢失风险
- 只应使用标准DDL命令管理FDW:
sql
-- 创建包装器
CREATE FOREIGN DATA WRAPPER ... HANDLER ... VALIDATOR ...;
-- 删除包装器
DROP FOREIGN DATA WRAPPER IF EXISTS wrapper_name;
- 权限管理应使用:
sql
GRANT USAGE ON FOREIGN DATA WRAPPER wrapper_name TO user_name;
典型FDW工作流程
- 安装FDW扩展(如
mysql_fdw
) - 创建外部数据包装器
- 创建外部服务器(定义连接信息)
- 创建用户映射(定义认证信息)
- 创建外部表(定义表结构映射)