刘光辉
昨天 bb638871a7fb692d80f1b7a758f991dc0879002c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
-- 产品母版洗数据 · 流程引擎库侧(docs/adr-multi-customer-db-isolation.md §6.2)
--
-- 只在母版实例 cx-pg-template 的 jnpf_flow 上跑。幂等可重放。
-- 用法:docker exec -i cx-pg-template psql -U postgres -d jnpf_flow -v ON_ERROR_STOP=1 < 本文件
--
-- 与 product-baseline-cleanup.sql(jnpf_init 侧)【必须成套执行】:
-- workflow_template.f_flowable_id 引用 act_re_deployment.id_,只洗一边等于人为制造
-- ADR §4 的半切故障(2026-08-03 就因此让测试环境 44/49 流程报「找不到流程模板」)。
--
-- 保留【流程定义】,清空【运行时 + 历史 + 身份】。同样用白名单:
-- 漏清 → 客户1 的流程实例数据流到新客户;误清 → 定义没了,装完就发现。风险不对称。
--
-- ⚠️ 两类表绝对不能清,清了引擎会崩或重跑迁移:
--    · *_databasechangelog / *_databasechangeloglock —— Liquibase 的 schema 版本账本
--    · act_ge_property —— 引擎 schema 版本
-- ⚠️ act_ge_bytearray 同时存【部署资源】与【运行时变量 blob】,整表清会毁掉流程定义。
--    2026-08-04 实查客户1 库:276 行【全部】有 deployment_id_,运行时 blob 为 0 行,
--    故整表保留不会带入业务数据。仍保留下方按 deployment_id_ IS NULL 的删除作为通则,
--    将来若出现运行时 blob 会被自动清掉。
-- ⚠️ 跑前已实查:没有任何 keep 表的 FK 指向将被清空的表,故 TRUNCATE ... CASCADE 不会波及定义。
 
BEGIN;
 
DO $$
DECLARE
  keep text[] := ARRAY[
    -- ① BPMN 流程定义(核心:与 jnpf_init.workflow_template.f_flowable_id 配对的就是它)
    'act_re_deployment','act_re_procdef','act_re_model','act_procdef_info',
    -- ② 定义资源与引擎版本(清了引擎起不来)
    'act_ge_bytearray','act_ge_property',
    -- ③ DMN / CMMN / App / Event 的【定义】部分(对应的 hi_/ru_ 在下面被清)
    'act_dmn_decision','act_dmn_deployment','act_dmn_deployment_resource',
    'act_cmmn_casedef','act_cmmn_deployment','act_cmmn_deployment_resource',
    'act_app_appdef','act_app_deployment','act_app_deployment_resource',
    'flw_channel_definition','flw_event_definition','flw_event_deployment','flw_event_resource',
    -- ④ Liquibase schema 版本账本(清了会重跑迁移)
    'act_app_databasechangelog','act_app_databasechangeloglock',
    'act_cmmn_databasechangelog','act_cmmn_databasechangeloglock',
    'act_dmn_databasechangelog','act_dmn_databasechangeloglock',
    'flw_ev_databasechangelog','flw_ev_databasechangeloglock'
  ];
  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 $$;
 
-- act_ge_bytearray 的精确清理:只删运行时变量 blob,保留部署资源。
-- 通则形式而非按具体 id——将来出现运行时 blob 会被自动清掉。
DELETE FROM act_ge_bytearray WHERE deployment_id_ IS NULL;
 
COMMIT;