233 lines
5.8 KiB
Markdown
233 lines
5.8 KiB
Markdown
|
|
# Delivery 触发器修复指南
|
|||
|
|
|
|||
|
|
## 🎯 问题确认
|
|||
|
|
|
|||
|
|
通过数据库诊断,确认了问题的根源:
|
|||
|
|
|
|||
|
|
### 诊断结果
|
|||
|
|
1. ✅ `member_driver` 表中 **car_number 字段不存在**(已被删除)
|
|||
|
|
2. ✅ `member_driver` 表 **没有触发器**
|
|||
|
|
3. ❌ **delivery 表有 2 个触发器引用了已删除的 car_number 字段**
|
|||
|
|
|
|||
|
|
### 触发器信息
|
|||
|
|
```
|
|||
|
|
触发器名称: trg_delivery_fill_from_driver
|
|||
|
|
关联表: delivery
|
|||
|
|
触发事件: INSERT, UPDATE
|
|||
|
|
创建时间: 2025-10-14 15:36:26 和 15:37:58
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 🔍 问题分析
|
|||
|
|
|
|||
|
|
### 为什么会报错?
|
|||
|
|
|
|||
|
|
当执行 `DeliveryMapper.insert` 时:
|
|||
|
|
1. MyBatis 执行 INSERT SQL 插入 delivery 表
|
|||
|
|
2. **数据库触发器自动触发**
|
|||
|
|
3. 触发器尝试查询 `member_driver.car_number` 字段
|
|||
|
|
4. 由于字段已被删除,报错:`Unknown column 'md.car_number' in 'field list'`
|
|||
|
|
|
|||
|
|
### 触发器的原始用途
|
|||
|
|
|
|||
|
|
这些触发器的设计初衷是:
|
|||
|
|
- 当插入或更新 delivery 记录时
|
|||
|
|
- 自动从 member_driver 表获取司机的车辆信息(包括 car_number)
|
|||
|
|
- 自动填充到 delivery 表
|
|||
|
|
|
|||
|
|
### 为什么现在不需要触发器?
|
|||
|
|
|
|||
|
|
因为架构已改变:
|
|||
|
|
- **旧架构**: 司机和车辆绑定在 member_driver 表(一对一)
|
|||
|
|
- **新架构**: 司机和车辆分离,车辆由 vehicle 表独立管理(多对多)
|
|||
|
|
- **新实现**: 在 `DeliveryServiceImpl.createDelivery()` 中手动查询 vehicle 表获取车辆信息
|
|||
|
|
|
|||
|
|
## 🔧 解决方案
|
|||
|
|
|
|||
|
|
### 方案 1: 删除触发器(推荐)✅
|
|||
|
|
|
|||
|
|
**优点**:
|
|||
|
|
- 彻底解决问题
|
|||
|
|
- 与新架构一致
|
|||
|
|
- 代码已经实现了相同功能
|
|||
|
|
|
|||
|
|
**缺点**:
|
|||
|
|
- 需要确保业务逻辑在代码层面完整
|
|||
|
|
|
|||
|
|
### 方案 2: 修改触发器(不推荐)
|
|||
|
|
|
|||
|
|
修改触发器以适应新表结构,但这会增加维护复杂度。
|
|||
|
|
|
|||
|
|
## 📋 执行步骤
|
|||
|
|
|
|||
|
|
### 步骤 1: 查看触发器完整定义(可选)
|
|||
|
|
|
|||
|
|
如果你想查看触发器的完整 SQL 定义:
|
|||
|
|
|
|||
|
|
```sql
|
|||
|
|
SHOW CREATE TRIGGER trg_delivery_fill_from_driver;
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**建议**: 复制输出并保存,以防将来需要参考。
|
|||
|
|
|
|||
|
|
### 步骤 2: 删除触发器
|
|||
|
|
|
|||
|
|
连接到数据库:
|
|||
|
|
```bash
|
|||
|
|
mysql -h 129.211.213.226 -P 3306 -u root -pAiotagro@741 cattletrade
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
执行删除:
|
|||
|
|
```sql
|
|||
|
|
USE cattletrade;
|
|||
|
|
|
|||
|
|
-- 删除触发器
|
|||
|
|
DROP TRIGGER IF EXISTS trg_delivery_fill_from_driver;
|
|||
|
|
|
|||
|
|
-- 验证删除
|
|||
|
|
SHOW TRIGGERS WHERE `Table` = 'delivery';
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
或者直接执行脚本:
|
|||
|
|
```bash
|
|||
|
|
mysql -h 129.211.213.226 -P 3306 -u root -pAiotagro@741 cattletrade < C:/cattleTransport/tradeCattle/fix_delivery_triggers.sql
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 步骤 3: 验证没有其他触发器引用 car_number
|
|||
|
|
|
|||
|
|
```sql
|
|||
|
|
SELECT
|
|||
|
|
TRIGGER_NAME,
|
|||
|
|
EVENT_MANIPULATION,
|
|||
|
|
EVENT_OBJECT_TABLE
|
|||
|
|
FROM INFORMATION_SCHEMA.TRIGGERS
|
|||
|
|
WHERE TRIGGER_SCHEMA = 'cattletrade'
|
|||
|
|
AND ACTION_STATEMENT LIKE '%car_number%';
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
应该返回 **0 行**。
|
|||
|
|
|
|||
|
|
### 步骤 4: 重启后端服务
|
|||
|
|
|
|||
|
|
```powershell
|
|||
|
|
# 1. 停止当前服务(在服务运行的终端按 Ctrl+C)
|
|||
|
|
|
|||
|
|
# 2. 清理编译缓存
|
|||
|
|
cd C:\cattleTransport\tradeCattle
|
|||
|
|
Remove-Item -Recurse -Force target -ErrorAction SilentlyContinue
|
|||
|
|
|
|||
|
|
# 3. 重新启动服务
|
|||
|
|
cd aiotagro-cattle-trade
|
|||
|
|
mvn spring-boot:run
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 步骤 5: 测试功能
|
|||
|
|
|
|||
|
|
1. 打开前端页面
|
|||
|
|
2. 尝试创建新的运送清单
|
|||
|
|
3. 填写表单并提交
|
|||
|
|
4. **预期结果**: 成功创建,不再报 `Unknown column 'md.car_number'` 错误
|
|||
|
|
|
|||
|
|
## ✅ 验证清单
|
|||
|
|
|
|||
|
|
完成后,确认以下几点:
|
|||
|
|
|
|||
|
|
- [ ] 数据库中 `member_driver` 表没有 `car_number` 字段
|
|||
|
|
- [ ] 数据库中 `delivery` 表没有触发器引用 `car_number`
|
|||
|
|
- [ ] 后端服务已重启
|
|||
|
|
- [ ] 创建运送清单功能正常
|
|||
|
|
- [ ] 车辆信息从 `vehicle` 表正确获取
|
|||
|
|
- [ ] 司机信息从 `member_driver` 表正确获取
|
|||
|
|
|
|||
|
|
## 🎯 预期效果
|
|||
|
|
|
|||
|
|
### 修复前
|
|||
|
|
```
|
|||
|
|
错误: Unknown column 'md.car_number' in 'field list'
|
|||
|
|
原因: delivery 表触发器查询已删除的字段
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 修复后
|
|||
|
|
```
|
|||
|
|
✅ 运送清单创建成功
|
|||
|
|
✅ 车辆信息从 vehicle 表获取
|
|||
|
|
✅ 司机信息从 member_driver 表获取
|
|||
|
|
✅ 数据正确保存到 delivery 表
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 📊 数据流对比
|
|||
|
|
|
|||
|
|
### 旧流程(有触发器)
|
|||
|
|
```
|
|||
|
|
1. 代码: INSERT INTO delivery
|
|||
|
|
2. 触发器: 自动查询 member_driver.car_number
|
|||
|
|
3. 触发器: 自动填充 delivery.license_plate
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 新流程(无触发器)
|
|||
|
|
```
|
|||
|
|
1. 代码: 根据 plateNumber 查询 vehicle 表
|
|||
|
|
2. 代码: 根据 driverId 查询 member_driver 表
|
|||
|
|
3. 代码: 手动设置 delivery.license_plate
|
|||
|
|
4. 代码: INSERT INTO delivery
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## ⚠️ 注意事项
|
|||
|
|
|
|||
|
|
1. **生产环境警告**:
|
|||
|
|
- 这是生产数据库,删除触发器前请确保已备份
|
|||
|
|
- 建议在非高峰时段操作
|
|||
|
|
|
|||
|
|
2. **功能完整性**:
|
|||
|
|
- 代码中已经实现了触发器的功能
|
|||
|
|
- DeliveryServiceImpl.createDelivery() 会手动查询 vehicle 表
|
|||
|
|
|
|||
|
|
3. **回滚方案**:
|
|||
|
|
- 如果删除触发器后发现问题,可以从备份恢复
|
|||
|
|
- 建议先保存 `SHOW CREATE TRIGGER` 的输出
|
|||
|
|
|
|||
|
|
## 🔍 故障排查
|
|||
|
|
|
|||
|
|
### 如果删除触发器后仍然报错
|
|||
|
|
|
|||
|
|
1. **清除所有缓存**
|
|||
|
|
```powershell
|
|||
|
|
Remove-Item -Recurse -Force tradeCattle\target
|
|||
|
|
Remove-Item -Recurse -Force tradeCattle\.idea
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
2. **检查是否有其他引用**
|
|||
|
|
```sql
|
|||
|
|
-- 检查存储过程
|
|||
|
|
SELECT ROUTINE_NAME, ROUTINE_DEFINITION
|
|||
|
|
FROM INFORMATION_SCHEMA.ROUTINES
|
|||
|
|
WHERE ROUTINE_SCHEMA = 'cattletrade'
|
|||
|
|
AND ROUTINE_DEFINITION LIKE '%car_number%';
|
|||
|
|
|
|||
|
|
-- 检查视图
|
|||
|
|
SELECT TABLE_NAME, VIEW_DEFINITION
|
|||
|
|
FROM INFORMATION_SCHEMA.VIEWS
|
|||
|
|
WHERE TABLE_SCHEMA = 'cattletrade'
|
|||
|
|
AND VIEW_DEFINITION LIKE '%car_number%';
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
3. **重启数据库连接**
|
|||
|
|
- 完全停止后端服务
|
|||
|
|
- 等待 30 秒
|
|||
|
|
- 重新启动
|
|||
|
|
|
|||
|
|
## 📞 支持
|
|||
|
|
|
|||
|
|
如果遇到问题,请提供:
|
|||
|
|
1. `SHOW CREATE TRIGGER` 的完整输出
|
|||
|
|
2. 删除触发器后的验证结果
|
|||
|
|
3. 后端服务重启后的日志
|
|||
|
|
4. 创建运送清单时的错误信息(如果还有)
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
**文档版本**: 1.0
|
|||
|
|
**创建日期**: 2025-10-29
|
|||
|
|
**最后更新**: 2025-10-29
|
|||
|
|
**状态**: ✅ 问题已确认,解决方案已就绪
|
|||
|
|
|