1.0.312.sql 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. -- 1.0.312.sql S0/S6 租户隔离收口:BarCodeNbr / wms_rwzp 租户化 DDL(幂等 + information_schema 守卫 + 冲突前置)。
  2. -- 本批同时收口 S6 IPQC Flow/Disposition 服务的严格租户解析(纯代码,无 DDL)。
  3. -- 两表阶段 2 运行时双租户验收已 PASS:无 Token 拒绝 / 超管未选拒绝 / 跨租户 CRUD/状态阻断 / 租户内唯一。
  4. -- 两表均 0 行 → ADD tenant_id BIGINT NOT NULL(无 DEFAULT)+ 租户内业务唯一索引;不插/改/删任何业务数据、不触碰其它表。
  5. -- 幂等:可重复执行;ADD COLUMN / ADD INDEX 均以 information_schema 守卫;冲突则跳过、绝不自动清理数据。
  6. -- ============================================================================
  7. -- ############################################################################
  8. -- # SECTION 1 — BarCodeNbr 条码规则主数据 租户化
  9. -- # 租户内唯一:uk_BarCodeNbr_tenant_domain_customer_type (tenant_id, Domain, Customer, Type)
  10. -- ############################################################################
  11. -- 一、补 tenant_id 列(不存在才加;空表故 NOT NULL 无默认值安全,最终态无 DEFAULT)
  12. SET @has_col := (SELECT COUNT(*) FROM information_schema.COLUMNS
  13. WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'BarCodeNbr' AND COLUMN_NAME = 'tenant_id');
  14. SET @sql := IF(@has_col = 0,
  15. 'ALTER TABLE BarCodeNbr ADD COLUMN tenant_id BIGINT NOT NULL COMMENT ''租户 ID''',
  16. 'DO 0');
  17. PREPARE s FROM @sql; EXECUTE s; DEALLOCATE PREPARE s;
  18. -- 兜底:若某些服务器在 ADD NOT NULL 时隐式落了 DEFAULT,立即剥离,保证最终态无默认值。
  19. SET @has_default := (SELECT COUNT(*) FROM information_schema.COLUMNS
  20. WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'BarCodeNbr' AND COLUMN_NAME = 'tenant_id'
  21. AND COLUMN_DEFAULT IS NOT NULL);
  22. SET @sql := IF(@has_default > 0, 'ALTER TABLE BarCodeNbr ALTER COLUMN tenant_id DROP DEFAULT', 'DO 0');
  23. PREPARE s FROM @sql; EXECUTE s; DEALLOCATE PREPARE s;
  24. -- 二、冲突前置检测(同租户内 (Domain,Customer,Type) 重复则跳过建索引,绝不自动清理数据)
  25. SET @dup := (SELECT COUNT(*) FROM (
  26. SELECT tenant_id, `Domain`, `Customer`, `Type`
  27. FROM BarCodeNbr
  28. GROUP BY tenant_id, `Domain`, `Customer`, `Type`
  29. HAVING COUNT(*) > 1) t);
  30. SELECT @dup AS barcodenbr_intratenant_dup; -- 期望 0(空表);若非 0,下方 ADD 被守卫跳过
  31. -- 三、创建租户内唯一索引(不存在且无同租户冲突才建)
  32. SET @has_uk := (SELECT COUNT(DISTINCT INDEX_NAME) FROM information_schema.STATISTICS
  33. WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'BarCodeNbr'
  34. AND INDEX_NAME = 'uk_BarCodeNbr_tenant_domain_customer_type');
  35. SET @sql := IF(@has_uk = 0 AND @dup = 0,
  36. 'ALTER TABLE BarCodeNbr ADD UNIQUE INDEX uk_BarCodeNbr_tenant_domain_customer_type (tenant_id, `Domain`, `Customer`, `Type`)',
  37. 'DO 0');
  38. PREPARE s FROM @sql; EXECUTE s; DEALLOCATE PREPARE s;
  39. -- 四、执行后验证
  40. SELECT COLUMN_NAME, COLUMN_TYPE, IS_NULLABLE, COLUMN_DEFAULT
  41. FROM information_schema.COLUMNS
  42. WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'BarCodeNbr' AND COLUMN_NAME = 'tenant_id';
  43. -- 期望:tenant_id bigint / IS_NULLABLE=NO / COLUMN_DEFAULT=NULL(无默认值)。
  44. SELECT INDEX_NAME, NON_UNIQUE, SEQ_IN_INDEX, COLUMN_NAME
  45. FROM information_schema.STATISTICS
  46. WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'BarCodeNbr' AND INDEX_NAME <> 'PRIMARY'
  47. ORDER BY INDEX_NAME, SEQ_IN_INDEX;
  48. -- 期望:含 uk_BarCodeNbr_tenant_domain_customer_type (tenant_id, Domain, Customer, Type)(唯一)。
  49. -- ############################################################################
  50. -- # SECTION 2 — wms_rwzp 物料状态任务指派 租户化
  51. -- # 业务唯一口径(wms_rwzp 无单一任务号列,取"同租户+同工厂域下同物料任务的移动指派"复合键):
  52. -- # uk_wms_rwzp_tenant_org_task (tenant_id, company_ref_id, factory_ref_id, domain_code, rwlx, wlbm, rqpc, yskw, mdkw)
  53. -- ############################################################################
  54. -- 一、补 tenant_id 列(不存在才加;0 行表 → NOT NULL 无 DEFAULT 安全)
  55. SET @has_col := (SELECT COUNT(*) FROM information_schema.COLUMNS
  56. WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'wms_rwzp' AND COLUMN_NAME = 'tenant_id');
  57. SET @sql := IF(@has_col = 0,
  58. 'ALTER TABLE wms_rwzp ADD COLUMN tenant_id BIGINT NOT NULL AFTER rec_id',
  59. 'DO 0');
  60. PREPARE s FROM @sql; EXECUTE s; DEALLOCATE PREPARE s;
  61. -- 若历史执行遗留了 DEFAULT(本脚本本身不加 DEFAULT,此步为防御性收口,确保最终态无默认值):
  62. SET @has_default := (SELECT COUNT(*) FROM information_schema.COLUMNS
  63. WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'wms_rwzp' AND COLUMN_NAME = 'tenant_id'
  64. AND COLUMN_DEFAULT IS NOT NULL);
  65. SET @sql := IF(@has_default > 0, 'ALTER TABLE wms_rwzp ALTER COLUMN tenant_id DROP DEFAULT', 'DO 0');
  66. PREPARE s FROM @sql; EXECUTE s; DEALLOCATE PREPARE s;
  67. -- 二、冲突前置检测(同租户+业务键重复则跳过创建,绝不自动清理历史数据)
  68. SET @dup := (SELECT COUNT(*) FROM (
  69. SELECT tenant_id, company_ref_id, factory_ref_id, domain_code, rwlx, wlbm, rqpc, yskw, mdkw
  70. FROM wms_rwzp
  71. GROUP BY tenant_id, company_ref_id, factory_ref_id, domain_code, rwlx, wlbm, rqpc, yskw, mdkw
  72. HAVING COUNT(*) > 1) t);
  73. SELECT @dup AS wms_rwzp_intratenant_dup; -- 期望 0(0 行表必为 0);若非 0,下方 ADD 被守卫跳过
  74. -- 三、创建租户内业务唯一索引(不存在且无同键冲突才建)
  75. SET @has_uk := (SELECT COUNT(DISTINCT INDEX_NAME) FROM information_schema.STATISTICS
  76. WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'wms_rwzp'
  77. AND INDEX_NAME = 'uk_wms_rwzp_tenant_org_task');
  78. SET @sql := IF(@has_uk = 0 AND @dup = 0,
  79. 'ALTER TABLE wms_rwzp ADD UNIQUE INDEX uk_wms_rwzp_tenant_org_task (tenant_id, company_ref_id, factory_ref_id, domain_code, rwlx, wlbm, rqpc, yskw, mdkw)',
  80. 'DO 0');
  81. PREPARE s FROM @sql; EXECUTE s; DEALLOCATE PREPARE s;
  82. -- 四、执行后验证
  83. SELECT COLUMN_NAME, IS_NULLABLE, COLUMN_DEFAULT, DATA_TYPE
  84. FROM information_schema.COLUMNS
  85. WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'wms_rwzp' AND COLUMN_NAME = 'tenant_id';
  86. -- 期望:tenant_id / IS_NULLABLE=NO / COLUMN_DEFAULT=NULL / DATA_TYPE=bigint。
  87. SELECT INDEX_NAME, NON_UNIQUE, SEQ_IN_INDEX, COLUMN_NAME
  88. FROM information_schema.STATISTICS
  89. WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'wms_rwzp' AND INDEX_NAME <> 'PRIMARY'
  90. ORDER BY INDEX_NAME, SEQ_IN_INDEX;
  91. -- 期望:uk_wms_rwzp_tenant_org_task (tenant_id, company_ref_id, factory_ref_id, domain_code, rwlx, wlbm, rqpc, yskw, mdkw)(NON_UNIQUE=0)。
  92. -- ============================================================================
  93. -- 回滚 SQL(空表期可安全执行):
  94. -- ALTER TABLE BarCodeNbr DROP INDEX uk_BarCodeNbr_tenant_domain_customer_type;
  95. -- ALTER TABLE BarCodeNbr DROP COLUMN tenant_id;
  96. -- ALTER TABLE wms_rwzp DROP INDEX uk_wms_rwzp_tenant_org_task;
  97. -- ALTER TABLE wms_rwzp DROP COLUMN tenant_id;
  98. -- ============================================================================