# 修 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 个页面(命中日志/黑白名单/人工复审/头像/用户风险),全部应能正常显示空列表(无业务数据期间) - 后端无前端改动需求