Files
baiyue-firstleg/deploy/sql/README.md
T
2026-08-06 11:49:51 +08:00

11 KiB
Raw Blame History

测试环境 SQL 执行说明

唯一数据库发布入口

  • 固定入口:头程数据库统一增量-MySQL8.sql。
  • 该脚本汇总一期、二期当前全部数据库基线、存量升级、IAM 权限资源和最终结构校验,适用于 MySQL 8.0。
  • 后续数据库变更只允许在该文件末尾增加带日期和业务说明的幂等增量区块,不再创建新的部署入口 SQL。
  • 模块 src/main/resources/db/ 下的 SQL 用于开发溯源;deploy/sql/ 下已有日期文件全部冻结为历史记录,不再单独部署,也不得与固定入口重复执行。
  • 固定入口不包含 auth/phase1-admin-accounts.sql 和 warehouse/warehouse-seed.sql,不会写入固定密码账号、演示仓库、演示快递公司或演示订单;正式平台公共仓库主数据已内联到固定入口。
  • warehouse/phase2-pallet-location-schema-migration.sql 的有效结构已被当前 phase2-pallet-location-schema.sql 和后续共享溢出位迁移完整覆盖,因此不重复内联,避免每次部署无条件删除并重建同名唯一索引。
  • 脚本会创建 8 个独立数据库:baiyue_auth、baiyue_iam、baiyue_order、baiyue_warehouse、baiyue_firstleg、baiyue_file、baiyue_audit、baiyue_event_bridge。Gateway、Print、Integration Service 无数据库。
  • 完整执行所有增量区块并通过末段真实结构校验后,脚本最末才会返回唯一的 PASS;任一强校验失败会通过 SIGNAL 终止。

后续追加增量必须满足:

  1. 只新增或兼容升级,不清表、不删除业务数据。
  2. 新字段、索引、约束必须先查询 information_schema,允许整份脚本重复执行。
  3. 系统权限或字典配置使用唯一键和 ON DUPLICATE KEY UPDATE 幂等写入。
  4. 每个增量区块末尾增加只读断言,并同步维护统一脚本末尾的总体验证。
  5. MySQL DDL 会隐式提交,执行前仍应在目标环境确认连接和授权;不能把跨库脚本视为可整体回滚事务。

历史一期回归脚本

  • 历史文件:2026-07-31一期回归测试环境增量迁移.sql,仅供追溯,不再作为统一入口。
  • 适用数据库:MySQL 8.0。
  • 执行账号需要对 baiyue_iam、baiyue_warehouse、baiyue_order、baiyue_firstleg 具备建表、改表、建索引、创建临时存储过程和数据写入权限。
  • 脚本不会创建数据库,不会清理或删除业务数据,也不会写入演示租户、演示用户、演示仓库、演示往来单位或快递公司样本。
  • 脚本可重复执行。MySQL 的 DDL 会隐式提交,因此不能把整份跨库脚本视为可整体回滚的事务。
  • 该历史脚本曾内联 IAM 客户档案字段迁移和 platform:customer:view 权限迁移,当前不得再单独执行。

IAM 来源与执行顺序

固定入口中的 IAM 段按以下模块迁移依赖顺序组织,并通过元数据判断或 ON DUPLICATE KEY UPDATE 保持可重复执行:

  1. IAM 基线表必须已存在(iam.sql)。
  2. 权限父菜单和既有客户列表/审核权限基线(phase1-admin-rbac.sql、rbac-role-management-v2.sql)。
  3. phase1-platform-master-data-and-permission-management.sql 中的 platform:customer:view、既有角色继承及管理员授权。
  4. phase1-customer-profile.sql 中的十个 iam_tenant 客户档案字段。
  5. phase1-onboarding.sql 中的 PROFILE_REQUIRED 默认状态、审核结果字段、资质审核备注及成员审计字段。

固定入口同时幂等补齐审核自动开户所需的全局 MERCHANT_OWNER 角色模板、全局商户菜单/按钮权限和角色授权;执行后应使用 iam/src/test/resources/db/verify-phase1-admin-rbac.sql 确认模板存在且权限完整。

测试环境只执行当前固定入口;历史脚本和模块脚本不应在固定入口执行后再次串行执行。

执行方式

在 Navicat、DataGrip 或 MySQL 命令行中以“运行脚本”方式完整执行,确保客户端支持 DELIMITER。不要只选中局部语句执行。

