-- ============================================================================= -- 迁移脚本:配置 FDW 跨库映射(ETL 库 → 业务库) -- 日期:2026-02-24 -- 目标库:test_zqyy_app(通过 APP_DB_DSN 连接) -- 说明:通过 postgres_fdw 将 ETL 库 app Schema 的 RLS 视图映射为业务库 -- fdw_etl Schema 的只读外部表,使后端无需直连 ETL 库即可读取汇总/维度数据。 -- 前提: -- 1. ETL 库已部署 app Schema 及 RLS 视图(2026-02-24__p1_create_app_schema_rls_views.sql) -- 2. ETL 库已创建 app_reader 只读角色 -- 3. 业务库已创建 app_user 角色 -- 需求:3.1, 3.2, 3.3, 3.4, 3.7, 4.2, 4.3, 4.4, 4.5, 4.6 -- ============================================================================= -- --------------------------------------------------------------------------- -- 1. 安装 postgres_fdw 扩展 -- --------------------------------------------------------------------------- CREATE EXTENSION IF NOT EXISTS postgres_fdw; -- --------------------------------------------------------------------------- -- 2. 创建外部服务器(指向 ETL 库) -- host / dbname / port 使用占位符 '***',部署时按环境替换 -- 服务器名使用通用名(不含环境前缀),通过连接参数区分环境 -- --------------------------------------------------------------------------- CREATE SERVER IF NOT EXISTS etl_feiqiu_server FOREIGN DATA WRAPPER postgres_fdw OPTIONS (host '***', dbname '***', port '***'); -- --------------------------------------------------------------------------- -- 3. 创建用户映射(只读角色) -- app_user = test_zqyy_app 侧的应用连接角色 -- app_reader = ETL 库侧的只读角色 -- 密码占位符 '***',部署时替换为真实凭据 -- --------------------------------------------------------------------------- CREATE USER MAPPING IF NOT EXISTS FOR app_user SERVER etl_feiqiu_server OPTIONS (user 'app_reader', password '***'); -- --------------------------------------------------------------------------- -- 4. 创建 fdw_etl Schema(幂等处理:先 DROP 再重建) -- IMPORT FOREIGN SCHEMA 不是幂等的(外部表已存在会报错), -- 因此采用 DROP CASCADE + 重建的方式确保可重复执行。 -- --------------------------------------------------------------------------- DROP SCHEMA IF EXISTS fdw_etl CASCADE; CREATE SCHEMA fdw_etl; -- --------------------------------------------------------------------------- -- 5. 批量导入 ETL 库 app Schema 的所有外部表到 fdw_etl -- --------------------------------------------------------------------------- IMPORT FOREIGN SCHEMA app FROM SERVER etl_feiqiu_server INTO fdw_etl; -- --------------------------------------------------------------------------- -- 6. 授权:允许 app_user 访问 fdw_etl Schema 及其外部表 -- --------------------------------------------------------------------------- GRANT USAGE ON SCHEMA fdw_etl TO app_user; GRANT SELECT ON ALL TABLES IN SCHEMA fdw_etl TO app_user; -- 未来新导入的外部表自动授权 ALTER DEFAULT PRIVILEGES IN SCHEMA fdw_etl GRANT SELECT ON TABLES TO app_user; -- ============================================================================= -- 回滚脚本(按逆序执行) -- ============================================================================= -- ALTER DEFAULT PRIVILEGES IN SCHEMA fdw_etl REVOKE SELECT ON TABLES FROM app_user; -- REVOKE SELECT ON ALL TABLES IN SCHEMA fdw_etl FROM app_user; -- REVOKE USAGE ON SCHEMA fdw_etl FROM app_user; -- DROP SCHEMA IF EXISTS fdw_etl CASCADE; -- DROP USER MAPPING IF EXISTS FOR app_user SERVER etl_feiqiu_server; -- DROP SERVER IF EXISTS etl_feiqiu_server CASCADE; -- DROP EXTENSION IF EXISTS postgres_fdw;