1.0.389.sql 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345
  1. -- S0 租户隔离补齐:为 12 张缺 tenant_id 的 S0 列表主表补列 + 索引 + 存量行归属回填 + 唯一键租户化。
  2. --
  3. -- 归属证据(2026-08-25 只读核对,全部行可 100%% 回推,无法回推 = 0):
  4. -- 这些表的存量行引用 SysOrg 1329900200001/…002/…003,而这三个组织由 SeedData/S0OrgSeedData.cs
  5. -- 灌到 OrderFlowConstants.DemoTenantId = 797403760988230(AIDOP-Demo),**不是** AIDOP 797403760988229。
  6. -- 合计回填 90 行:PersonSkill 36 / S0ContractReviewCycleBreakdown 18 / S0ContractReviewCycle 10 /
  7. -- S0OrderScheduleCycle 5 / S0OrderReviewCycle 5 / S0ProductDesignCycle 5 / S0CategoryLeadTime 5 /
  8. -- S0MaterialPlanCycle 5 / S0ContractReviewCycleSyncFlag 1。
  9. -- 预期副作用:这批行归位 AIDOP-Demo 后,将不再出现在 AIDOP(797…229) 的对应页面——这是正确的租户归属,不是缺陷。
  10. --
  11. -- 回填口径:不写死租户 ID,一律 JOIN SysOrg 按 factory 列反查 TenantId;解析不出的行保持 NULL(不猜)。
  12. -- PriorityCode 例外:该表本就有 tenant_id 且 4 行均为 797403760988229,无 factory 列,故只做唯一键租户化、不回填。
  13. -- 空表(WorkOrderControl / ado_s0_sales_order_priority_rule)只做 ADD COLUMN + 索引,不伪造回填。
  14. --
  15. -- 唯一键:原唯一键均不含租户,而应用层唯一性预检已改为租户内判重,二者口径必须一致,故统一前置 tenant_id。
  16. -- 索引名保持不变,使 AidopS0ExcelColumnMigration.EnsureUniqueIndex(按名判存在)不会把旧结构建回来。
  17. --
  18. -- 幂等:ADD COLUMN / ADD INDEX 均有 information_schema 存在性保护;回填带 WHERE tenant_id IS NULL;
  19. -- 唯一键重建按实际列清单比对,已是目标结构则跳过。重复执行无副作用。
  20. -- [1/12] S0OrderScheduleCycle
  21. SET @t1 := (SELECT COUNT(*) FROM information_schema.TABLES WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='S0OrderScheduleCycle');
  22. SET @c1 := (SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='S0OrderScheduleCycle' AND COLUMN_NAME='tenant_id');
  23. SET @a1 := CASE WHEN @t1=1 AND @c1=0
  24. THEN 'ALTER TABLE `S0OrderScheduleCycle` ADD COLUMN `tenant_id` BIGINT NULL COMMENT ''租户Id'''
  25. ELSE 'SELECT 1' END;
  26. PREPARE p1a FROM @a1; EXECUTE p1a; DEALLOCATE PREPARE p1a;
  27. SET @i1 := (SELECT COUNT(*) FROM information_schema.STATISTICS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='S0OrderScheduleCycle' AND INDEX_NAME='idx_tenant');
  28. SET @b1 := CASE WHEN @t1=1 AND @i1=0
  29. THEN 'ALTER TABLE `S0OrderScheduleCycle` ADD INDEX `idx_tenant` (`tenant_id`)'
  30. ELSE 'SELECT 1' END;
  31. PREPARE p1b FROM @b1; EXECUTE p1b; DEALLOCATE PREPARE p1b;
  32. -- 回填:按 factory_ref_id 反查 SysOrg.TenantId(解析不出则保持 NULL)
  33. SET @d1 := CASE WHEN @t1=1
  34. THEN 'UPDATE `S0OrderScheduleCycle` t JOIN `SysOrg` o ON o.`Id` = t.`factory_ref_id` SET t.`tenant_id` = o.`TenantId` WHERE t.`tenant_id` IS NULL AND o.`TenantId` IS NOT NULL'
  35. ELSE 'SELECT 1' END;
  36. PREPARE p1d FROM @d1; EXECUTE p1d; DEALLOCATE PREPARE p1d;
  37. SET @u1 := (SELECT GROUP_CONCAT(COLUMN_NAME ORDER BY SEQ_IN_INDEX) FROM information_schema.STATISTICS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='S0OrderScheduleCycle' AND INDEX_NAME='uk_S0OrderScheduleCycle_factory_ordertype');
  38. SET @e1 := CASE
  39. WHEN @t1<>1 THEN 'SELECT 1'
  40. WHEN @u1 = 'tenant_id,factory_ref_id,order_type' THEN 'SELECT 1'
  41. WHEN @u1 IS NULL THEN 'ALTER TABLE `S0OrderScheduleCycle` ADD UNIQUE INDEX `uk_S0OrderScheduleCycle_factory_ordertype` (`tenant_id`,`factory_ref_id`,`order_type`)'
  42. ELSE 'ALTER TABLE `S0OrderScheduleCycle` DROP INDEX `uk_S0OrderScheduleCycle_factory_ordertype`, ADD UNIQUE INDEX `uk_S0OrderScheduleCycle_factory_ordertype` (`tenant_id`,`factory_ref_id`,`order_type`)' END;
  43. PREPARE p1e FROM @e1; EXECUTE p1e; DEALLOCATE PREPARE p1e;
  44. -- [2/12] WorkOrderControl
  45. SET @t2 := (SELECT COUNT(*) FROM information_schema.TABLES WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='WorkOrderControl');
  46. SET @c2 := (SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='WorkOrderControl' AND COLUMN_NAME='tenant_id');
  47. SET @a2 := CASE WHEN @t2=1 AND @c2=0
  48. THEN 'ALTER TABLE `WorkOrderControl` ADD COLUMN `tenant_id` BIGINT NULL COMMENT ''租户Id'''
  49. ELSE 'SELECT 1' END;
  50. PREPARE p2a FROM @a2; EXECUTE p2a; DEALLOCATE PREPARE p2a;
  51. SET @i2 := (SELECT COUNT(*) FROM information_schema.STATISTICS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='WorkOrderControl' AND INDEX_NAME='idx_tenant');
  52. SET @b2 := CASE WHEN @t2=1 AND @i2=0
  53. THEN 'ALTER TABLE `WorkOrderControl` ADD INDEX `idx_tenant` (`tenant_id`)'
  54. ELSE 'SELECT 1' END;
  55. PREPARE p2b FROM @b2; EXECUTE p2b; DEALLOCATE PREPARE p2b;
  56. -- 回填:按 FactoryRefId 反查 SysOrg.TenantId(解析不出则保持 NULL)
  57. SET @d2 := CASE WHEN @t2=1
  58. THEN 'UPDATE `WorkOrderControl` t JOIN `SysOrg` o ON o.`Id` = t.`FactoryRefId` SET t.`tenant_id` = o.`TenantId` WHERE t.`tenant_id` IS NULL AND o.`TenantId` IS NOT NULL'
  59. ELSE 'SELECT 1' END;
  60. PREPARE p2d FROM @d2; EXECUTE p2d; DEALLOCATE PREPARE p2d;
  61. SET @u2 := (SELECT GROUP_CONCAT(COLUMN_NAME ORDER BY SEQ_IN_INDEX) FROM information_schema.STATISTICS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='WorkOrderControl' AND INDEX_NAME='uk_WorkOrderControl_code');
  62. SET @e2 := CASE
  63. WHEN @t2<>1 THEN 'SELECT 1'
  64. WHEN @u2 = 'tenant_id,CompanyRefId,FactoryRefId,Code' THEN 'SELECT 1'
  65. WHEN @u2 IS NULL THEN 'ALTER TABLE `WorkOrderControl` ADD UNIQUE INDEX `uk_WorkOrderControl_code` (`tenant_id`,`CompanyRefId`,`FactoryRefId`,`Code`)'
  66. ELSE 'ALTER TABLE `WorkOrderControl` DROP INDEX `uk_WorkOrderControl_code`, ADD UNIQUE INDEX `uk_WorkOrderControl_code` (`tenant_id`,`CompanyRefId`,`FactoryRefId`,`Code`)' END;
  67. PREPARE p2e FROM @e2; EXECUTE p2e; DEALLOCATE PREPARE p2e;
  68. -- [3/12] PersonSkill
  69. SET @t3 := (SELECT COUNT(*) FROM information_schema.TABLES WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='PersonSkill');
  70. SET @c3 := (SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='PersonSkill' AND COLUMN_NAME='tenant_id');
  71. SET @a3 := CASE WHEN @t3=1 AND @c3=0
  72. THEN 'ALTER TABLE `PersonSkill` ADD COLUMN `tenant_id` BIGINT NULL COMMENT ''租户Id'''
  73. ELSE 'SELECT 1' END;
  74. PREPARE p3a FROM @a3; EXECUTE p3a; DEALLOCATE PREPARE p3a;
  75. SET @i3 := (SELECT COUNT(*) FROM information_schema.STATISTICS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='PersonSkill' AND INDEX_NAME='idx_tenant');
  76. SET @b3 := CASE WHEN @t3=1 AND @i3=0
  77. THEN 'ALTER TABLE `PersonSkill` ADD INDEX `idx_tenant` (`tenant_id`)'
  78. ELSE 'SELECT 1' END;
  79. PREPARE p3b FROM @b3; EXECUTE p3b; DEALLOCATE PREPARE p3b;
  80. -- 回填:按 FactoryRefId 反查 SysOrg.TenantId(解析不出则保持 NULL)
  81. SET @d3 := CASE WHEN @t3=1
  82. THEN 'UPDATE `PersonSkill` t JOIN `SysOrg` o ON o.`Id` = t.`FactoryRefId` SET t.`tenant_id` = o.`TenantId` WHERE t.`tenant_id` IS NULL AND o.`TenantId` IS NOT NULL'
  83. ELSE 'SELECT 1' END;
  84. PREPARE p3d FROM @d3; EXECUTE p3d; DEALLOCATE PREPARE p3d;
  85. SET @u3 := (SELECT GROUP_CONCAT(COLUMN_NAME ORDER BY SEQ_IN_INDEX) FROM information_schema.STATISTICS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='PersonSkill' AND INDEX_NAME='uk_PersonSkill_code');
  86. SET @e3 := CASE
  87. WHEN @t3<>1 THEN 'SELECT 1'
  88. WHEN @u3 = 'tenant_id,CompanyRefId,FactoryRefId,Code' THEN 'SELECT 1'
  89. WHEN @u3 IS NULL THEN 'ALTER TABLE `PersonSkill` ADD UNIQUE INDEX `uk_PersonSkill_code` (`tenant_id`,`CompanyRefId`,`FactoryRefId`,`Code`)'
  90. ELSE 'ALTER TABLE `PersonSkill` DROP INDEX `uk_PersonSkill_code`, ADD UNIQUE INDEX `uk_PersonSkill_code` (`tenant_id`,`CompanyRefId`,`FactoryRefId`,`Code`)' END;
  91. PREPARE p3e FROM @e3; EXECUTE p3e; DEALLOCATE PREPARE p3e;
  92. -- [4/12] S0ContractReviewCycle
  93. SET @t4 := (SELECT COUNT(*) FROM information_schema.TABLES WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='S0ContractReviewCycle');
  94. SET @c4 := (SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='S0ContractReviewCycle' AND COLUMN_NAME='tenant_id');
  95. SET @a4 := CASE WHEN @t4=1 AND @c4=0
  96. THEN 'ALTER TABLE `S0ContractReviewCycle` ADD COLUMN `tenant_id` BIGINT NULL COMMENT ''租户Id'''
  97. ELSE 'SELECT 1' END;
  98. PREPARE p4a FROM @a4; EXECUTE p4a; DEALLOCATE PREPARE p4a;
  99. SET @i4 := (SELECT COUNT(*) FROM information_schema.STATISTICS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='S0ContractReviewCycle' AND INDEX_NAME='idx_tenant');
  100. SET @b4 := CASE WHEN @t4=1 AND @i4=0
  101. THEN 'ALTER TABLE `S0ContractReviewCycle` ADD INDEX `idx_tenant` (`tenant_id`)'
  102. ELSE 'SELECT 1' END;
  103. PREPARE p4b FROM @b4; EXECUTE p4b; DEALLOCATE PREPARE p4b;
  104. -- 回填:按 factory_ref_id 反查 SysOrg.TenantId(解析不出则保持 NULL)
  105. SET @d4 := CASE WHEN @t4=1
  106. THEN 'UPDATE `S0ContractReviewCycle` t JOIN `SysOrg` o ON o.`Id` = t.`factory_ref_id` SET t.`tenant_id` = o.`TenantId` WHERE t.`tenant_id` IS NULL AND o.`TenantId` IS NOT NULL'
  107. ELSE 'SELECT 1' END;
  108. PREPARE p4d FROM @d4; EXECUTE p4d; DEALLOCATE PREPARE p4d;
  109. SET @u4 := (SELECT GROUP_CONCAT(COLUMN_NAME ORDER BY SEQ_IN_INDEX) FROM information_schema.STATISTICS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='S0ContractReviewCycle' AND INDEX_NAME='uk_S0ContractReviewCycle_factory_stage');
  110. SET @e4 := CASE
  111. WHEN @t4<>1 THEN 'SELECT 1'
  112. WHEN @u4 = 'tenant_id,factory_ref_id,stage_code' THEN 'SELECT 1'
  113. WHEN @u4 IS NULL THEN 'ALTER TABLE `S0ContractReviewCycle` ADD UNIQUE INDEX `uk_S0ContractReviewCycle_factory_stage` (`tenant_id`,`factory_ref_id`,`stage_code`)'
  114. ELSE 'ALTER TABLE `S0ContractReviewCycle` DROP INDEX `uk_S0ContractReviewCycle_factory_stage`, ADD UNIQUE INDEX `uk_S0ContractReviewCycle_factory_stage` (`tenant_id`,`factory_ref_id`,`stage_code`)' END;
  115. PREPARE p4e FROM @e4; EXECUTE p4e; DEALLOCATE PREPARE p4e;
  116. -- [5/12] S0ContractReviewCycleBreakdown
  117. SET @t5 := (SELECT COUNT(*) FROM information_schema.TABLES WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='S0ContractReviewCycleBreakdown');
  118. SET @c5 := (SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='S0ContractReviewCycleBreakdown' AND COLUMN_NAME='tenant_id');
  119. SET @a5 := CASE WHEN @t5=1 AND @c5=0
  120. THEN 'ALTER TABLE `S0ContractReviewCycleBreakdown` ADD COLUMN `tenant_id` BIGINT NULL COMMENT ''租户Id'''
  121. ELSE 'SELECT 1' END;
  122. PREPARE p5a FROM @a5; EXECUTE p5a; DEALLOCATE PREPARE p5a;
  123. SET @i5 := (SELECT COUNT(*) FROM information_schema.STATISTICS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='S0ContractReviewCycleBreakdown' AND INDEX_NAME='idx_tenant');
  124. SET @b5 := CASE WHEN @t5=1 AND @i5=0
  125. THEN 'ALTER TABLE `S0ContractReviewCycleBreakdown` ADD INDEX `idx_tenant` (`tenant_id`)'
  126. ELSE 'SELECT 1' END;
  127. PREPARE p5b FROM @b5; EXECUTE p5b; DEALLOCATE PREPARE p5b;
  128. -- 回填:按 factory_ref_id 反查 SysOrg.TenantId(解析不出则保持 NULL)
  129. SET @d5 := CASE WHEN @t5=1
  130. THEN 'UPDATE `S0ContractReviewCycleBreakdown` t JOIN `SysOrg` o ON o.`Id` = t.`factory_ref_id` SET t.`tenant_id` = o.`TenantId` WHERE t.`tenant_id` IS NULL AND o.`TenantId` IS NOT NULL'
  131. ELSE 'SELECT 1' END;
  132. PREPARE p5d FROM @d5; EXECUTE p5d; DEALLOCATE PREPARE p5d;
  133. SET @u5 := (SELECT GROUP_CONCAT(COLUMN_NAME ORDER BY SEQ_IN_INDEX) FROM information_schema.STATISTICS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='S0ContractReviewCycleBreakdown' AND INDEX_NAME='uk_S0CRCBreakdown_factory_parent_group');
  134. SET @e5 := CASE
  135. WHEN @t5<>1 THEN 'SELECT 1'
  136. WHEN @u5 = 'tenant_id,factory_ref_id,parent_stage_code,group_code' THEN 'SELECT 1'
  137. WHEN @u5 IS NULL THEN 'ALTER TABLE `S0ContractReviewCycleBreakdown` ADD UNIQUE INDEX `uk_S0CRCBreakdown_factory_parent_group` (`tenant_id`,`factory_ref_id`,`parent_stage_code`,`group_code`)'
  138. ELSE 'ALTER TABLE `S0ContractReviewCycleBreakdown` DROP INDEX `uk_S0CRCBreakdown_factory_parent_group`, ADD UNIQUE INDEX `uk_S0CRCBreakdown_factory_parent_group` (`tenant_id`,`factory_ref_id`,`parent_stage_code`,`group_code`)' END;
  139. PREPARE p5e FROM @e5; EXECUTE p5e; DEALLOCATE PREPARE p5e;
  140. -- [6/12] S0ContractReviewCycleSyncFlag
  141. SET @t6 := (SELECT COUNT(*) FROM information_schema.TABLES WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='S0ContractReviewCycleSyncFlag');
  142. SET @c6 := (SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='S0ContractReviewCycleSyncFlag' AND COLUMN_NAME='tenant_id');
  143. SET @a6 := CASE WHEN @t6=1 AND @c6=0
  144. THEN 'ALTER TABLE `S0ContractReviewCycleSyncFlag` ADD COLUMN `tenant_id` BIGINT NULL COMMENT ''租户Id'''
  145. ELSE 'SELECT 1' END;
  146. PREPARE p6a FROM @a6; EXECUTE p6a; DEALLOCATE PREPARE p6a;
  147. SET @i6 := (SELECT COUNT(*) FROM information_schema.STATISTICS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='S0ContractReviewCycleSyncFlag' AND INDEX_NAME='idx_tenant');
  148. SET @b6 := CASE WHEN @t6=1 AND @i6=0
  149. THEN 'ALTER TABLE `S0ContractReviewCycleSyncFlag` ADD INDEX `idx_tenant` (`tenant_id`)'
  150. ELSE 'SELECT 1' END;
  151. PREPARE p6b FROM @b6; EXECUTE p6b; DEALLOCATE PREPARE p6b;
  152. -- 回填:按 factory_ref_id 反查 SysOrg.TenantId(解析不出则保持 NULL)
  153. SET @d6 := CASE WHEN @t6=1
  154. THEN 'UPDATE `S0ContractReviewCycleSyncFlag` t JOIN `SysOrg` o ON o.`Id` = t.`factory_ref_id` SET t.`tenant_id` = o.`TenantId` WHERE t.`tenant_id` IS NULL AND o.`TenantId` IS NOT NULL'
  155. ELSE 'SELECT 1' END;
  156. PREPARE p6d FROM @d6; EXECUTE p6d; DEALLOCATE PREPARE p6d;
  157. SET @u6 := (SELECT GROUP_CONCAT(COLUMN_NAME ORDER BY SEQ_IN_INDEX) FROM information_schema.STATISTICS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='S0ContractReviewCycleSyncFlag' AND INDEX_NAME='uk_S0CRCSyncFlag_factory');
  158. SET @e6 := CASE
  159. WHEN @t6<>1 THEN 'SELECT 1'
  160. WHEN @u6 = 'tenant_id,factory_ref_id' THEN 'SELECT 1'
  161. WHEN @u6 IS NULL THEN 'ALTER TABLE `S0ContractReviewCycleSyncFlag` ADD UNIQUE INDEX `uk_S0CRCSyncFlag_factory` (`tenant_id`,`factory_ref_id`)'
  162. ELSE 'ALTER TABLE `S0ContractReviewCycleSyncFlag` DROP INDEX `uk_S0CRCSyncFlag_factory`, ADD UNIQUE INDEX `uk_S0CRCSyncFlag_factory` (`tenant_id`,`factory_ref_id`)' END;
  163. PREPARE p6e FROM @e6; EXECUTE p6e; DEALLOCATE PREPARE p6e;
  164. -- [7/12] S0OrderReviewCycle
  165. SET @t7 := (SELECT COUNT(*) FROM information_schema.TABLES WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='S0OrderReviewCycle');
  166. SET @c7 := (SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='S0OrderReviewCycle' AND COLUMN_NAME='tenant_id');
  167. SET @a7 := CASE WHEN @t7=1 AND @c7=0
  168. THEN 'ALTER TABLE `S0OrderReviewCycle` ADD COLUMN `tenant_id` BIGINT NULL COMMENT ''租户Id'''
  169. ELSE 'SELECT 1' END;
  170. PREPARE p7a FROM @a7; EXECUTE p7a; DEALLOCATE PREPARE p7a;
  171. SET @i7 := (SELECT COUNT(*) FROM information_schema.STATISTICS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='S0OrderReviewCycle' AND INDEX_NAME='idx_tenant');
  172. SET @b7 := CASE WHEN @t7=1 AND @i7=0
  173. THEN 'ALTER TABLE `S0OrderReviewCycle` ADD INDEX `idx_tenant` (`tenant_id`)'
  174. ELSE 'SELECT 1' END;
  175. PREPARE p7b FROM @b7; EXECUTE p7b; DEALLOCATE PREPARE p7b;
  176. -- 回填:按 factory_ref_id 反查 SysOrg.TenantId(解析不出则保持 NULL)
  177. SET @d7 := CASE WHEN @t7=1
  178. THEN 'UPDATE `S0OrderReviewCycle` t JOIN `SysOrg` o ON o.`Id` = t.`factory_ref_id` SET t.`tenant_id` = o.`TenantId` WHERE t.`tenant_id` IS NULL AND o.`TenantId` IS NOT NULL'
  179. ELSE 'SELECT 1' END;
  180. PREPARE p7d FROM @d7; EXECUTE p7d; DEALLOCATE PREPARE p7d;
  181. SET @u7 := (SELECT GROUP_CONCAT(COLUMN_NAME ORDER BY SEQ_IN_INDEX) FROM information_schema.STATISTICS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='S0OrderReviewCycle' AND INDEX_NAME='uk_S0OrderReviewCycle_factory_ordertype');
  182. SET @e7 := CASE
  183. WHEN @t7<>1 THEN 'SELECT 1'
  184. WHEN @u7 = 'tenant_id,factory_ref_id,order_type' THEN 'SELECT 1'
  185. WHEN @u7 IS NULL THEN 'ALTER TABLE `S0OrderReviewCycle` ADD UNIQUE INDEX `uk_S0OrderReviewCycle_factory_ordertype` (`tenant_id`,`factory_ref_id`,`order_type`)'
  186. ELSE 'ALTER TABLE `S0OrderReviewCycle` DROP INDEX `uk_S0OrderReviewCycle_factory_ordertype`, ADD UNIQUE INDEX `uk_S0OrderReviewCycle_factory_ordertype` (`tenant_id`,`factory_ref_id`,`order_type`)' END;
  187. PREPARE p7e FROM @e7; EXECUTE p7e; DEALLOCATE PREPARE p7e;
  188. -- [8/12] PriorityCode
  189. SET @t8 := (SELECT COUNT(*) FROM information_schema.TABLES WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='PriorityCode');
  190. SET @c8 := (SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='PriorityCode' AND COLUMN_NAME='tenant_id');
  191. SET @a8 := CASE WHEN @t8=1 AND @c8=0
  192. THEN 'ALTER TABLE `PriorityCode` ADD COLUMN `tenant_id` BIGINT NULL COMMENT ''租户Id'''
  193. ELSE 'SELECT 1' END;
  194. PREPARE p8a FROM @a8; EXECUTE p8a; DEALLOCATE PREPARE p8a;
  195. SET @i8 := (SELECT COUNT(*) FROM information_schema.STATISTICS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='PriorityCode' AND INDEX_NAME='idx_tenant');
  196. SET @b8 := CASE WHEN @t8=1 AND @i8=0
  197. THEN 'ALTER TABLE `PriorityCode` ADD INDEX `idx_tenant` (`tenant_id`)'
  198. ELSE 'SELECT 1' END;
  199. PREPARE p8b FROM @b8; EXECUTE p8b; DEALLOCATE PREPARE p8b;
  200. -- 不回填:PriorityCode 无 factory 列,存量 tenant_id 已正确(797403760988229)。
  201. SET @u8 := (SELECT GROUP_CONCAT(COLUMN_NAME ORDER BY SEQ_IN_INDEX) FROM information_schema.STATISTICS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='PriorityCode' AND INDEX_NAME='uk_PriorityCode_scope');
  202. SET @e8 := CASE
  203. WHEN @t8<>1 THEN 'SELECT 1'
  204. WHEN @u8 = 'tenant_id,Descr' THEN 'SELECT 1'
  205. WHEN @u8 IS NULL THEN 'ALTER TABLE `PriorityCode` ADD UNIQUE INDEX `uk_PriorityCode_scope` (`tenant_id`,`Descr`)'
  206. ELSE 'ALTER TABLE `PriorityCode` DROP INDEX `uk_PriorityCode_scope`, ADD UNIQUE INDEX `uk_PriorityCode_scope` (`tenant_id`,`Descr`)' END;
  207. PREPARE p8e FROM @e8; EXECUTE p8e; DEALLOCATE PREPARE p8e;
  208. -- [9/12] ado_s0_sales_order_priority_rule
  209. SET @t9 := (SELECT COUNT(*) FROM information_schema.TABLES WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='ado_s0_sales_order_priority_rule');
  210. SET @c9 := (SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='ado_s0_sales_order_priority_rule' AND COLUMN_NAME='tenant_id');
  211. SET @a9 := CASE WHEN @t9=1 AND @c9=0
  212. THEN 'ALTER TABLE `ado_s0_sales_order_priority_rule` ADD COLUMN `tenant_id` BIGINT NULL COMMENT ''租户Id'''
  213. ELSE 'SELECT 1' END;
  214. PREPARE p9a FROM @a9; EXECUTE p9a; DEALLOCATE PREPARE p9a;
  215. SET @i9 := (SELECT COUNT(*) FROM information_schema.STATISTICS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='ado_s0_sales_order_priority_rule' AND INDEX_NAME='idx_tenant');
  216. SET @b9 := CASE WHEN @t9=1 AND @i9=0
  217. THEN 'ALTER TABLE `ado_s0_sales_order_priority_rule` ADD INDEX `idx_tenant` (`tenant_id`)'
  218. ELSE 'SELECT 1' END;
  219. PREPARE p9b FROM @b9; EXECUTE p9b; DEALLOCATE PREPARE p9b;
  220. -- 回填:按 FactoryRefId 反查 SysOrg.TenantId(解析不出则保持 NULL)
  221. SET @d9 := CASE WHEN @t9=1
  222. THEN 'UPDATE `ado_s0_sales_order_priority_rule` t JOIN `SysOrg` o ON o.`Id` = t.`FactoryRefId` SET t.`tenant_id` = o.`TenantId` WHERE t.`tenant_id` IS NULL AND o.`TenantId` IS NOT NULL'
  223. ELSE 'SELECT 1' END;
  224. PREPARE p9d FROM @d9; EXECUTE p9d; DEALLOCATE PREPARE p9d;
  225. -- ado_s0_sales_order_priority_rule 无业务唯一键,无需租户化。
  226. -- [10/12] S0ProductDesignCycle
  227. SET @t10 := (SELECT COUNT(*) FROM information_schema.TABLES WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='S0ProductDesignCycle');
  228. SET @c10 := (SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='S0ProductDesignCycle' AND COLUMN_NAME='tenant_id');
  229. SET @a10 := CASE WHEN @t10=1 AND @c10=0
  230. THEN 'ALTER TABLE `S0ProductDesignCycle` ADD COLUMN `tenant_id` BIGINT NULL COMMENT ''租户Id'''
  231. ELSE 'SELECT 1' END;
  232. PREPARE p10a FROM @a10; EXECUTE p10a; DEALLOCATE PREPARE p10a;
  233. SET @i10 := (SELECT COUNT(*) FROM information_schema.STATISTICS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='S0ProductDesignCycle' AND INDEX_NAME='idx_tenant');
  234. SET @b10 := CASE WHEN @t10=1 AND @i10=0
  235. THEN 'ALTER TABLE `S0ProductDesignCycle` ADD INDEX `idx_tenant` (`tenant_id`)'
  236. ELSE 'SELECT 1' END;
  237. PREPARE p10b FROM @b10; EXECUTE p10b; DEALLOCATE PREPARE p10b;
  238. -- 回填:按 factory_ref_id 反查 SysOrg.TenantId(解析不出则保持 NULL)
  239. SET @d10 := CASE WHEN @t10=1
  240. THEN 'UPDATE `S0ProductDesignCycle` t JOIN `SysOrg` o ON o.`Id` = t.`factory_ref_id` SET t.`tenant_id` = o.`TenantId` WHERE t.`tenant_id` IS NULL AND o.`TenantId` IS NOT NULL'
  241. ELSE 'SELECT 1' END;
  242. PREPARE p10d FROM @d10; EXECUTE p10d; DEALLOCATE PREPARE p10d;
  243. SET @u10 := (SELECT GROUP_CONCAT(COLUMN_NAME ORDER BY SEQ_IN_INDEX) FROM information_schema.STATISTICS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='S0ProductDesignCycle' AND INDEX_NAME='uk_S0ProductDesignCycle_factory_type_attr');
  244. SET @e10 := CASE
  245. WHEN @t10<>1 THEN 'SELECT 1'
  246. WHEN @u10 = 'tenant_id,factory_ref_id,item_type,owner_application' THEN 'SELECT 1'
  247. WHEN @u10 IS NULL THEN 'ALTER TABLE `S0ProductDesignCycle` ADD UNIQUE INDEX `uk_S0ProductDesignCycle_factory_type_attr` (`tenant_id`,`factory_ref_id`,`item_type`,`owner_application`)'
  248. ELSE 'ALTER TABLE `S0ProductDesignCycle` DROP INDEX `uk_S0ProductDesignCycle_factory_type_attr`, ADD UNIQUE INDEX `uk_S0ProductDesignCycle_factory_type_attr` (`tenant_id`,`factory_ref_id`,`item_type`,`owner_application`)' END;
  249. PREPARE p10e FROM @e10; EXECUTE p10e; DEALLOCATE PREPARE p10e;
  250. -- [11/12] S0CategoryLeadTime
  251. SET @t11 := (SELECT COUNT(*) FROM information_schema.TABLES WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='S0CategoryLeadTime');
  252. SET @c11 := (SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='S0CategoryLeadTime' AND COLUMN_NAME='tenant_id');
  253. SET @a11 := CASE WHEN @t11=1 AND @c11=0
  254. THEN 'ALTER TABLE `S0CategoryLeadTime` ADD COLUMN `tenant_id` BIGINT NULL COMMENT ''租户Id'''
  255. ELSE 'SELECT 1' END;
  256. PREPARE p11a FROM @a11; EXECUTE p11a; DEALLOCATE PREPARE p11a;
  257. SET @i11 := (SELECT COUNT(*) FROM information_schema.STATISTICS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='S0CategoryLeadTime' AND INDEX_NAME='idx_tenant');
  258. SET @b11 := CASE WHEN @t11=1 AND @i11=0
  259. THEN 'ALTER TABLE `S0CategoryLeadTime` ADD INDEX `idx_tenant` (`tenant_id`)'
  260. ELSE 'SELECT 1' END;
  261. PREPARE p11b FROM @b11; EXECUTE p11b; DEALLOCATE PREPARE p11b;
  262. -- 回填:按 factory_ref_id 反查 SysOrg.TenantId(解析不出则保持 NULL)
  263. SET @d11 := CASE WHEN @t11=1
  264. THEN 'UPDATE `S0CategoryLeadTime` t JOIN `SysOrg` o ON o.`Id` = t.`factory_ref_id` SET t.`tenant_id` = o.`TenantId` WHERE t.`tenant_id` IS NULL AND o.`TenantId` IS NOT NULL'
  265. ELSE 'SELECT 1' END;
  266. PREPARE p11d FROM @d11; EXECUTE p11d; DEALLOCATE PREPARE p11d;
  267. SET @u11 := (SELECT GROUP_CONCAT(COLUMN_NAME ORDER BY SEQ_IN_INDEX) FROM information_schema.STATISTICS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='S0CategoryLeadTime' AND INDEX_NAME='uk_S0CategoryLeadTime_factory_category_owner');
  268. SET @e11 := CASE
  269. WHEN @t11<>1 THEN 'SELECT 1'
  270. WHEN @u11 = 'tenant_id,factory_ref_id,category_code,owner_application' THEN 'SELECT 1'
  271. WHEN @u11 IS NULL THEN 'ALTER TABLE `S0CategoryLeadTime` ADD UNIQUE INDEX `uk_S0CategoryLeadTime_factory_category_owner` (`tenant_id`,`factory_ref_id`,`category_code`,`owner_application`)'
  272. ELSE 'ALTER TABLE `S0CategoryLeadTime` DROP INDEX `uk_S0CategoryLeadTime_factory_category_owner`, ADD UNIQUE INDEX `uk_S0CategoryLeadTime_factory_category_owner` (`tenant_id`,`factory_ref_id`,`category_code`,`owner_application`)' END;
  273. PREPARE p11e FROM @e11; EXECUTE p11e; DEALLOCATE PREPARE p11e;
  274. -- [12/12] S0MaterialPlanCycle
  275. SET @t12 := (SELECT COUNT(*) FROM information_schema.TABLES WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='S0MaterialPlanCycle');
  276. SET @c12 := (SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='S0MaterialPlanCycle' AND COLUMN_NAME='tenant_id');
  277. SET @a12 := CASE WHEN @t12=1 AND @c12=0
  278. THEN 'ALTER TABLE `S0MaterialPlanCycle` ADD COLUMN `tenant_id` BIGINT NULL COMMENT ''租户Id'''
  279. ELSE 'SELECT 1' END;
  280. PREPARE p12a FROM @a12; EXECUTE p12a; DEALLOCATE PREPARE p12a;
  281. SET @i12 := (SELECT COUNT(*) FROM information_schema.STATISTICS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='S0MaterialPlanCycle' AND INDEX_NAME='idx_tenant');
  282. SET @b12 := CASE WHEN @t12=1 AND @i12=0
  283. THEN 'ALTER TABLE `S0MaterialPlanCycle` ADD INDEX `idx_tenant` (`tenant_id`)'
  284. ELSE 'SELECT 1' END;
  285. PREPARE p12b FROM @b12; EXECUTE p12b; DEALLOCATE PREPARE p12b;
  286. -- 回填:按 factory_ref_id 反查 SysOrg.TenantId(解析不出则保持 NULL)
  287. SET @d12 := CASE WHEN @t12=1
  288. THEN 'UPDATE `S0MaterialPlanCycle` t JOIN `SysOrg` o ON o.`Id` = t.`factory_ref_id` SET t.`tenant_id` = o.`TenantId` WHERE t.`tenant_id` IS NULL AND o.`TenantId` IS NOT NULL'
  289. ELSE 'SELECT 1' END;
  290. PREPARE p12d FROM @d12; EXECUTE p12d; DEALLOCATE PREPARE p12d;
  291. SET @u12 := (SELECT GROUP_CONCAT(COLUMN_NAME ORDER BY SEQ_IN_INDEX) FROM information_schema.STATISTICS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='S0MaterialPlanCycle' AND INDEX_NAME='uk_S0MaterialPlanCycle_factory_ordertype');
  292. SET @e12 := CASE
  293. WHEN @t12<>1 THEN 'SELECT 1'
  294. WHEN @u12 = 'tenant_id,factory_ref_id,order_type' THEN 'SELECT 1'
  295. WHEN @u12 IS NULL THEN 'ALTER TABLE `S0MaterialPlanCycle` ADD UNIQUE INDEX `uk_S0MaterialPlanCycle_factory_ordertype` (`tenant_id`,`factory_ref_id`,`order_type`)'
  296. ELSE 'ALTER TABLE `S0MaterialPlanCycle` DROP INDEX `uk_S0MaterialPlanCycle_factory_ordertype`, ADD UNIQUE INDEX `uk_S0MaterialPlanCycle_factory_ordertype` (`tenant_id`,`factory_ref_id`,`order_type`)' END;
  297. PREPARE p12e FROM @e12; EXECUTE p12e; DEALLOCATE PREPARE p12e;