-- 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;