TENANT_MIGRATION_MANUAL.md 7.1 KB

租户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张)

  1. WorkOrdMaster - 工单主数据
  2. WorkOrdDetail - 工单物料明细
  3. WorkOrdRouting - 工单工序表
  4. mes_morder - 工单信息表(已有 tenant_id)
  5. mes_moentry - 工单附属表

Production 模块(7张)

  1. ScheduleExceptionMaster - 排产异常日志
  2. PeriodSequenceDet - 工序间衔接
  3. ScheduleResultOpMaster - 排产结果
  4. ShopCalendarWorkCtr - 产线工作日历表
  5. QualityLineWorkDetail - 产线休息时间表
  6. HolidayMaster - 产线节假日表
  7. ResourceOccupancyTime - 产线加班表

🚀 执行方法

方法1:使用 MySQL 客户端(推荐)

步骤1:打开 MySQL 客户端

mysql -u root -p

步骤2:输入密码后,执行迁移脚本

USE aidopdev;
source d:/DEMONET/tools/sql/add_all_tenant_id_fields.sql

或者使用完整路径:

\. d:/DEMONET/tools/sql/add_all_tenant_id_fields.sql

方法2:命令行一次性执行

# 将以下命令中的 YOUR_PASSWORD 替换为实际的数据库密码
mysql -u root -pYOUR_PASSWORD aidopdev < d:\DEMONET\tools\sql\add_all_tenant_id_fields.sql

方法3:使用 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 客户端或管理工具中执行:

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. 检查索引是否创建成功

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. 快速检查单个表

-- 检查 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:

-- 假设默认租户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(统一小写下划线格式)