文章 查看内容

离线开发依赖查询说明

离线开发依赖查询说明

141 0 高级调度 2026-8-12 08:50 发布者: 观小豪

适用于删除数据账户或数据集时提示“存在离线开发任务依赖”的定位排查。
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




路过

雷人

握手

鲜花

鸡蛋

评论

您需要登录后才可以发表言论 登录立即注册
微信服务号
联系我们
电话:400-880-0750
邮箱:hello@guandata.com
Copyright © 2001-2026 观远社区 版权所有 All Rights Reserved. 浙 ICP 备15006424号-3
去评论 去发文 返回顶部
返回顶部