1.0.525.verify.sql 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. -- 1.0.525.verify.sql — 每条 SELECT 都必须返回真值(0 或 NULL 即判失败并中断启动)
  2. --
  3. -- 与 1.0.521.verify 同法:正向断言「该清的清干净了」,反向断言「不该清的一行没少」。
  4. -- 反向断言不是可选的 —— 一个把整张表删空的脚本同样能让正向断言全过。
  5. -- ① 两个正式实体已切到 FULL,且不再带增量水位。
  6. -- incr_column 必须为空:只要它还在,MdpDbPullExecutor 就会发射游标谓词,
  7. -- 产出的批次就是「只含变更行」的部分批次,按批次淘汰会误删存量。
  8. SELECT COUNT(*) = 2
  9. FROM mdp_entity
  10. WHERE entity_code IN ('S3_PURCHASE_ORDER_MASTER', 'S3_PURCHASE_ORDER_DETAIL')
  11. AND sync_mode = 'FULL'
  12. AND incr_column IS NULL;
  13. -- ② 标准层里不再有源侧已不存在的采购订单行(限定源表里确实有该租户数据)。
  14. SELECT COUNT(*) = 0
  15. FROM mdp_std_purchase_order s
  16. WHERE EXISTS (SELECT 1 FROM PurOrdDetail g WHERE g.tenant_id = s.tenant_id)
  17. AND NOT EXISTS (
  18. SELECT 1 FROM PurOrdDetail d
  19. WHERE d.tenant_id = s.tenant_id
  20. AND d.PurOrd = s.po_no
  21. AND CAST(d.Line AS CHAR) = s.po_line);
  22. -- ③ 反向断言:源侧存在的采购订单行**一行都没被删掉**。
  23. -- 只有正向断言的话,「把整张表删空」也能通过 ②。
  24. SELECT COUNT(*) = 0
  25. FROM PurOrdDetail d
  26. JOIN PurOrdMaster m ON m.RecID = d.PurOrdRecID AND m.tenant_id = d.tenant_id
  27. WHERE EXISTS (SELECT 1 FROM mdp_std_purchase_order x WHERE x.tenant_id = d.tenant_id)
  28. AND NOT EXISTS (
  29. SELECT 1 FROM mdp_std_purchase_order s
  30. WHERE s.tenant_id = d.tenant_id
  31. AND s.po_no = d.PurOrd
  32. AND s.po_line = CAST(d.Line AS CHAR));
  33. -- ④ 每租户的当前 DWD 快照里,不再有失去标准层依据的行。
  34. SELECT COUNT(*) = 0
  35. FROM dwd_supplier_delivery w
  36. JOIN (SELECT tenant_id, MAX(stat_date) AS latest_stat_date
  37. FROM dwd_supplier_delivery GROUP BY tenant_id) t
  38. ON t.tenant_id = w.tenant_id AND t.latest_stat_date = w.stat_date
  39. WHERE NOT EXISTS (
  40. SELECT 1 FROM mdp_std_purchase_order s
  41. WHERE s.tenant_id = w.tenant_id AND s.po_no = w.po_no AND s.po_line = w.po_line);
  42. -- ⑤ 反向断言:当前快照没有被删空 —— 至少还有一个租户留着行。
  43. -- 若源侧确实全空,本条会失败;届时应人工确认属实后再放行,
  44. -- 而不是把它删掉。宁可多一次人工确认,也不要让「删空」静默通过。
  45. SELECT COUNT(*) > 0
  46. FROM dwd_supplier_delivery w
  47. JOIN (SELECT tenant_id, MAX(stat_date) AS latest_stat_date
  48. FROM dwd_supplier_delivery GROUP BY tenant_id) t
  49. ON t.tenant_id = w.tenant_id AND t.latest_stat_date = w.stat_date;