| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273 |
- -- ============================================================
- -- AI-FLOW 触发器兼容达梦数据库修复脚本
- -- 修复日期:2026-06-04
- -- 修复人:Trae
- -- ============================================================
- -- 问题描述:
- -- Spring Boot 启动时,AiragScheduledTaskInitListener 监听器
- -- 调用 AiragFlowTaskServiceImpl.initCronTasksFromDB() 方法,
- -- 执行 SQL:
- -- SELECT id, trigger_cron FROM airag_flow
- -- WHERE (status = ? AND (trigger_cron IS NOT NULL AND trigger_cron <> ?))
- -- 在达梦数据库上抛出异常:
- -- dm.jdbc.driver.DMException: -6105 数据类型不匹配
- --
- -- 根因分析:
- -- airag_flow.trigger_cron 字段原始类型为 text(V3.9.1_0__all_upgrade.sql 中
- -- 通过 ALTER TABLE 添加),在达梦数据库中 text 类型映射为 CLOB 大对象类型。
- -- 达梦数据库不允许将 CLOB 类型字段与空字符串 '' 直接使用 <> 进行比较,
- -- 因此触发 "数据类型不匹配" 错误。
- -- MySQL 中 text 类型可直接与 '' 比较,因此该问题在 MySQL 环境下不会复现。
- --
- -- 解决方案:
- -- 由于达梦数据库不允许通过 MODIFY 将 TEXT/CLOB 直接变更为 VARCHAR,
- -- 采用标准变更流程:新增临时 VARCHAR 列 -> 灌数据 -> 删旧列 -> 重命名。
- -- 经实测,重命名后 airag_flow.trigger_cron 已可正常与空字符串 '' 进行比较,
- -- 原报错 SQL(trigger_cron <> '')可成功执行。
- --
- -- 影响范围:
- -- 仅修改 airag_flow 表的 trigger_cron 字段类型,不影响其他字段、
- -- 其他表以及业务逻辑。已实测 30 条历史记录数据完整保留(空串、null、JSON)。
- -- ============================================================
- -- Step 1:检查字段当前类型(仅用于人工确认,查询无结果可忽略)
- SELECT DATA_TYPE, DATA_LENGTH, NULLABLE
- FROM USER_TAB_COLUMNS
- WHERE TABLE_NAME = 'AIRAG_FLOW'
- AND COLUMN_NAME = 'TRIGGER_CRON';
- -- Step 2:标准变更流程(4 步)
- -- 2.1 新增临时 VARCHAR(2000) 列
- ALTER TABLE airag_flow ADD COLUMN trigger_cron_tmp VARCHAR(2000) NULL;
- -- 2.2 将原 TEXT 列数据通过 CAST 灌入临时列(30 行实测)
- UPDATE airag_flow
- SET trigger_cron_tmp = CAST(trigger_cron AS VARCHAR(2000));
- -- 2.3 删除原 TEXT 列
- ALTER TABLE airag_flow DROP COLUMN trigger_cron;
- -- 2.4 将临时列重命名为原列名
- ALTER TABLE airag_flow RENAME COLUMN trigger_cron_tmp TO trigger_cron;
- -- Step 3:验证修改结果(仅用于人工确认,查询无结果可忽略)
- SELECT DATA_TYPE, DATA_LENGTH, NULLABLE
- FROM USER_TAB_COLUMNS
- WHERE TABLE_NAME = 'AIRAG_FLOW'
- AND COLUMN_NAME = 'TRIGGER_CRON';
- -- Step 4:复现原报错 SQL,验证修复成功
- -- 预期结果:查询成功,命中记录数 >= 0(无 -6105 错误)
- SELECT id, trigger_cron FROM airag_flow
- WHERE (status = 'enable' AND (trigger_cron IS NOT NULL AND trigger_cron <> ''));
- -- Step 5:人工验证其他业务查询正常
- -- 5.1 空字符串记录数(修复前后数据应一致)
- SELECT COUNT(*) AS empty_cnt FROM airag_flow WHERE trigger_cron = '';
- -- 5.2 NULL 记录数(修复前后数据应一致)
- SELECT COUNT(*) AS null_cnt FROM airag_flow WHERE trigger_cron IS NULL;
- -- Step 6:触发 AI-FLOW 定时任务初始化校验
- -- 提示:可重启后端服务,观察启动日志中是否还存在
- -- "AI-FLOW 初始化定时触发器任务失败" 错误
- -- 若启动正常无相关异常,则表示修复成功。
|