|
|
@@ -0,0 +1,345 @@
|
|
|
+-- S0 租户隔离补齐:为 12 张缺 tenant_id 的 S0 列表主表补列 + 索引 + 存量行归属回填 + 唯一键租户化。
|
|
|
+--
|
|
|
+-- 归属证据(2026-08-25 只读核对,全部行可 100%% 回推,无法回推 = 0):
|
|
|
+-- 这些表的存量行引用 SysOrg 1329900200001/…002/…003,而这三个组织由 SeedData/S0OrgSeedData.cs
|
|
|
+-- 灌到 OrderFlowConstants.DemoTenantId = 797403760988230(AIDOP-Demo),**不是** AIDOP 797403760988229。
|
|
|
+-- 合计回填 90 行:PersonSkill 36 / S0ContractReviewCycleBreakdown 18 / S0ContractReviewCycle 10 /
|
|
|
+-- S0OrderScheduleCycle 5 / S0OrderReviewCycle 5 / S0ProductDesignCycle 5 / S0CategoryLeadTime 5 /
|
|
|
+-- S0MaterialPlanCycle 5 / S0ContractReviewCycleSyncFlag 1。
|
|
|
+-- 预期副作用:这批行归位 AIDOP-Demo 后,将不再出现在 AIDOP(797…229) 的对应页面——这是正确的租户归属,不是缺陷。
|
|
|
+--
|
|
|
+-- 回填口径:不写死租户 ID,一律 JOIN SysOrg 按 factory 列反查 TenantId;解析不出的行保持 NULL(不猜)。
|
|
|
+-- PriorityCode 例外:该表本就有 tenant_id 且 4 行均为 797403760988229,无 factory 列,故只做唯一键租户化、不回填。
|
|
|
+-- 空表(WorkOrderControl / ado_s0_sales_order_priority_rule)只做 ADD COLUMN + 索引,不伪造回填。
|
|
|
+--
|
|
|
+-- 唯一键:原唯一键均不含租户,而应用层唯一性预检已改为租户内判重,二者口径必须一致,故统一前置 tenant_id。
|
|
|
+-- 索引名保持不变,使 AidopS0ExcelColumnMigration.EnsureUniqueIndex(按名判存在)不会把旧结构建回来。
|
|
|
+--
|
|
|
+-- 幂等:ADD COLUMN / ADD INDEX 均有 information_schema 存在性保护;回填带 WHERE tenant_id IS NULL;
|
|
|
+-- 唯一键重建按实际列清单比对,已是目标结构则跳过。重复执行无副作用。
|
|
|
+
|
|
|
+-- [1/12] S0OrderScheduleCycle
|
|
|
+SET @t1 := (SELECT COUNT(*) FROM information_schema.TABLES WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='S0OrderScheduleCycle');
|
|
|
+SET @c1 := (SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='S0OrderScheduleCycle' AND COLUMN_NAME='tenant_id');
|
|
|
+SET @a1 := CASE WHEN @t1=1 AND @c1=0
|
|
|
+ THEN 'ALTER TABLE `S0OrderScheduleCycle` ADD COLUMN `tenant_id` BIGINT NULL COMMENT ''租户Id'''
|
|
|
+ ELSE 'SELECT 1' END;
|
|
|
+PREPARE p1a FROM @a1; EXECUTE p1a; DEALLOCATE PREPARE p1a;
|
|
|
+
|
|
|
+SET @i1 := (SELECT COUNT(*) FROM information_schema.STATISTICS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='S0OrderScheduleCycle' AND INDEX_NAME='idx_tenant');
|
|
|
+SET @b1 := CASE WHEN @t1=1 AND @i1=0
|
|
|
+ THEN 'ALTER TABLE `S0OrderScheduleCycle` ADD INDEX `idx_tenant` (`tenant_id`)'
|
|
|
+ ELSE 'SELECT 1' END;
|
|
|
+PREPARE p1b FROM @b1; EXECUTE p1b; DEALLOCATE PREPARE p1b;
|
|
|
+
|
|
|
+-- 回填:按 factory_ref_id 反查 SysOrg.TenantId(解析不出则保持 NULL)
|
|
|
+SET @d1 := CASE WHEN @t1=1
|
|
|
+ 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'
|
|
|
+ ELSE 'SELECT 1' END;
|
|
|
+PREPARE p1d FROM @d1; EXECUTE p1d; DEALLOCATE PREPARE p1d;
|
|
|
+
|
|
|
+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');
|
|
|
+SET @e1 := CASE
|
|
|
+ WHEN @t1<>1 THEN 'SELECT 1'
|
|
|
+ WHEN @u1 = 'tenant_id,factory_ref_id,order_type' THEN 'SELECT 1'
|
|
|
+ WHEN @u1 IS NULL THEN 'ALTER TABLE `S0OrderScheduleCycle` ADD UNIQUE INDEX `uk_S0OrderScheduleCycle_factory_ordertype` (`tenant_id`,`factory_ref_id`,`order_type`)'
|
|
|
+ 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;
|
|
|
+PREPARE p1e FROM @e1; EXECUTE p1e; DEALLOCATE PREPARE p1e;
|
|
|
+
|
|
|
+-- [2/12] WorkOrderControl
|
|
|
+SET @t2 := (SELECT COUNT(*) FROM information_schema.TABLES WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='WorkOrderControl');
|
|
|
+SET @c2 := (SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='WorkOrderControl' AND COLUMN_NAME='tenant_id');
|
|
|
+SET @a2 := CASE WHEN @t2=1 AND @c2=0
|
|
|
+ THEN 'ALTER TABLE `WorkOrderControl` ADD COLUMN `tenant_id` BIGINT NULL COMMENT ''租户Id'''
|
|
|
+ ELSE 'SELECT 1' END;
|
|
|
+PREPARE p2a FROM @a2; EXECUTE p2a; DEALLOCATE PREPARE p2a;
|
|
|
+
|
|
|
+SET @i2 := (SELECT COUNT(*) FROM information_schema.STATISTICS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='WorkOrderControl' AND INDEX_NAME='idx_tenant');
|
|
|
+SET @b2 := CASE WHEN @t2=1 AND @i2=0
|
|
|
+ THEN 'ALTER TABLE `WorkOrderControl` ADD INDEX `idx_tenant` (`tenant_id`)'
|
|
|
+ ELSE 'SELECT 1' END;
|
|
|
+PREPARE p2b FROM @b2; EXECUTE p2b; DEALLOCATE PREPARE p2b;
|
|
|
+
|
|
|
+-- 回填:按 FactoryRefId 反查 SysOrg.TenantId(解析不出则保持 NULL)
|
|
|
+SET @d2 := CASE WHEN @t2=1
|
|
|
+ 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'
|
|
|
+ ELSE 'SELECT 1' END;
|
|
|
+PREPARE p2d FROM @d2; EXECUTE p2d; DEALLOCATE PREPARE p2d;
|
|
|
+
|
|
|
+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');
|
|
|
+SET @e2 := CASE
|
|
|
+ WHEN @t2<>1 THEN 'SELECT 1'
|
|
|
+ WHEN @u2 = 'tenant_id,CompanyRefId,FactoryRefId,Code' THEN 'SELECT 1'
|
|
|
+ WHEN @u2 IS NULL THEN 'ALTER TABLE `WorkOrderControl` ADD UNIQUE INDEX `uk_WorkOrderControl_code` (`tenant_id`,`CompanyRefId`,`FactoryRefId`,`Code`)'
|
|
|
+ ELSE 'ALTER TABLE `WorkOrderControl` DROP INDEX `uk_WorkOrderControl_code`, ADD UNIQUE INDEX `uk_WorkOrderControl_code` (`tenant_id`,`CompanyRefId`,`FactoryRefId`,`Code`)' END;
|
|
|
+PREPARE p2e FROM @e2; EXECUTE p2e; DEALLOCATE PREPARE p2e;
|
|
|
+
|
|
|
+-- [3/12] PersonSkill
|
|
|
+SET @t3 := (SELECT COUNT(*) FROM information_schema.TABLES WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='PersonSkill');
|
|
|
+SET @c3 := (SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='PersonSkill' AND COLUMN_NAME='tenant_id');
|
|
|
+SET @a3 := CASE WHEN @t3=1 AND @c3=0
|
|
|
+ THEN 'ALTER TABLE `PersonSkill` ADD COLUMN `tenant_id` BIGINT NULL COMMENT ''租户Id'''
|
|
|
+ ELSE 'SELECT 1' END;
|
|
|
+PREPARE p3a FROM @a3; EXECUTE p3a; DEALLOCATE PREPARE p3a;
|
|
|
+
|
|
|
+SET @i3 := (SELECT COUNT(*) FROM information_schema.STATISTICS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='PersonSkill' AND INDEX_NAME='idx_tenant');
|
|
|
+SET @b3 := CASE WHEN @t3=1 AND @i3=0
|
|
|
+ THEN 'ALTER TABLE `PersonSkill` ADD INDEX `idx_tenant` (`tenant_id`)'
|
|
|
+ ELSE 'SELECT 1' END;
|
|
|
+PREPARE p3b FROM @b3; EXECUTE p3b; DEALLOCATE PREPARE p3b;
|
|
|
+
|
|
|
+-- 回填:按 FactoryRefId 反查 SysOrg.TenantId(解析不出则保持 NULL)
|
|
|
+SET @d3 := CASE WHEN @t3=1
|
|
|
+ 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'
|
|
|
+ ELSE 'SELECT 1' END;
|
|
|
+PREPARE p3d FROM @d3; EXECUTE p3d; DEALLOCATE PREPARE p3d;
|
|
|
+
|
|
|
+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');
|
|
|
+SET @e3 := CASE
|
|
|
+ WHEN @t3<>1 THEN 'SELECT 1'
|
|
|
+ WHEN @u3 = 'tenant_id,CompanyRefId,FactoryRefId,Code' THEN 'SELECT 1'
|
|
|
+ WHEN @u3 IS NULL THEN 'ALTER TABLE `PersonSkill` ADD UNIQUE INDEX `uk_PersonSkill_code` (`tenant_id`,`CompanyRefId`,`FactoryRefId`,`Code`)'
|
|
|
+ ELSE 'ALTER TABLE `PersonSkill` DROP INDEX `uk_PersonSkill_code`, ADD UNIQUE INDEX `uk_PersonSkill_code` (`tenant_id`,`CompanyRefId`,`FactoryRefId`,`Code`)' END;
|
|
|
+PREPARE p3e FROM @e3; EXECUTE p3e; DEALLOCATE PREPARE p3e;
|
|
|
+
|
|
|
+-- [4/12] S0ContractReviewCycle
|
|
|
+SET @t4 := (SELECT COUNT(*) FROM information_schema.TABLES WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='S0ContractReviewCycle');
|
|
|
+SET @c4 := (SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='S0ContractReviewCycle' AND COLUMN_NAME='tenant_id');
|
|
|
+SET @a4 := CASE WHEN @t4=1 AND @c4=0
|
|
|
+ THEN 'ALTER TABLE `S0ContractReviewCycle` ADD COLUMN `tenant_id` BIGINT NULL COMMENT ''租户Id'''
|
|
|
+ ELSE 'SELECT 1' END;
|
|
|
+PREPARE p4a FROM @a4; EXECUTE p4a; DEALLOCATE PREPARE p4a;
|
|
|
+
|
|
|
+SET @i4 := (SELECT COUNT(*) FROM information_schema.STATISTICS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='S0ContractReviewCycle' AND INDEX_NAME='idx_tenant');
|
|
|
+SET @b4 := CASE WHEN @t4=1 AND @i4=0
|
|
|
+ THEN 'ALTER TABLE `S0ContractReviewCycle` ADD INDEX `idx_tenant` (`tenant_id`)'
|
|
|
+ ELSE 'SELECT 1' END;
|
|
|
+PREPARE p4b FROM @b4; EXECUTE p4b; DEALLOCATE PREPARE p4b;
|
|
|
+
|
|
|
+-- 回填:按 factory_ref_id 反查 SysOrg.TenantId(解析不出则保持 NULL)
|
|
|
+SET @d4 := CASE WHEN @t4=1
|
|
|
+ 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'
|
|
|
+ ELSE 'SELECT 1' END;
|
|
|
+PREPARE p4d FROM @d4; EXECUTE p4d; DEALLOCATE PREPARE p4d;
|
|
|
+
|
|
|
+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');
|
|
|
+SET @e4 := CASE
|
|
|
+ WHEN @t4<>1 THEN 'SELECT 1'
|
|
|
+ WHEN @u4 = 'tenant_id,factory_ref_id,stage_code' THEN 'SELECT 1'
|
|
|
+ WHEN @u4 IS NULL THEN 'ALTER TABLE `S0ContractReviewCycle` ADD UNIQUE INDEX `uk_S0ContractReviewCycle_factory_stage` (`tenant_id`,`factory_ref_id`,`stage_code`)'
|
|
|
+ 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;
|
|
|
+PREPARE p4e FROM @e4; EXECUTE p4e; DEALLOCATE PREPARE p4e;
|
|
|
+
|
|
|
+-- [5/12] S0ContractReviewCycleBreakdown
|
|
|
+SET @t5 := (SELECT COUNT(*) FROM information_schema.TABLES WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='S0ContractReviewCycleBreakdown');
|
|
|
+SET @c5 := (SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='S0ContractReviewCycleBreakdown' AND COLUMN_NAME='tenant_id');
|
|
|
+SET @a5 := CASE WHEN @t5=1 AND @c5=0
|
|
|
+ THEN 'ALTER TABLE `S0ContractReviewCycleBreakdown` ADD COLUMN `tenant_id` BIGINT NULL COMMENT ''租户Id'''
|
|
|
+ ELSE 'SELECT 1' END;
|
|
|
+PREPARE p5a FROM @a5; EXECUTE p5a; DEALLOCATE PREPARE p5a;
|
|
|
+
|
|
|
+SET @i5 := (SELECT COUNT(*) FROM information_schema.STATISTICS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='S0ContractReviewCycleBreakdown' AND INDEX_NAME='idx_tenant');
|
|
|
+SET @b5 := CASE WHEN @t5=1 AND @i5=0
|
|
|
+ THEN 'ALTER TABLE `S0ContractReviewCycleBreakdown` ADD INDEX `idx_tenant` (`tenant_id`)'
|
|
|
+ ELSE 'SELECT 1' END;
|
|
|
+PREPARE p5b FROM @b5; EXECUTE p5b; DEALLOCATE PREPARE p5b;
|
|
|
+
|
|
|
+-- 回填:按 factory_ref_id 反查 SysOrg.TenantId(解析不出则保持 NULL)
|
|
|
+SET @d5 := CASE WHEN @t5=1
|
|
|
+ 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'
|
|
|
+ ELSE 'SELECT 1' END;
|
|
|
+PREPARE p5d FROM @d5; EXECUTE p5d; DEALLOCATE PREPARE p5d;
|
|
|
+
|
|
|
+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');
|
|
|
+SET @e5 := CASE
|
|
|
+ WHEN @t5<>1 THEN 'SELECT 1'
|
|
|
+ WHEN @u5 = 'tenant_id,factory_ref_id,parent_stage_code,group_code' THEN 'SELECT 1'
|
|
|
+ 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`)'
|
|
|
+ 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;
|
|
|
+PREPARE p5e FROM @e5; EXECUTE p5e; DEALLOCATE PREPARE p5e;
|
|
|
+
|
|
|
+-- [6/12] S0ContractReviewCycleSyncFlag
|
|
|
+SET @t6 := (SELECT COUNT(*) FROM information_schema.TABLES WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='S0ContractReviewCycleSyncFlag');
|
|
|
+SET @c6 := (SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='S0ContractReviewCycleSyncFlag' AND COLUMN_NAME='tenant_id');
|
|
|
+SET @a6 := CASE WHEN @t6=1 AND @c6=0
|
|
|
+ THEN 'ALTER TABLE `S0ContractReviewCycleSyncFlag` ADD COLUMN `tenant_id` BIGINT NULL COMMENT ''租户Id'''
|
|
|
+ ELSE 'SELECT 1' END;
|
|
|
+PREPARE p6a FROM @a6; EXECUTE p6a; DEALLOCATE PREPARE p6a;
|
|
|
+
|
|
|
+SET @i6 := (SELECT COUNT(*) FROM information_schema.STATISTICS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='S0ContractReviewCycleSyncFlag' AND INDEX_NAME='idx_tenant');
|
|
|
+SET @b6 := CASE WHEN @t6=1 AND @i6=0
|
|
|
+ THEN 'ALTER TABLE `S0ContractReviewCycleSyncFlag` ADD INDEX `idx_tenant` (`tenant_id`)'
|
|
|
+ ELSE 'SELECT 1' END;
|
|
|
+PREPARE p6b FROM @b6; EXECUTE p6b; DEALLOCATE PREPARE p6b;
|
|
|
+
|
|
|
+-- 回填:按 factory_ref_id 反查 SysOrg.TenantId(解析不出则保持 NULL)
|
|
|
+SET @d6 := CASE WHEN @t6=1
|
|
|
+ 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'
|
|
|
+ ELSE 'SELECT 1' END;
|
|
|
+PREPARE p6d FROM @d6; EXECUTE p6d; DEALLOCATE PREPARE p6d;
|
|
|
+
|
|
|
+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');
|
|
|
+SET @e6 := CASE
|
|
|
+ WHEN @t6<>1 THEN 'SELECT 1'
|
|
|
+ WHEN @u6 = 'tenant_id,factory_ref_id' THEN 'SELECT 1'
|
|
|
+ WHEN @u6 IS NULL THEN 'ALTER TABLE `S0ContractReviewCycleSyncFlag` ADD UNIQUE INDEX `uk_S0CRCSyncFlag_factory` (`tenant_id`,`factory_ref_id`)'
|
|
|
+ ELSE 'ALTER TABLE `S0ContractReviewCycleSyncFlag` DROP INDEX `uk_S0CRCSyncFlag_factory`, ADD UNIQUE INDEX `uk_S0CRCSyncFlag_factory` (`tenant_id`,`factory_ref_id`)' END;
|
|
|
+PREPARE p6e FROM @e6; EXECUTE p6e; DEALLOCATE PREPARE p6e;
|
|
|
+
|
|
|
+-- [7/12] S0OrderReviewCycle
|
|
|
+SET @t7 := (SELECT COUNT(*) FROM information_schema.TABLES WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='S0OrderReviewCycle');
|
|
|
+SET @c7 := (SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='S0OrderReviewCycle' AND COLUMN_NAME='tenant_id');
|
|
|
+SET @a7 := CASE WHEN @t7=1 AND @c7=0
|
|
|
+ THEN 'ALTER TABLE `S0OrderReviewCycle` ADD COLUMN `tenant_id` BIGINT NULL COMMENT ''租户Id'''
|
|
|
+ ELSE 'SELECT 1' END;
|
|
|
+PREPARE p7a FROM @a7; EXECUTE p7a; DEALLOCATE PREPARE p7a;
|
|
|
+
|
|
|
+SET @i7 := (SELECT COUNT(*) FROM information_schema.STATISTICS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='S0OrderReviewCycle' AND INDEX_NAME='idx_tenant');
|
|
|
+SET @b7 := CASE WHEN @t7=1 AND @i7=0
|
|
|
+ THEN 'ALTER TABLE `S0OrderReviewCycle` ADD INDEX `idx_tenant` (`tenant_id`)'
|
|
|
+ ELSE 'SELECT 1' END;
|
|
|
+PREPARE p7b FROM @b7; EXECUTE p7b; DEALLOCATE PREPARE p7b;
|
|
|
+
|
|
|
+-- 回填:按 factory_ref_id 反查 SysOrg.TenantId(解析不出则保持 NULL)
|
|
|
+SET @d7 := CASE WHEN @t7=1
|
|
|
+ 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'
|
|
|
+ ELSE 'SELECT 1' END;
|
|
|
+PREPARE p7d FROM @d7; EXECUTE p7d; DEALLOCATE PREPARE p7d;
|
|
|
+
|
|
|
+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');
|
|
|
+SET @e7 := CASE
|
|
|
+ WHEN @t7<>1 THEN 'SELECT 1'
|
|
|
+ WHEN @u7 = 'tenant_id,factory_ref_id,order_type' THEN 'SELECT 1'
|
|
|
+ WHEN @u7 IS NULL THEN 'ALTER TABLE `S0OrderReviewCycle` ADD UNIQUE INDEX `uk_S0OrderReviewCycle_factory_ordertype` (`tenant_id`,`factory_ref_id`,`order_type`)'
|
|
|
+ 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;
|
|
|
+PREPARE p7e FROM @e7; EXECUTE p7e; DEALLOCATE PREPARE p7e;
|
|
|
+
|
|
|
+-- [8/12] PriorityCode
|
|
|
+SET @t8 := (SELECT COUNT(*) FROM information_schema.TABLES WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='PriorityCode');
|
|
|
+SET @c8 := (SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='PriorityCode' AND COLUMN_NAME='tenant_id');
|
|
|
+SET @a8 := CASE WHEN @t8=1 AND @c8=0
|
|
|
+ THEN 'ALTER TABLE `PriorityCode` ADD COLUMN `tenant_id` BIGINT NULL COMMENT ''租户Id'''
|
|
|
+ ELSE 'SELECT 1' END;
|
|
|
+PREPARE p8a FROM @a8; EXECUTE p8a; DEALLOCATE PREPARE p8a;
|
|
|
+
|
|
|
+SET @i8 := (SELECT COUNT(*) FROM information_schema.STATISTICS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='PriorityCode' AND INDEX_NAME='idx_tenant');
|
|
|
+SET @b8 := CASE WHEN @t8=1 AND @i8=0
|
|
|
+ THEN 'ALTER TABLE `PriorityCode` ADD INDEX `idx_tenant` (`tenant_id`)'
|
|
|
+ ELSE 'SELECT 1' END;
|
|
|
+PREPARE p8b FROM @b8; EXECUTE p8b; DEALLOCATE PREPARE p8b;
|
|
|
+
|
|
|
+-- 不回填:PriorityCode 无 factory 列,存量 tenant_id 已正确(797403760988229)。
|
|
|
+
|
|
|
+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');
|
|
|
+SET @e8 := CASE
|
|
|
+ WHEN @t8<>1 THEN 'SELECT 1'
|
|
|
+ WHEN @u8 = 'tenant_id,Descr' THEN 'SELECT 1'
|
|
|
+ WHEN @u8 IS NULL THEN 'ALTER TABLE `PriorityCode` ADD UNIQUE INDEX `uk_PriorityCode_scope` (`tenant_id`,`Descr`)'
|
|
|
+ ELSE 'ALTER TABLE `PriorityCode` DROP INDEX `uk_PriorityCode_scope`, ADD UNIQUE INDEX `uk_PriorityCode_scope` (`tenant_id`,`Descr`)' END;
|
|
|
+PREPARE p8e FROM @e8; EXECUTE p8e; DEALLOCATE PREPARE p8e;
|
|
|
+
|
|
|
+-- [9/12] ado_s0_sales_order_priority_rule
|
|
|
+SET @t9 := (SELECT COUNT(*) FROM information_schema.TABLES WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='ado_s0_sales_order_priority_rule');
|
|
|
+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');
|
|
|
+SET @a9 := CASE WHEN @t9=1 AND @c9=0
|
|
|
+ THEN 'ALTER TABLE `ado_s0_sales_order_priority_rule` ADD COLUMN `tenant_id` BIGINT NULL COMMENT ''租户Id'''
|
|
|
+ ELSE 'SELECT 1' END;
|
|
|
+PREPARE p9a FROM @a9; EXECUTE p9a; DEALLOCATE PREPARE p9a;
|
|
|
+
|
|
|
+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');
|
|
|
+SET @b9 := CASE WHEN @t9=1 AND @i9=0
|
|
|
+ THEN 'ALTER TABLE `ado_s0_sales_order_priority_rule` ADD INDEX `idx_tenant` (`tenant_id`)'
|
|
|
+ ELSE 'SELECT 1' END;
|
|
|
+PREPARE p9b FROM @b9; EXECUTE p9b; DEALLOCATE PREPARE p9b;
|
|
|
+
|
|
|
+-- 回填:按 FactoryRefId 反查 SysOrg.TenantId(解析不出则保持 NULL)
|
|
|
+SET @d9 := CASE WHEN @t9=1
|
|
|
+ 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'
|
|
|
+ ELSE 'SELECT 1' END;
|
|
|
+PREPARE p9d FROM @d9; EXECUTE p9d; DEALLOCATE PREPARE p9d;
|
|
|
+
|
|
|
+-- ado_s0_sales_order_priority_rule 无业务唯一键,无需租户化。
|
|
|
+
|
|
|
+-- [10/12] S0ProductDesignCycle
|
|
|
+SET @t10 := (SELECT COUNT(*) FROM information_schema.TABLES WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='S0ProductDesignCycle');
|
|
|
+SET @c10 := (SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='S0ProductDesignCycle' AND COLUMN_NAME='tenant_id');
|
|
|
+SET @a10 := CASE WHEN @t10=1 AND @c10=0
|
|
|
+ THEN 'ALTER TABLE `S0ProductDesignCycle` ADD COLUMN `tenant_id` BIGINT NULL COMMENT ''租户Id'''
|
|
|
+ ELSE 'SELECT 1' END;
|
|
|
+PREPARE p10a FROM @a10; EXECUTE p10a; DEALLOCATE PREPARE p10a;
|
|
|
+
|
|
|
+SET @i10 := (SELECT COUNT(*) FROM information_schema.STATISTICS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='S0ProductDesignCycle' AND INDEX_NAME='idx_tenant');
|
|
|
+SET @b10 := CASE WHEN @t10=1 AND @i10=0
|
|
|
+ THEN 'ALTER TABLE `S0ProductDesignCycle` ADD INDEX `idx_tenant` (`tenant_id`)'
|
|
|
+ ELSE 'SELECT 1' END;
|
|
|
+PREPARE p10b FROM @b10; EXECUTE p10b; DEALLOCATE PREPARE p10b;
|
|
|
+
|
|
|
+-- 回填:按 factory_ref_id 反查 SysOrg.TenantId(解析不出则保持 NULL)
|
|
|
+SET @d10 := CASE WHEN @t10=1
|
|
|
+ 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'
|
|
|
+ ELSE 'SELECT 1' END;
|
|
|
+PREPARE p10d FROM @d10; EXECUTE p10d; DEALLOCATE PREPARE p10d;
|
|
|
+
|
|
|
+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');
|
|
|
+SET @e10 := CASE
|
|
|
+ WHEN @t10<>1 THEN 'SELECT 1'
|
|
|
+ WHEN @u10 = 'tenant_id,factory_ref_id,item_type,owner_application' THEN 'SELECT 1'
|
|
|
+ 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`)'
|
|
|
+ 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;
|
|
|
+PREPARE p10e FROM @e10; EXECUTE p10e; DEALLOCATE PREPARE p10e;
|
|
|
+
|
|
|
+-- [11/12] S0CategoryLeadTime
|
|
|
+SET @t11 := (SELECT COUNT(*) FROM information_schema.TABLES WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='S0CategoryLeadTime');
|
|
|
+SET @c11 := (SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='S0CategoryLeadTime' AND COLUMN_NAME='tenant_id');
|
|
|
+SET @a11 := CASE WHEN @t11=1 AND @c11=0
|
|
|
+ THEN 'ALTER TABLE `S0CategoryLeadTime` ADD COLUMN `tenant_id` BIGINT NULL COMMENT ''租户Id'''
|
|
|
+ ELSE 'SELECT 1' END;
|
|
|
+PREPARE p11a FROM @a11; EXECUTE p11a; DEALLOCATE PREPARE p11a;
|
|
|
+
|
|
|
+SET @i11 := (SELECT COUNT(*) FROM information_schema.STATISTICS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='S0CategoryLeadTime' AND INDEX_NAME='idx_tenant');
|
|
|
+SET @b11 := CASE WHEN @t11=1 AND @i11=0
|
|
|
+ THEN 'ALTER TABLE `S0CategoryLeadTime` ADD INDEX `idx_tenant` (`tenant_id`)'
|
|
|
+ ELSE 'SELECT 1' END;
|
|
|
+PREPARE p11b FROM @b11; EXECUTE p11b; DEALLOCATE PREPARE p11b;
|
|
|
+
|
|
|
+-- 回填:按 factory_ref_id 反查 SysOrg.TenantId(解析不出则保持 NULL)
|
|
|
+SET @d11 := CASE WHEN @t11=1
|
|
|
+ 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'
|
|
|
+ ELSE 'SELECT 1' END;
|
|
|
+PREPARE p11d FROM @d11; EXECUTE p11d; DEALLOCATE PREPARE p11d;
|
|
|
+
|
|
|
+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');
|
|
|
+SET @e11 := CASE
|
|
|
+ WHEN @t11<>1 THEN 'SELECT 1'
|
|
|
+ WHEN @u11 = 'tenant_id,factory_ref_id,category_code,owner_application' THEN 'SELECT 1'
|
|
|
+ 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`)'
|
|
|
+ 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;
|
|
|
+PREPARE p11e FROM @e11; EXECUTE p11e; DEALLOCATE PREPARE p11e;
|
|
|
+
|
|
|
+-- [12/12] S0MaterialPlanCycle
|
|
|
+SET @t12 := (SELECT COUNT(*) FROM information_schema.TABLES WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='S0MaterialPlanCycle');
|
|
|
+SET @c12 := (SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='S0MaterialPlanCycle' AND COLUMN_NAME='tenant_id');
|
|
|
+SET @a12 := CASE WHEN @t12=1 AND @c12=0
|
|
|
+ THEN 'ALTER TABLE `S0MaterialPlanCycle` ADD COLUMN `tenant_id` BIGINT NULL COMMENT ''租户Id'''
|
|
|
+ ELSE 'SELECT 1' END;
|
|
|
+PREPARE p12a FROM @a12; EXECUTE p12a; DEALLOCATE PREPARE p12a;
|
|
|
+
|
|
|
+SET @i12 := (SELECT COUNT(*) FROM information_schema.STATISTICS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='S0MaterialPlanCycle' AND INDEX_NAME='idx_tenant');
|
|
|
+SET @b12 := CASE WHEN @t12=1 AND @i12=0
|
|
|
+ THEN 'ALTER TABLE `S0MaterialPlanCycle` ADD INDEX `idx_tenant` (`tenant_id`)'
|
|
|
+ ELSE 'SELECT 1' END;
|
|
|
+PREPARE p12b FROM @b12; EXECUTE p12b; DEALLOCATE PREPARE p12b;
|
|
|
+
|
|
|
+-- 回填:按 factory_ref_id 反查 SysOrg.TenantId(解析不出则保持 NULL)
|
|
|
+SET @d12 := CASE WHEN @t12=1
|
|
|
+ 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'
|
|
|
+ ELSE 'SELECT 1' END;
|
|
|
+PREPARE p12d FROM @d12; EXECUTE p12d; DEALLOCATE PREPARE p12d;
|
|
|
+
|
|
|
+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');
|
|
|
+SET @e12 := CASE
|
|
|
+ WHEN @t12<>1 THEN 'SELECT 1'
|
|
|
+ WHEN @u12 = 'tenant_id,factory_ref_id,order_type' THEN 'SELECT 1'
|
|
|
+ WHEN @u12 IS NULL THEN 'ALTER TABLE `S0MaterialPlanCycle` ADD UNIQUE INDEX `uk_S0MaterialPlanCycle_factory_ordertype` (`tenant_id`,`factory_ref_id`,`order_type`)'
|
|
|
+ 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;
|
|
|
+PREPARE p12e FROM @e12; EXECUTE p12e; DEALLOCATE PREPARE p12e;
|