执行结束后必须看到 migration_status = PASS,并确认消息为“一期与二期统一增量执行完成,关键结构与二期权限校验通过”。如果中途出现 SQLSTATE 45000,必须按错误中给出的缺失表、字段或权限处理后重新完整执行。

公共导出中心存量升级

固定入口已包含 File 当前 6 张表,并通过 information_schema 为旧版 file_export_task 幂等补齐 8 个调度、重试和租约字段,不再允许通过 DROP TABLE 重建。执行完成后可额外核验:

SELECT COUNT(*) = 3 AS export_tables_ready
  FROM information_schema.tables
 WHERE table_schema = 'baiyue_file'
   AND table_name IN ('file_export_task', 'file_export_outbox', 'file_export_task_guard');

SELECT COUNT(*) = 1 AS creation_guard_ready
  FROM baiyue_file.file_export_task_guard
 WHERE guard_key = 'GLOBAL_CREATE';

SELECT COUNT(*) = 8 AS scheduler_columns_ready
  FROM information_schema.columns
 WHERE table_schema = 'baiyue_file' AND table_name = 'file_export_task'
   AND column_name IN ('dispatch_version', 'attempt_count', 'max_attempts', 'next_retry_at',
                       'lease_owner', 'lease_until', 'last_heartbeat_at', 'execution_deadline_at');

任一结果不是 1,禁止启动 File Service;只能继续追加兼容性增量修复,不得删除存量导出任务。

二期第三方测量增量

  • 模块脚本:firstleg/src/main/resources/db/phase2-third-party-single-measurement-migration.sql。
  • 历史二期脚本:2026-08-04-二期入库新增表字段-MySQL8一键执行.sql 已冻结,仅供追溯。
  • 当前固定入口 头程数据库统一增量-MySQL8.sql 已内联该增量以及订单船司字段、二期 28 项 IAM 权限和最新仓储资源租户字段。
  • 新增 external_request_hash、inbound_detail_id、external_detail_no 和第三方明细唯一索引,用于一条回传绑定一条订单货物明细及一张文件中心图片。
  • 部署 Firstleg 新版本前必须完整执行固定入口,并确认末尾总体验证为 PASS。

当前主体字段语义核验

  • 业务单租户阶段,业务表中的 tenant_id > 0 是客户 ID 和客户隔离键,不表示上级租户;费用项目和入库费用明细沿用该物理字段名。
  • fl_third_party_call_log.tenant_id = 0 仅表示第三方主体未知或尚未解析的哨兵值,不是平台客户记录或平台操作作用域,绝不能据此授权、查询或写入客户业务数据。上线后可只读统计:
SELECT COUNT(*) AS unresolved_third_party_calls
  FROM baiyue_firstleg.fl_third_party_call_log
 WHERE tenant_id = 0;
  • 平台公共仓库、地址、服务能力、往来单位 wh_partner、快递公司、托盘、库位、预占和占用固定归平台作用域 tenant_id=0;Firstleg 的 warehouse_resource_tenant_id 同步固定为 0。
  • 客户订单、客户文件和客户费用规则仍使用 tenant_id>0 做客户隔离;往来单位不是客户私有数据,统一脚本会把 wh_partner 和 wh_partner_type 的作用域归零。

平台公共资源归零迁移与核验

测试环境仍只执行固定入口 头程数据库统一增量-MySQL8.sql,不要再串行执行模块脚本。执行前可只读盘点公共资源旧归属:

SELECT 'wh_warehouse' AS resource, COUNT(*) AS total, COALESCE(SUM(tenant_id <> 0), 0) AS non_platform
  FROM baiyue_warehouse.wh_warehouse
UNION ALL SELECT 'wh_warehouse_address', COUNT(*), COALESCE(SUM(tenant_id <> 0), 0) FROM baiyue_warehouse.wh_warehouse_address
UNION ALL SELECT 'wh_service_capability', COUNT(*), COALESCE(SUM(tenant_id <> 0), 0) FROM baiyue_warehouse.wh_service_capability
UNION ALL SELECT 'wh_express_company', COUNT(*), COALESCE(SUM(tenant_id <> 0), 0) FROM baiyue_warehouse.wh_express_company
UNION ALL SELECT 'wh_pallet', COUNT(*), COALESCE(SUM(tenant_id <> 0), 0) FROM baiyue_warehouse.wh_pallet
UNION ALL SELECT 'wh_location', COUNT(*), COALESCE(SUM(tenant_id <> 0), 0) FROM baiyue_warehouse.wh_location
UNION ALL SELECT 'wh_location_reservation', COUNT(*), COALESCE(SUM(tenant_id <> 0), 0) FROM baiyue_warehouse.wh_location_reservation
UNION ALL SELECT 'wh_location_occupancy', COUNT(*), COALESCE(SUM(tenant_id <> 0), 0) FROM baiyue_warehouse.wh_location_occupancy
UNION ALL SELECT 'fl_inbound_pallet_allocation.resource_scope', COUNT(*),
                 COALESCE(SUM(warehouse_resource_tenant_id <> 0), 0)
  FROM baiyue_firstleg.fl_inbound_pallet_allocation;

