| 1.结论先看 删除数据账户或数据集时,血缘图显示“无来源/无影响”不代表资源可删除。删除校验会额外检查离线开发任务中是否有节点仍引用该数据账户或数据集。 1.1)删除数据账户:优先查离线开发数据流 action 中的 acId。 1.2)删除数据集:需要同时查主工作流任务引用和 dataflow action 输入/输出数据集引用。 1.3)需要切换到 workflow 元数据库后查询 t_ds_process_definition.process_definition_json。
2.删除数据账户时查询 适用场景:删除数据账户 / 连接账号时报“存在依赖于该数据账户的离线开发任务”。 2.1)查询 sql: select distinct pd.dom_id, pd.process_definition_id as dataflow_id, pd.name as dataflow_name, pd.process_type, action ->> 'id' as action_id, action ->> 'type' as action_type, action ->> 'name' as action_name, action ->> 'acId' as ac_id from t_ds_process_definition pd cross join lateral json_array_elements( coalesce(pd.process_definition_json::json -> 'actions', '[]'::json) ) action where pd.dom_id = 'guanbi' and pd.process_type in (1, 3) and pd.is_del is false and action ->> 'acId' = '数据账户Id' order by pd.name; 2.2)数据账户 id 获取: 2.2.1)首先点击到数据准备-数据账户,找到这个数据账户 2.2.2)打开开发者调试工具f12-网络 2.2.3)然后编辑这个数据账户 2.2.4)找到这种account的,它的后面就是数据账户 id 2.2.5)可以右键复制网址就可以把那个 id 拿到 2.3)字段含义 字段 | 含义 | 怎么用 | dom_id | 域 / 组织 ID。 | 确认是否为目标客户域,例如 guanbi。 | dataflow_id | 离线开发数据流定义 ID,对应 process_definition_id。 | 作为唯一标识,可继续查父流程或定位任务。 | dataflow_name | 离线开发数据流名称。 | 优先拿这个名称去离线开发页面搜索。 | process_type | 流程类型。此查询限定 1、3,通常是 dataflow / db_dataflow 类型。 | 判断记录是否来自数据流类定义。 | action_id | 数据流中的节点 ID。 | 页面或 JSON 中精确定位引用账号的节点。 | action_type | 节点类型,例如 SQL、输入、FTP 等。 | 判断是哪类节点使用了该数据账户。 | action_name | 节点名称。 | 打开数据流后按节点名称查找,最直观。 | ac_id | 被引用的数据账户 ID。 | 应等于本次要删除的账号 ID。 |
3.删除数据集时的查询 适用场景:删除数据集时报“存在依赖于该数据集的离线开发任务”。 3.1)主工作流任务中的数据集引用 3.1.1)查询 sql: select distinct pd.dom_id, pd.process_definition_id as process_id, pd.name as process_name, pd.process_type, task ->> 'id' as task_id, task ->> 'type' as task_type, task ->> 'name' as task_name, task -> 'params' ->> 'dsId' as ds_id, task -> 'params' ->> 'datasetId' as dataset_id, task -> 'params' ->> 'inputDsId' as input_ds_id from t_ds_process_definition pd cross join lateral json_array_elements( coalesce(pd.process_definition_json::json -> 'tasks', '[]'::json) ) task where pd.dom_id = 'guanbi' and pd.is_del is false and ( task -> 'params' ->> 'dsId' = '${dsId}' or task -> 'params' ->> 'datasetId' = '${dsId}' or task -> 'params' ->> 'inputDsId' = '${dsId}' or task::text like '%${dsId}%' ) order by pd.name; 3.1.2)字段含义 字段 | 含义 | 怎么用 | process_id | 主工作流 / 离线开发任务 ID。 | 用于定位最终需要打开处理的离线开发任务。 | process_name | 主工作流 / 离线开发任务名称。 | 在离线开发页面搜索这个名称。 | process_type | 流程类型。主流程通常不是 dataflow 子定义。 | 辅助判断这是父级任务还是子数据流。 | task_id | 主工作流里的节点 ID。 | 精确定位哪个节点引用了数据集。 | task_type | 主工作流里的节点类型。 | 判断是数据集节点、SQL/ETL 节点、Python 节点等。 | task_name | 主工作流里的节点名称。 | 页面打开任务后查找该节点。 | ds_id / dataset_id / input_ds_id | 从节点参数里解析出的数据集 ID。 | 命中任一字段说明该节点可能引用了待删除数据集。 |
3.2)dataflow action 中的输入/输出数据集引用 3.2.1)查询 sql: select distinct pd.dom_id, pd.process_definition_id as dataflow_id, pd.name as dataflow_name, pd.process_type, action ->> 'id' as action_id, action ->> 'type' as action_type, action ->> 'name' as action_name, action ->> 'inputDsId' as input_ds_id, (action ->> 'dataSource')::json ->> 'dsId' as output_ds_id from t_ds_process_definition pd cross join lateral json_array_elements( coalesce(pd.process_definition_json::json -> 'actions', '[]'::json) ) action where pd.dom_id = 'guanbi' and pd.process_type in (1, 3) and pd.is_del is false and ( action ->> 'inputDsId' = '${dsId}' or ((action ->> 'dataSource')::json ->> 'dsId') = '${dsId}' or action::text like '%${dsId}%' ) order by pd.name; 3.2.1)字段含义 字段 | 含义 | 怎么用 | dataflow_id | 引用数据集的数据流定义 ID。 | 如果是子数据流,下一步要查父流程入口。 | dataflow_name | 数据流名称。 | 可直接在离线开发中搜索;若搜不到,再查父流程。 | action_id | 数据流 action 节点 ID。 | 定位具体引用节点。 | action_type | 数据流 action 节点类型。 | 判断是输入节点、输出节点、SQL 节点等。 | action_name | 数据流 action 节点名称。 | 页面中最方便识别的节点名。 | input_ds_id | action 参数中的输入数据集 ID。 | 命中表示该数据集被作为输入使用。 | output_ds_id | action.dataSource.dsId 中的输出数据集 ID。 | 命中表示该数据集被作为输出/更新目标使用。 |
4.查父流程入口 如果数据账户或数据集查出来的是 dataflow_id,但页面里找不到对应入口,说明它可能是被父工作流引用的子数据流。用 dataflow_id 继续查父流程: 4.1)查询 sql: select rel.process_definition_id as parent_process_id, parent_pd.name as parent_process_name, rel.sub_process_definition_id as dataflow_id, child_pd.name as dataflow_name from t_ds_relation_process_definition rel left join t_ds_process_definition parent_pd on parent_pd.process_definition_id = rel.process_definition_id left join t_ds_process_definition child_pd on child_pd.process_definition_id = rel.sub_process_definition_id where rel.sub_process_definition_id in ('${dataflow_id}') and parent_pd.is_del is false; 4.1)字段含义 字段 | 含义 | 怎么用 | parent_process_id | 父级离线开发任务 ID。 | 最终页面入口通常是这个父任务。 | parent_process_name | 父级离线开发任务名称。 | 优先在页面搜索这个名称并打开。 | dataflow_id | 子数据流 ID。 | 对应前一步查出的 dataflow_id。 | dataflow_name | 子数据流名称。 | 用于确认父子关系是否匹配。 |
5.处理路径 5.1)先确认 SQL 连接的是 workflow / dolphinscheduler 元库;BI 主元库没有 t_ds_process_definition。 5.2)删除数据账户:按 dataflow_name 打开任务,找到 action_name/action_type 对应节点,将节点中的数据账户换掉、清空,或删除该节点。 5.3)删除数据集:按 process_name 或 dataflow_name 打开任务,找到 task_name/action_name 对应节点,解除输入、输出或更新数据集引用。 5.4)如果查到子数据流但页面找不到入口,先用父流程 SQL 查 parent_process_name,再打开父任务处理。 5.5)所有查询结果都处理完后,再回到数据账户/数据集管理页面重试删除。
6.常见报错判断 报错 | 含义 | 处理 | relation "t_ds_dataflow_action_reference" does not exist | 当前环境没有新投影表,或未连到 workflow 元库。 | 老版本改用 JSON 解析 SQL;同时确认数据库连接。 | relation "t_ds_process_definition" does not exist | 当前连的不是 workflow / dolphinscheduler 元库。 | 切换到 workflow 元库后再执行查询。 | 查询有记录但血缘图无影响 | 血缘图和删除依赖校验口径不同。 | 以删除校验和 workflow 引用记录为准,解除离线开发引用后再删。 |
7.补充说明:查询出来的 name 是一串字符,不是具体的工作流名称的情况 
这里查出来的 name 不是前台离线开发列表里展示的工作流名称,而是内嵌数据流(dataflow / db_dataflow)的内部定义名,所以看起来像随机字符串,前台一般搜不到。要找前台能看到的工作流名称,需要用查出来的 process_definition_id 作为 dataflow_id,再查父工作流: select
rel.process_definition_id as parent_process_id,
parent_pd.name as parent_process_name,
rel.sub_process_definition_id as dataflow_id,
child_pd.name as dataflow_internal_name,
rel.sub_process_node_id,
rel.sub_process_params
from t_ds_relation_process_definition rel
left join t_ds_process_definition parent_pd
on parent_pd.process_definition_id = rel.process_definition_id
left join t_ds_process_definition child_pd
on child_pd.process_definition_id = rel.sub_process_definition_id
where rel.sub_process_definition_id in (
'这里填上一步查出来的 process_definition_id'
)
and parent_pd.dom_id = 'guanbi'
and parent_pd.is_del is false
order by parent_pd.name;
最终去页面里搜 parent_process_name,不是搜前面查出来的 name。
|