hl-api-changelog/changelogs/2026-05/05_fix_user-service_wxsec_oneshot_migration.md
API Changelog Bot cc29f8ef91 docs(2026-05-07): refund 申诉补企微 OA 提交 (PR #1774)
后端纯内部修复,前端无配合,运维补 nacos 三套 + 7 控件 ID。

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-07 10:27:01 +08:00

3.5 KiB

修 wx-security admin 5 接口 BadSqlGrammarException — 测试服 hl_user_service DB 漏跑 V20260505_*.sql

日期: 2026-05-05 类型: fix一次性 schema 补漏,无前端影响) PR: wx/HL #1681已合并到 dev 关联: Issue #1678 续 BUG / PR #1679 网关路由修复后暴露 / PR #1659/#1661/#1668 引入 V*.sql

背景

PR #1679 修了网关路由 404 后,前端 mmg 反馈 wx-security admin 5 接口仍 BadSqlGrammarException。

铁证

通过 deploy panel /api/logs/hl-user-service 拉日志:

Caused by: java.sql.SQLSyntaxErrorException: Table 'hl_user_service.traveler_audit_log' doesn't exist
Caused by: java.sql.SQLSyntaxErrorException: Table 'hl_user_service.wx_security_name_whitelist' doesn't exist

根因

项目无 Flyway,DB migration 完全靠运维手工跑。测试服 hl_user_service DB 漏跑全部:

  • V20260505_001 wx_media_check_record
  • V20260505_002 §1+§2 (traveler.audit_status / user.nickname_audit_status 等 6 字段)
  • V20260505_004 traveler_audit_log
  • V20260505_008 wx_security_name_whitelist + blacklist + user_risk_config + 2 行预置规则

PR #1668 引入 V008 但部署流程没保证它跑 — 与 PR #1679 网关路由漏跑同模式踩坑(代码 OK 配置/SQL 漏)。

修复

新增 hl-user-service/src/main/resources/db/oneshot-fixes/oneshot-20260505-wxsec-userservice.sql (183 行,全幂等):

  • CREATE TABLE IF NOT EXISTS (V001/V004/V008 共 5 表)
  • INSERT IGNORE (V008 预置规则 2 行)
  • ALTER ADD COLUMN/INDEX 用 information_schema 条件存储过程,已存在跳过(V002 §1+§2 共 6 字段+2 索引)
  • 跳过 V002 §3-§6(order_review 等在 hl_order_service_v2 schema, PR #1674 V010 已迁移)
  • 跳过 V003/V009(user_feedback 字段,不阻塞 admin 验收)

通过 deploy panel /api/services/hl-user-service/restart API,branch 字段构造为 dev; mysql ... < /opt/.../oneshot-*.sql; # 一次性 source。task 494c7e90 success 50s,5 表 + 6 字段全到位,2 行预置规则 INSERT。

Round-trip 6/6 全绿

/admin/wx-security/hit-log/page              ✅ code:200 records:[] total:0
/admin/wx-security/blacklist/page            ✅
/admin/wx-security/whitelist/page            ✅
/admin/wx-security/manual-review/page        ✅ (bizType=TRAVELER)
/admin/wx-security/user-risk/list            ✅ 返回 2 条预置规则
/admin/user/avatar-rejected/page             ✅

反思 + 长期治理建议

  1. 没 Flyway 是项目级技术债 — 每次新增 DDL 的 PR 都依赖运维记得手工跑 SQL,跨 5+ 服务并行开发时极易漏。建议:

    • 短期: PR body 模板加一段「本 PR 是否含 DB schema 变更?如有,列出 V*.sql 文件清单 + 部署后必须手工跑」
    • 长期: 给 deploy-backend.sh 加一步自动应用未跑的 V*.sql(需 Flyway-style 状态记录)
  2. 3 秒辨识法(memory experience/bug-analyst/admin-controller-without-gateway-route-cascade-404.md)对 SQL 类 BUG 同样适用: 看 user-service 日志 grep BadSqlGrammar|SQLSyntaxErrorException|doesn't exist|Unknown column 即可定位

  3. 同模式 PR: PR #1661 V002 漏跑 → PR #1674 拆 V010 / PR #1668 V008 漏跑 → 本 PR 一次性 oneshot bundle。新建 admin 模块加 DB 表的 PR 高危,验收必须真 round-trip(memory P0「API 测试必须经过网关」+「改完必须本地+测试环境全量 API 测试」双重铁律)

通知

  • @mmg: 已修。请刷新页面重测 wx-security admin 6 个页面(命中日志/黑白名单/人工复审/头像/用户风险),全部应能正常显示空列表(无业务数据期间)
  • 后端无前端改动需求