# 租户ID字段迁移执行手册 ## 📌 重要提示 数据库迁移脚本尚未执行,需要手动执行 SQL 脚本来为所有业务表添加 `tenant_id` 字段。 ## 🎯 迁移范围 ### 涉及的表(24张) #### Order 模块(12张) 1. ado_contract_review - 合同评审主表 2. ado_contract_review_flow - 合同评审流程节点表 3. LinkagePlan - 计划联动看板 4. ProductDesign - 产品设计主表 5. ProductDesignBom - 产品设计BOM表 6. ProductDesignRouting - 产品设计工艺表 7. crm_seorder - 销售订单表(已有 tenant_id) 8. crm_seorderentry - 销售订单明细表 9. ShippingPlan - 发货计划主表 10. ShippingPlanDetail - 发货计划明细表 11. AsnShipperMaster - ASN发货单主表 12. AsnShipperDetail - ASN发货单明细表 #### WorkOrder 模块(5张) 13. WorkOrdMaster - 工单主数据 14. WorkOrdDetail - 工单物料明细 15. WorkOrdRouting - 工单工序表 16. mes_morder - 工单信息表(已有 tenant_id) 17. mes_moentry - 工单附属表 #### Production 模块(7张) 18. ScheduleExceptionMaster - 排产异常日志 19. PeriodSequenceDet - 工序间衔接 20. ScheduleResultOpMaster - 排产结果 21. ShopCalendarWorkCtr - 产线工作日历表 22. QualityLineWorkDetail - 产线休息时间表 23. HolidayMaster - 产线节假日表 24. ResourceOccupancyTime - 产线加班表 ## 🚀 执行方法 ### 方法1:使用 MySQL 客户端(推荐) #### 步骤1:打开 MySQL 客户端 ```bash mysql -u root -p ``` #### 步骤2:输入密码后,执行迁移脚本 ```sql USE aidopdev; source d:/DEMONET/tools/sql/add_all_tenant_id_fields.sql ``` 或者使用完整路径: ```sql \. d:/DEMONET/tools/sql/add_all_tenant_id_fields.sql ``` ### 方法2:命令行一次性执行 ```bash # 将以下命令中的 YOUR_PASSWORD 替换为实际的数据库密码 mysql -u root -pYOUR_PASSWORD aidopdev < d:\DEMONET\tools\sql\add_all_tenant_id_fields.sql ``` ### 方法3:使用 PowerShell ```powershell # 将以下命令中的 YOUR_PASSWORD 替换为实际的数据库密码 Get-Content "d:\DEMONET\tools\sql\add_all_tenant_id_fields.sql" | mysql --host=localhost --user=root --password=YOUR_PASSWORD --database=aidopdev ``` ### 方法4:使用数据库管理工具(最简单) 如果您使用 Navicat、HeidiSQL、DBeaver 等工具: 1. 打开 `d:\DEMONET\tools\sql\add_all_tenant_id_fields.sql` 文件 2. 连接到 `aidopdev` 数据库 3. 复制全部内容到 SQL 查询窗口 4. 点击"执行"或"运行"按钮 ## ✅ 验证结果 ### 1. 检查字段是否添加成功 在 MySQL 客户端或管理工具中执行: ```sql SELECT TABLE_NAME AS 表名, COLUMN_NAME AS 字段名 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = 'aidopdev' AND COLUMN_NAME = 'tenant_id' ORDER BY TABLE_NAME; ``` **预期结果:** 应该显示 24 行记录 ### 2. 检查索引是否创建成功 ```sql SELECT TABLE_NAME AS 表名, INDEX_NAME AS 索引名 FROM INFORMATION_SCHEMA.STATISTICS WHERE TABLE_SCHEMA = 'aidopdev' AND COLUMN_NAME = 'tenant_id' AND INDEX_NAME = 'idx_tenant_id' ORDER BY TABLE_NAME; ``` **预期结果:** 应该显示 24 行记录 ### 3. 快速检查单个表 ```sql -- 检查 WorkOrdMaster 表 DESCRIBE WorkOrdMaster; -- 或者 SHOW COLUMNS FROM WorkOrdMaster LIKE 'tenant_id'; ``` ## 📊 执行后的状态 执行成功后,您应该看到: - ✅ 24 张业务表都有 `tenant_id` 字段 - ✅ 字段类型:`BIGINT NULL` - ✅ 字段注释:`租户ID(多租户隔离)` - ✅ 每张表都有 `idx_tenant_id` 索引 ## ⚠️ 常见问题 ### 问题1:表不存在 ``` ERROR 1146: Table 'aidopdev.WorkOrdMaster' doesn't exist ``` **原因:** 某些表可能还没有创建 **解决方案:** - 如果表确实不存在,SQL 中的 `IF NOT EXISTS` 会自动跳过 - 或者先创建缺失的表 ### 问题2:字段已存在 ``` ERROR 1060: Duplicate column name 'tenant_id' ``` **原因:** 该表已经有 tenant_id 字段了 **解决方案:** 这是正常的,SQL 中使用了 `IF NOT EXISTS`,会自动跳过已存在的字段 ### 问题3:权限不足 ``` ERROR 1142: ALTER command denied ``` **原因:** 当前用户没有 ALTER TABLE 权限 **解决方案:** 使用具有管理员权限的用户(如 root)执行 ### 问题4:密码错误 ``` ERROR 1045: Access denied for user 'root'@'localhost' ``` **原因:** 数据库密码不正确 **解决方案:** 确认正确的数据库密码后重新执行 ## 🔄 为现有数据设置租户ID 如果数据库中已有业务数据,执行迁移后,需要为现有记录设置租户ID: ```sql -- 假设默认租户ID为 1,根据实际情况调整 USE aidopdev; -- Order 模块 UPDATE ado_contract_review SET tenant_id = 1 WHERE tenant_id IS NULL; UPDATE ado_contract_review_flow SET tenant_id = 1 WHERE tenant_id IS NULL; UPDATE LinkagePlan SET tenant_id = 1 WHERE tenant_id IS NULL; UPDATE ProductDesign SET tenant_id = 1 WHERE tenant_id IS NULL; UPDATE ProductDesignBom SET tenant_id = 1 WHERE tenant_id IS NULL; UPDATE ProductDesignRouting SET tenant_id = 1 WHERE tenant_id IS NULL; UPDATE crm_seorder SET tenant_id = 1 WHERE tenant_id IS NULL; UPDATE crm_seorderentry SET tenant_id = 1 WHERE tenant_id IS NULL; UPDATE ShippingPlan SET tenant_id = 1 WHERE tenant_id IS NULL; UPDATE ShippingPlanDetail SET tenant_id = 1 WHERE tenant_id IS NULL; UPDATE AsnShipperMaster SET tenant_id = 1 WHERE tenant_id IS NULL; UPDATE AsnShipperDetail SET tenant_id = 1 WHERE tenant_id IS NULL; -- WorkOrder 模块 UPDATE WorkOrdMaster SET tenant_id = 1 WHERE tenant_id IS NULL; UPDATE WorkOrdDetail SET tenant_id = 1 WHERE tenant_id IS NULL; UPDATE WorkOrdRouting SET tenant_id = 1 WHERE tenant_id IS NULL; UPDATE mes_morder SET tenant_id = 1 WHERE tenant_id IS NULL; UPDATE mes_moentry SET tenant_id = 1 WHERE tenant_id IS NULL; -- Production 模块 UPDATE ScheduleExceptionMaster SET tenant_id = 1 WHERE tenant_id IS NULL; UPDATE PeriodSequenceDet SET tenant_id = 1 WHERE tenant_id IS NULL; UPDATE ScheduleResultOpMaster SET tenant_id = 1 WHERE tenant_id IS NULL; UPDATE ShopCalendarWorkCtr SET tenant_id = 1 WHERE tenant_id IS NULL; UPDATE QualityLineWorkDetail SET tenant_id = 1 WHERE tenant_id IS NULL; UPDATE HolidayMaster SET tenant_id = 1 WHERE tenant_id IS NULL; UPDATE ResourceOccupancyTime SET tenant_id = 1 WHERE tenant_id IS NULL; ``` ## 📁 相关文件 1. **💾 完整迁移脚本** `d:\DEMONET\tools\sql\add_all_tenant_id_fields.sql` 包含所有表的 tenant_id 字段添加、索引创建和验证查询 2. **📖 租户改造报告** `d:\DEMONET\tools\TENANT_MIGRATION_REPORT.md` 详细的多租户改造记录 3. **📋 新实体创建报告** `d:\DEMONET\tools\NEW_ENTITIES_CREATION_REPORT.md` 新增的 10 个实体类详细信息 ## 🎯 完成标志 执行完成后,应该看到终端输出: ``` ✅ 所有业务表 tenant_id 字段添加完成! 共添加 24 张表的 tenant_id 字段 ``` 然后您就可以: - ✅ 使用多租户隔离功能 - ✅ 运行包含租户过滤的 Service - ✅ 前后端联调测试 --- 生成时间:2026-04-22 迁移表数:24张 字段名:tenant_id(统一小写下划线格式)