Files
cattleTransportation/tradeCattle/TRIGGER_FIX_GUIDE.md
2025-10-29 17:33:32 +08:00

233 lines
5.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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
**状态**: ✅ 问题已确认,解决方案已就绪