-- 产品母版洗数据(docs/adr-multi-customer-db-isolation.md §6.2) -- -- 只在母版实例 cx-pg-template 的 jnpf_init 上跑。幂等可重放。 -- 用法:docker exec -i cx-pg-template psql -U postgres -d jnpf_init -v ON_ERROR_STOP=1 < 本文件 -- -- ═══ 为什么是白名单(枚举保留),不是黑名单(枚举清空)═══ -- 两个方向的错误后果不对称: -- 漏清一张业务表 → 客户1 的数据流到新客户,可能很久才被发现; -- 误清一张配置表 → 新客户少一份配置,装完就发现。 -- 所以枚举「保留什么」,其余一律清空。新增业务表不用改本文件(默认被清); -- 新增【配置类】表才需要加进 keep[]。 -- -- ═══ 保留/清空的产品决策(用户 2026-08-04 拍板)═══ -- · LIMS 基础档案(检验项目/请验类型/单位/质量标准/储存条件)→ 不分发,清空。 -- 理由:客户1 的档案带给客户2 大概率是错的,而且错得不明显;新客户按其实际标准录入。 -- · JNPF 自带 demo 数据(ext_* 10 张 / wform_* 6 张)→ 清空。平台示例,非产品资产。 -- · 组织架构与角色授权(base_organize/base_position/base_role/base_authorize)→ 全清。 -- 新客户组织结构必然不同;admin 是超管,不依赖 role 也能登录并配权限。 -- -- ⚠️ 本文件必须与 jnpf_flow 侧的清理【成套执行】: -- workflow_template.f_flowable_id 引用 act_re_deployment.id_,只洗一边 -- 等于人为制造 ADR §4 的半切故障。配套脚本见 product-baseline-cleanup-flow.sql。 -- ⚠️ 跑之前确认没有 FK 的 parent 落在 keep[] 上(TRUNCATE ... CASCADE 会连带清空)。 -- 2026-08-04 实查:全库仅 4 条 FK,全在 lims_* 内部且为 RESTRICT,不波及 keep[]。 BEGIN; DO $$ DECLARE keep text[] := ARRAY[ -- ① 低代码表单 / 流程 / 大屏 / 报表【定义】——产品资产核心 'base_visual_dev','base_visual_release','base_visual_filter','base_visual_kit', 'base_visual_link','base_visual_personal', 'blade_visual','blade_visual_config','blade_visual_component','blade_visual_assets','blade_visual_map', 'report_template','report_charts','report_version', 'workflow_template','workflow_version','workflow_node','workflow_candidates','workflow_operator', -- ② 菜单 / 字典 / 数据接口 / 打印模板 / 门户 / 系统配置 'base_module','base_module_button','base_module_data', 'base_dictionary_type','base_dictionary_data', 'base_data_interface','base_data_interface_oauth','base_data_set', 'base_sys_config','base_system','base_system_top','base_common_fields','base_common_words', 'base_bill_rule','base_code_num','base_print_template','base_print_version', 'base_portal','base_portal_data','base_portal_manage','base_standing', 'base_msg_template','base_msg_template_param','base_msg_send_template', 'base_integrate','base_integrate_node','base_permission_group','base_action','base_sign_img', -- ③ 平台自带基础数据(与客户无关的字典性数据) 'base_province','base_province_atlas','base_language', -- ④ 部分保留:整表豁免 TRUNCATE,下面用 DELETE 精确清(只留 admin) 'base_user','base_user_relation' ]; t text; BEGIN FOR t IN SELECT tablename FROM pg_tables WHERE schemaname = 'public' AND NOT (tablename = ANY(keep)) LOOP EXECUTE format('TRUNCATE TABLE %I CASCADE', t); END LOOP; END $$; -- ④ 的精确清理:只留 admin 一个账号及其关联 DELETE FROM base_user_relation WHERE f_user_id NOT IN (SELECT f_id FROM base_user WHERE f_account = 'admin'); DELETE FROM base_user WHERE f_account <> 'admin'; COMMIT;