脚本会先把明确公共资源迁到 0,按父仓库回填地址和能力,再迁移平台往来单位、托盘、库位、预占、占用及 Firstleg 资源归属快照。末尾 PASS 前会强校验公共资源(含往来单位)全部归零、父子一致,以及客户费用规则不存在 tenant_id=0。执行后可再只读核验:

SELECT
  (SELECT COUNT(*) FROM baiyue_warehouse.wh_warehouse WHERE tenant_id <> 0)
  + (SELECT COUNT(*) FROM baiyue_warehouse.wh_warehouse_address WHERE tenant_id <> 0)
  + (SELECT COUNT(*) FROM baiyue_warehouse.wh_service_capability WHERE tenant_id <> 0)
  + (SELECT COUNT(*) FROM baiyue_warehouse.wh_partner
      WHERE tenant_id <> 0 OR data_scope_id <> 0)
  + (SELECT COUNT(*) FROM baiyue_warehouse.wh_partner_type
      WHERE tenant_id <> 0 OR data_scope_id <> 0)
  + (SELECT COUNT(*) FROM baiyue_warehouse.wh_express_company WHERE tenant_id <> 0)
  + (SELECT COUNT(*) FROM baiyue_warehouse.wh_pallet WHERE tenant_id <> 0)
  + (SELECT COUNT(*) FROM baiyue_warehouse.wh_location WHERE tenant_id <> 0)
  + (SELECT COUNT(*) FROM baiyue_warehouse.wh_location_reservation WHERE tenant_id <> 0)
  + (SELECT COUNT(*) FROM baiyue_warehouse.wh_location_occupancy WHERE tenant_id <> 0)
  + (SELECT COUNT(*) FROM baiyue_firstleg.fl_inbound_pallet_allocation
      WHERE warehouse_resource_tenant_id <> 0) AS public_scope_violations,
  (SELECT COUNT(*) FROM baiyue_warehouse.wh_overseas_storage_fee_rule WHERE tenant_id = 0)
    AS customer_scope_violations;

SELECT
  (SELECT COUNT(*) FROM baiyue_warehouse.wh_warehouse_address a
    JOIN baiyue_warehouse.wh_warehouse w ON w.id = a.warehouse_id
   WHERE a.tenant_id <> w.tenant_id)
  + (SELECT COUNT(*) FROM baiyue_warehouse.wh_service_capability c
      JOIN baiyue_warehouse.wh_warehouse w ON w.id = c.warehouse_id
     WHERE c.tenant_id <> w.tenant_id)
  + (SELECT COUNT(*) FROM baiyue_warehouse.wh_pallet p
      JOIN baiyue_warehouse.wh_warehouse w ON w.id = p.warehouse_id
     WHERE p.tenant_id <> w.tenant_id)
  + (SELECT COUNT(*) FROM baiyue_warehouse.wh_location l
      JOIN baiyue_warehouse.wh_warehouse w ON w.id = l.warehouse_id
     WHERE l.tenant_id <> w.tenant_id) AS parent_child_scope_mismatches;

上述三个结果 public_scope_violations、customer_scope_violations、parent_child_scope_mismatches 必须都为 0。

海外仓阶梯费用增量

  • 2026-08-05 增量已追加到固定入口末尾,不创建新的日期部署脚本。
  • Warehouse 新增 wh_overseas_storage_fee_rule 和 wh_overseas_storage_fee_tier,包含客户唯一索引、分页索引、阶梯起始天唯一索引和规则明细查询索引。
  • IAM 新增 platform:overseas-storage-fee:list/create/edit/delete 四项权限,默认授予平台系统管理员。
  • Warehouse Service 启动前必须先执行固定入口;末尾只有两张表、五个索引和四项权限均存在才返回 PASS。