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