1.0.512.verify.sql 5.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. -- WIP-C3A.verify.sql
  2. -- 契约(CURRENT.md > F-11):禁 SET @var · 每条返回 1/0 · 一条一断言 · 末条为真 SELECT。
  3. SELECT (SELECT COUNT(*) FROM information_schema.TABLES WHERE TABLE_SCHEMA = DATABASE()
  4. AND TABLE_NAME IN ('mdp_stg_s0_item_op_line','bridge_item_op_line',
  5. 'mdp_stg_s0_item_routing_op','bridge_item_routing_op')) = 4;
  6. SELECT IFNULL((SELECT GROUP_CONCAT(COLUMN_NAME ORDER BY SEQ_IN_INDEX) FROM information_schema.STATISTICS
  7. WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'bridge_item_op_line'
  8. AND INDEX_NAME = 'uk_bridge_item_op_line' AND NON_UNIQUE = 0), '')
  9. = 'tenant_id,item_code,operation_no,line_code';
  10. SELECT IFNULL((SELECT GROUP_CONCAT(COLUMN_NAME ORDER BY SEQ_IN_INDEX) FROM information_schema.STATISTICS
  11. WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'bridge_item_routing_op'
  12. AND INDEX_NAME = 'uk_bridge_item_routing_op' AND NON_UNIQUE = 0), '')
  13. = 'tenant_id,item_code,operation_code';
  14. -- 父键列名必须逐字是 item_code:OrphanFromWhere 用 p.<col> <=> d.<col> 同名列 join
  15. SELECT (SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE()
  16. AND TABLE_NAME IN ('bridge_item_op_line','bridge_item_routing_op')
  17. AND COLUMN_NAME = 'item_code') = 2;
  18. SELECT (SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE()
  19. AND TABLE_NAME IN ('bridge_item_op_line','bridge_item_routing_op')
  20. AND COLUMN_NAME IN ('item_num','dim_item_id','parent_id')) = 0;
  21. -- LEGACY_SCOPE 绝不进唯一键
  22. SELECT (SELECT COUNT(*) FROM information_schema.STATISTICS WHERE TABLE_SCHEMA = DATABASE()
  23. AND INDEX_NAME IN ('uk_bridge_item_op_line','uk_bridge_item_routing_op')
  24. AND COLUMN_NAME IN ('domain_code','company_id','factory_id','work_center_code','route_code')) = 0;
  25. -- 影子列绝不能出现在目标表
  26. SELECT (SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE()
  27. AND TABLE_NAME = 'bridge_item_op_line'
  28. AND COLUMN_NAME IN ('internal_equipment_type_code')) = 0;
  29. SELECT (SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE()
  30. AND TABLE_NAME = 'bridge_item_op_line'
  31. AND COLUMN_NAME = 'internal_equipment_code') = 1;
  32. -- 不可物化的列绝不能出现在目标表
  33. SELECT (SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE()
  34. AND TABLE_NAME = 'bridge_item_routing_op'
  35. AND COLUMN_NAME IN ('milestone_operation','milestone_op','is_active','is_enabled',
  36. 'routing_code','descr','op')) = 0;
  37. -- Dec 精度必须与源逐位一致:op_line 五列 (18,6)
  38. SELECT (SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE()
  39. AND TABLE_NAME = 'bridge_item_op_line'
  40. AND COLUMN_NAME IN ('rate','setup_time','overlap_time','sequence_no','standard_staff_count')
  41. AND NUMERIC_PRECISION = 18 AND NUMERIC_SCALE = 6) = 5;
  42. -- routing_op:UDeci* 是 (18,5),run_time 是 (18,6),不得统一
  43. SELECT (SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE()
  44. AND TABLE_NAME = 'bridge_item_routing_op'
  45. AND COLUMN_NAME IN ('udeci1','udeci2','udeci3','udeci4','udeci5')
  46. AND NUMERIC_PRECISION = 18 AND NUMERIC_SCALE = 5) = 5;
  47. SELECT (SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE()
  48. AND TABLE_NAME = 'bridge_item_routing_op'
  49. AND COLUMN_NAME = 'run_time' AND NUMERIC_PRECISION = 18 AND NUMERIC_SCALE = 6) = 1;
  50. -- run_crew 在本桥是字符串(源 varchar(8)),不得建成 decimal
  51. SELECT (SELECT DATA_TYPE FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE()
  52. AND TABLE_NAME = 'bridge_item_op_line' AND COLUMN_NAME = 'run_crew') = 'varchar';
  53. -- domain_code 在 routing_op 必须可空(RecID=106435 那行 Domain 为 NULL)
  54. SELECT (SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE()
  55. AND TABLE_NAME = 'bridge_item_routing_op'
  56. AND COLUMN_NAME = 'domain_code' AND IS_NULLABLE = 'YES') = 1;
  57. -- mdp_entity 契约:biz_key_expr 须与 SourceBizKeyColumns 逐字一致(AssertEntityContractAsync 硬比对)
  58. SELECT (SELECT COUNT(*) FROM `mdp_entity`
  59. WHERE `entity_code` = 'S0_ITEM_OP_LINE'
  60. AND `biz_key_expr` COLLATE utf8mb4_bin = 'Part,Op,Line'
  61. AND `source_table_name` COLLATE utf8mb4_bin = 'ProdLineDetail'
  62. AND `target_table_name` COLLATE utf8mb4_bin = 'mdp_stg_s0_item_op_line'
  63. AND `status` = 1 AND `sync_mode` = 'FULL' AND `incr_column` IS NULL
  64. AND `batch_size` = 20000) = 1;
  65. SELECT (SELECT COUNT(*) FROM `mdp_entity`
  66. WHERE `entity_code` = 'S0_ITEM_ROUTING_OP'
  67. AND `biz_key_expr` COLLATE utf8mb4_bin = 'MaterialCode,OperationCode'
  68. AND `source_table_name` COLLATE utf8mb4_bin = 'RoutingOpDetail'
  69. AND `target_table_name` COLLATE utf8mb4_bin = 'mdp_stg_s0_item_routing_op'
  70. AND `status` = 1 AND `sync_mode` = 'FULL' AND `incr_column` IS NULL
  71. AND `batch_size` = 100000) = 1;
  72. -- batch_size 必须够装下最大租户(AssertNoSourceDuplicateAsync 是 >= 严格判定)
  73. SELECT (SELECT `batch_size` FROM `mdp_entity` WHERE `entity_code` = 'S0_ITEM_OP_LINE')
  74. > (SELECT MAX(c) FROM (SELECT COUNT(*) c FROM `ProdLineDetail` GROUP BY `tenant_id`) x);
  75. SELECT (SELECT `batch_size` FROM `mdp_entity` WHERE `entity_code` = 'S0_ITEM_ROUTING_OP')
  76. > (SELECT MAX(c) FROM (SELECT COUNT(*) c FROM `RoutingOpDetail` GROUP BY `tenant_id`) x);
  77. -- 未因本批放大其它 entity 的 batch_size
  78. SELECT (SELECT COUNT(*) FROM `mdp_entity` WHERE `entity_code` LIKE 'S0\_%'
  79. AND `batch_size` NOT IN (5000, 20000, 50000, 100000)) = 0;