1.0.521.verify.sql 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. -- 1.0.521.verify.sql — 每条 SELECT 都必须返回 1
  2. -- ── ① 两个销售订单实体已声明为 FULL(这是「最新批次 = 源侧现存」成立的前提)──────────
  3. SELECT (SELECT COUNT(*) FROM `mdp_entity`
  4. WHERE `entity_code` IN ('S1_SEORDER','S1_SEORDER_ENTRY')
  5. AND `sync_mode` = 'FULL') = 2;
  6. -- 声明为 FULL 后不得再残留增量水位列,否则语义自相矛盾
  7. SELECT (SELECT COUNT(*) FROM `mdp_entity`
  8. WHERE `entity_code` IN ('S1_SEORDER','S1_SEORDER_ENTRY')
  9. AND `incr_column` IS NOT NULL) = 0;
  10. -- ── ② 标准层不得再有「不在贴源最新批次里」的订单行(孤儿已清空)────────────────────
  11. -- 与迁移同一判据,且同样带「该租户贴源确实有数据」的闸门。
  12. SELECT (SELECT COUNT(*) FROM `mdp_std_so` s
  13. WHERE s.`source_table` = 'crm_seorderentry'
  14. AND EXISTS (SELECT 1 FROM `mdp_stg_so` g
  15. WHERE g.`source_table` = 'crm_seorderentry'
  16. AND g.`tenant_id` = s.`tenant_id`)
  17. AND NOT EXISTS (
  18. SELECT 1 FROM `mdp_stg_so` lb
  19. WHERE lb.`source_table` = 'crm_seorderentry'
  20. AND lb.`tenant_id` = s.`tenant_id`
  21. AND lb.`source_biz_key` = s.`source_biz_key`
  22. AND lb.`sync_batch_id` = (SELECT x.`sync_batch_id` FROM `mdp_stg_so` x
  23. WHERE x.`source_table` = 'crm_seorderentry'
  24. AND x.`tenant_id` = s.`tenant_id`
  25. ORDER BY x.`sync_time` DESC, x.`id` DESC
  26. LIMIT 1))) = 0;
  27. -- ── ③ 清理不得误伤:贴源最新批次里的行必须都还在标准层 ──────────────────────────────
  28. -- 反向断言,防止「把孤儿连同存活行一起删干净」也能通过 ② 的情况。
  29. SELECT (SELECT COUNT(*) FROM `mdp_stg_so` lb
  30. WHERE lb.`source_table` = 'crm_seorderentry'
  31. AND lb.`sync_batch_id` = (SELECT x.`sync_batch_id` FROM `mdp_stg_so` x
  32. WHERE x.`source_table` = 'crm_seorderentry'
  33. AND x.`tenant_id` = lb.`tenant_id`
  34. ORDER BY x.`sync_time` DESC, x.`id` DESC
  35. LIMIT 1)
  36. AND IFNULL(JSON_UNQUOTE(JSON_EXTRACT(lb.`raw_data`,'$.bill_no')),'') <> ''
  37. AND NOT EXISTS (SELECT 1 FROM `mdp_std_so` s
  38. WHERE s.`source_table` = 'crm_seorderentry'
  39. AND s.`tenant_id` = lb.`tenant_id`
  40. AND s.`source_biz_key` = lb.`source_biz_key`)) = 0;
  41. -- ── ④ 标准层的唯一键未被本批动过(隔离列必须仍在)──────────────────────────────────
  42. SELECT IFNULL((SELECT GROUP_CONCAT(COLUMN_NAME ORDER BY SEQ_IN_INDEX)
  43. FROM information_schema.STATISTICS
  44. WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'mdp_std_so'
  45. AND INDEX_NAME = 'uk_source_key' AND NON_UNIQUE = 0), '')
  46. = 'tenant_id,source_system,source_table,source_biz_key';