-- ============================================================ -- 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 初始化定时触发器任务失败" 错误 -- 若启动正常无相关异常,则表示修复成功。