Files
Neo-ZQYY/db/fdw/setup_fdw_reverse.sql

112 lines
5.3 KiB
SQL
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
-- =============================================================================
-- FDW 反向映射配置(生产环境)— 在 etl_feiqiu 数据库中执行
-- 用途:通过 postgres_fdw 将 zqyy_app.member_birthday_manual 只读映射到 etl_feiqiu
-- 使 ETL DWS 任务无需直接连接业务库即可读取助教手动补录的会员生日数据。
-- 方向etl_feiqiu → zqyy_app与 setup_fdw.sql 的 zqyy_app → etl_feiqiu 方向相反)
-- 前提zqyy_app 数据库已部署 member_birthday_manual 表(见 C2 迁移脚本)
-- 测试环境版本setup_fdw_reverse_test.sql指向 test_zqyy_app
-- Requirements: 5.3
-- =============================================================================
-- -----------------------------------------------------------------------------
-- 1. 安装 postgres_fdw 扩展(如已安装则跳过)
-- -----------------------------------------------------------------------------
CREATE EXTENSION IF NOT EXISTS postgres_fdw;
-- -----------------------------------------------------------------------------
-- 2. 创建外部服务器(指向 zqyy_app 业务库)
-- 部署时按实际环境替换 host / port
-- -----------------------------------------------------------------------------
CREATE SERVER IF NOT EXISTS zqyy_app_server
FOREIGN DATA WRAPPER postgres_fdw
OPTIONS (host 'localhost', dbname 'zqyy_app', port '5432');
-- -----------------------------------------------------------------------------
-- 3. 创建用户映射(只读角色)
-- etl_user = etl_feiqiu 侧的 ETL 连接角色
-- app_reader = zqyy_app 侧的只读角色
-- 密码占位符 '***',部署时替换为真实凭据
-- -----------------------------------------------------------------------------
CREATE USER MAPPING IF NOT EXISTS FOR etl_user
SERVER zqyy_app_server
OPTIONS (user 'app_reader', password '***');
-- -----------------------------------------------------------------------------
-- 4. 创建目标 schema存放来自业务库的外部表
-- -----------------------------------------------------------------------------
CREATE SCHEMA IF NOT EXISTS fdw_app;
-- -----------------------------------------------------------------------------
-- 5. 创建外部表member_birthday_manual
-- 映射 zqyy_app.public.member_birthday_manualETL 侧只读
-- 列定义须与源表结构保持一致(见 C2 迁移脚本)
-- -----------------------------------------------------------------------------
CREATE FOREIGN TABLE IF NOT EXISTS fdw_app.member_birthday_manual (
id BIGINT,
member_id BIGINT,
birthday_value DATE,
recorded_by_assistant_id BIGINT,
recorded_by_name VARCHAR(50),
recorded_at TIMESTAMPTZ,
source VARCHAR(20),
site_id BIGINT
) SERVER zqyy_app_server
OPTIONS (schema_name 'public', table_name 'member_birthday_manual');
-- -----------------------------------------------------------------------------
-- 6. 授权:允许 etl_user 访问 fdw_app schema 及其外部表
-- -----------------------------------------------------------------------------
GRANT USAGE ON SCHEMA fdw_app TO etl_user;
GRANT SELECT ON ALL TABLES IN SCHEMA fdw_app TO etl_user;
-- 未来新增的外部表自动授权
ALTER DEFAULT PRIVILEGES IN SCHEMA fdw_app GRANT SELECT ON TABLES TO etl_user;
-- =============================================================================
-- 回滚脚本(按逆序执行)
-- =============================================================================
-- ALTER DEFAULT PRIVILEGES IN SCHEMA fdw_app REVOKE SELECT ON TABLES FROM etl_user;
-- REVOKE SELECT ON ALL TABLES IN SCHEMA fdw_app FROM etl_user;
-- REVOKE USAGE ON SCHEMA fdw_app FROM etl_user;
-- DROP FOREIGN TABLE IF EXISTS fdw_app.member_birthday_manual;
-- DROP SCHEMA IF EXISTS fdw_app CASCADE;
-- DROP USER MAPPING IF EXISTS FOR etl_user SERVER zqyy_app_server;
-- DROP SERVER IF EXISTS zqyy_app_server CASCADE;
-- =============================================================================
-- 验证 SQL
-- =============================================================================
-- 1. 确认外部服务器 zqyy_app_server 存在
-- SELECT srvname, srvowner::regrole, srvoptions
-- FROM pg_foreign_server
-- WHERE srvname = 'zqyy_app_server';
-- 预期1 行srvoptions 包含 dbname=zqyy_app
-- 2. 确认用户映射存在
-- SELECT um.umid, s.srvname, um.umoptions
-- FROM pg_user_mapping um
-- JOIN pg_foreign_server s ON um.umserver = s.oid
-- WHERE s.srvname = 'zqyy_app_server';
-- 预期1 行
-- 3. 确认 fdw_app schema 存在
-- SELECT schema_name
-- FROM information_schema.schemata
-- WHERE schema_name = 'fdw_app';
-- 预期1 行
-- 4. 确认外部表 fdw_app.member_birthday_manual 存在且列完整
-- SELECT column_name, data_type
-- FROM information_schema.columns
-- WHERE table_schema = 'fdw_app'
-- AND table_name = 'member_birthday_manual'
-- ORDER BY ordinal_position;
-- 预期8 列id, member_id, birthday_value, recorded_by_assistant_id,
-- recorded_by_name, recorded_at, source, site_id
-- 5. 确认外部表可读取(需 zqyy_app 侧表已存在且有网络连通性)
-- SELECT COUNT(*) FROM fdw_app.member_birthday_manual;
-- 预期:返回行数(可能为 0