AI-FLOW触发器兼容达梦数据库修复.sql 3.4 KB

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