1.0.513.verify.sql 4.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. -- WIP-C3B.verify.sql
  2. SELECT (SELECT COUNT(*) FROM information_schema.TABLES WHERE TABLE_SCHEMA = DATABASE()
  3. AND TABLE_NAME IN ('mdp_stg_s0_item_bom','bridge_item_bom',
  4. 'mdp_stg_s0_item_substitute','bridge_item_substitute')) = 4;
  5. SELECT IFNULL((SELECT GROUP_CONCAT(COLUMN_NAME ORDER BY SEQ_IN_INDEX) FROM information_schema.STATISTICS
  6. WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'bridge_item_bom'
  7. AND INDEX_NAME = 'uk_bridge_item_bom' AND NON_UNIQUE = 0), '')
  8. = 'tenant_id,item_code,component_item_code';
  9. SELECT IFNULL((SELECT GROUP_CONCAT(COLUMN_NAME ORDER BY SEQ_IN_INDEX) FROM information_schema.STATISTICS
  10. WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'bridge_item_substitute'
  11. AND INDEX_NAME = 'uk_bridge_item_substitute' AND NON_UNIQUE = 0), '')
  12. = 'tenant_id,parent_item_code,item_code,substitute_item_code';
  13. -- 父键列名必须逐字 item_code
  14. SELECT (SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE()
  15. AND TABLE_NAME IN ('bridge_item_bom','bridge_item_substitute') AND COLUMN_NAME = 'item_code') = 2;
  16. -- 🔴 legacy 代理键绝不能进唯一键(跨租户泄漏向量)
  17. SELECT (SELECT COUNT(*) FROM information_schema.STATISTICS WHERE TABLE_SCHEMA = DATABASE()
  18. AND INDEX_NAME = 'uk_bridge_item_bom'
  19. AND COLUMN_NAME IN ('legacy_parent_item_id','legacy_component_item_id',
  20. 'company_id','factory_id')) = 0;
  21. -- 但它们必须作为技术属性存在(供 legacy 对账),且带租户前缀的索引才可安全反查
  22. SELECT (SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE()
  23. AND TABLE_NAME = 'bridge_item_bom'
  24. AND COLUMN_NAME IN ('legacy_parent_item_id','legacy_component_item_id')) = 2;
  25. -- 🔴 bit(1) 且含 NULL 的 IsActive 绝不能被物化;其余零信息列同理
  26. SELECT (SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE()
  27. AND TABLE_NAME = 'bridge_item_bom'
  28. AND COLUMN_NAME IN ('is_active','is_enabled','sequence_num','structure_type',
  29. 'line_op','remark','start_eff','end_eff')) = 0;
  30. -- Dec 精度必须与源逐位一致
  31. SELECT (SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE()
  32. AND TABLE_NAME = 'bridge_item_bom'
  33. AND COLUMN_NAME IN ('qty','scrap','qty_consumed','qty_exchanged')
  34. AND NUMERIC_PRECISION = 18 AND NUMERIC_SCALE = 5) = 4;
  35. SELECT (SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE()
  36. AND TABLE_NAME = 'bridge_item_substitute'
  37. AND COLUMN_NAME = 'substitute_qty' AND NUMERIC_PRECISION = 18 AND NUMERIC_SCALE = 6) = 1;
  38. -- 三个 item 引用必须都在替代料桥里
  39. SELECT (SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE()
  40. AND TABLE_NAME = 'bridge_item_substitute'
  41. AND COLUMN_NAME IN ('parent_item_code','item_code','substitute_item_code')) = 3;
  42. SELECT (SELECT COUNT(*) FROM `mdp_entity`
  43. WHERE `entity_code` = 'S0_ITEM_BOM'
  44. AND `biz_key_expr` COLLATE utf8mb4_bin = 'ParentItem,ComponentItem'
  45. AND `source_table_name` COLLATE utf8mb4_bin = 'ProductStructureMaster'
  46. AND `target_table_name` COLLATE utf8mb4_bin = 'mdp_stg_s0_item_bom'
  47. AND `status` = 1 AND `sync_mode` = 'FULL' AND `incr_column` IS NULL
  48. AND `batch_size` = 200000) = 1;
  49. SELECT (SELECT COUNT(*) FROM `mdp_entity`
  50. WHERE `entity_code` = 'S0_ITEM_SUBSTITUTE'
  51. AND `biz_key_expr` COLLATE utf8mb4_bin = 'ParentItem,ItemNum,SubstituteItem'
  52. AND `source_table_name` COLLATE utf8mb4_bin = 'ItemSubstituteDetail'
  53. AND `target_table_name` COLLATE utf8mb4_bin = 'mdp_stg_s0_item_substitute'
  54. AND `status` = 1 AND `sync_mode` = 'FULL' AND `incr_column` IS NULL
  55. AND `batch_size` = 5000) = 1;
  56. -- batch_size 必须够装下最大租户
  57. SELECT (SELECT `batch_size` FROM `mdp_entity` WHERE `entity_code` = 'S0_ITEM_BOM')
  58. > (SELECT MAX(c) FROM (SELECT COUNT(*) c FROM `ProductStructureMaster` GROUP BY `tenant_id`) x);
  59. -- 源侧身份前提:tenant+ParentItem+ComponentItem 无重复
  60. SELECT (SELECT COUNT(*) FROM (SELECT 1 FROM `ProductStructureMaster`
  61. GROUP BY `tenant_id`,`ParentItem`,`ComponentItem` HAVING COUNT(*) > 1) x) = 0;