1.0.551.verify.sql 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. -- 1.0.551.verify.sql
  2. -- P0-A 数据纠偏的执行后校验。返回单列 ok:1 = 全部断言通过,0 = 任一失败。
  3. -- 提交前随主脚本一并 rename 为 1.0.<next>.verify.sql 并注册 csproj Copy 条目。
  4. --
  5. -- V1 std 种群 A 归零且仅剩真实 PW
  6. -- V2 DWD 行数等于保全子集行数
  7. -- V3 po_no / po_line 无 NULL 且无空串
  8. -- V4 新唯一键下无重复
  9. -- V5 唯一键 DDL 真实存在且列序正确
  10. -- V6 租户守卫 CHECK 恰好一套、无语义重复
  11. -- V7 保全历史与迁移前子集完全一致
  12. -- V8 非法租户未混入
  13. SELECT CASE WHEN
  14. -- V1 · std:种群 A 归零
  15. (
  16. SELECT COUNT(*) FROM `mdp_std_process_outsource_order`
  17. WHERE `sync_batch_id` LIKE 'S3\_MDP\_%' AND `source_biz_key` NOT LIKE '%|%'
  18. AND `work_order` = '' AND `po_no` IS NULL AND `po_line` IS NULL
  19. ) = 0
  20. -- V1b · std:幸存者全部是真实 PW(biz_key 含管道符且 po_no 非空)
  21. AND (
  22. SELECT COUNT(*) FROM `mdp_std_process_outsource_order`
  23. WHERE `source_biz_key` NOT LIKE '%|%' OR IFNULL(`po_no`,'') = ''
  24. ) = 0
  25. -- V1c · std:幸存者数量必须大于 0(防止误把整表清空)
  26. AND (SELECT COUNT(*) FROM `mdp_std_process_outsource_order`) > 0
  27. -- V2 · DWD 行数 == 保全子集行数(迁移刚完成时,尚未跑新批次)
  28. AND (SELECT COUNT(*) FROM `dwd_process_outsource_delivery`)
  29. = (SELECT COUNT(*) FROM `dwd_process_outsource_delivery_keep_p0a`
  30. WHERE `tenant_id` NOT IN (0,1,1300000000001)
  31. AND IFNULL(`po_no`,'') <> '' AND IFNULL(`po_line`,'') <> '')
  32. -- V3 · NULL / 空串:收口后 po_no / po_line 既不为 NULL 也不为空串
  33. AND (SELECT COUNT(*) FROM `dwd_process_outsource_delivery` WHERE `po_no` IS NULL) = 0
  34. AND (SELECT COUNT(*) FROM `dwd_process_outsource_delivery` WHERE `po_line` IS NULL) = 0
  35. AND (SELECT COUNT(*) FROM `dwd_process_outsource_delivery` WHERE `po_no` = '') = 0
  36. AND (SELECT COUNT(*) FROM `dwd_process_outsource_delivery` WHERE `po_line` = '') = 0
  37. -- V3b · 列定义确已收口为 NOT NULL
  38. AND (
  39. SELECT COUNT(*) FROM information_schema.COLUMNS
  40. WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='dwd_process_outsource_delivery'
  41. AND COLUMN_NAME IN ('po_no','po_line') AND IS_NULLABLE='YES'
  42. ) = 0
  43. -- V4 · 新唯一键下无重复
  44. AND (
  45. SELECT COUNT(*) FROM (
  46. SELECT 1 FROM `dwd_process_outsource_delivery`
  47. GROUP BY `tenant_id`,`factory_id`,`stat_date`,`po_no`,`po_line`
  48. HAVING COUNT(*) > 1
  49. ) dup
  50. ) = 0
  51. -- V5 · 唯一键 DDL 存在、恰好 5 列、且列序完全正确
  52. AND (
  53. SELECT COUNT(*) FROM information_schema.STATISTICS
  54. WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='dwd_process_outsource_delivery'
  55. AND INDEX_NAME='uk_po_line_stat' AND NON_UNIQUE=0
  56. ) = 5
  57. AND (
  58. SELECT GROUP_CONCAT(COLUMN_NAME ORDER BY SEQ_IN_INDEX SEPARATOR ',')
  59. FROM information_schema.STATISTICS
  60. WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='dwd_process_outsource_delivery'
  61. AND INDEX_NAME='uk_po_line_stat'
  62. ) = 'tenant_id,factory_id,stat_date,po_no,po_line'
  63. -- V5b · 旧唯一键已移除(否则膨胀语义仍在)
  64. AND (
  65. SELECT COUNT(*) FROM information_schema.STATISTICS
  66. WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='dwd_process_outsource_delivery'
  67. AND INDEX_NAME='uk_work_op_stat'
  68. ) = 0
  69. -- V6 · 租户守卫 CHECK 恰好一套,且名字是稳定名(无语义重复)
  70. AND (
  71. SELECT COUNT(*) FROM information_schema.CHECK_CONSTRAINTS cc
  72. JOIN information_schema.TABLE_CONSTRAINTS tc
  73. ON tc.CONSTRAINT_SCHEMA=cc.CONSTRAINT_SCHEMA AND tc.CONSTRAINT_NAME=cc.CONSTRAINT_NAME
  74. WHERE tc.TABLE_SCHEMA=DATABASE() AND tc.TABLE_NAME='dwd_process_outsource_delivery'
  75. AND tc.CONSTRAINT_TYPE='CHECK'
  76. AND cc.CHECK_CLAUSE LIKE '%tenant_id%' AND cc.CHECK_CLAUSE LIKE '%1300000000001%'
  77. ) = 1
  78. AND (
  79. SELECT COUNT(*) FROM information_schema.TABLE_CONSTRAINTS
  80. WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='dwd_process_outsource_delivery'
  81. AND CONSTRAINT_TYPE='CHECK' AND CONSTRAINT_NAME='ck_dwd_process_outsource_valid_tenant'
  82. ) = 1
  83. -- V7 · 保全历史与迁移前子集完全一致(按业务键集合双向比对,差集为 0)
  84. AND (
  85. SELECT COUNT(*) FROM `dwd_process_outsource_delivery_keep_p0a` k
  86. WHERE k.`tenant_id` NOT IN (0,1,1300000000001)
  87. AND IFNULL(k.`po_no`,'') <> '' AND IFNULL(k.`po_line`,'') <> ''
  88. AND NOT EXISTS (
  89. SELECT 1 FROM `dwd_process_outsource_delivery` d
  90. WHERE d.`tenant_id`=k.`tenant_id` AND d.`factory_id`=k.`factory_id`
  91. AND d.`stat_date`=k.`stat_date` AND d.`po_no`=k.`po_no` AND d.`po_line`=k.`po_line`
  92. )
  93. ) = 0
  94. AND (
  95. SELECT COUNT(*) FROM `dwd_process_outsource_delivery` d
  96. WHERE NOT EXISTS (
  97. SELECT 1 FROM `dwd_process_outsource_delivery_keep_p0a` k
  98. WHERE k.`tenant_id`=d.`tenant_id` AND k.`factory_id`=d.`factory_id`
  99. AND k.`stat_date`=d.`stat_date` AND k.`po_no`=d.`po_no` AND k.`po_line`=d.`po_line`
  100. )
  101. ) = 0
  102. -- V8 · 非法租户未混入 DWD
  103. AND (SELECT COUNT(*) FROM `dwd_process_outsource_delivery` WHERE `tenant_id` IN (0,1,1300000000001)) = 0
  104. -- V9 · 元数据留证已写入,且记录了清理前的量级
  105. AND (
  106. SELECT COUNT(*) FROM `aidop_migration_derived_cleanup_log`
  107. WHERE `migration_version`='1.0.551' AND `table_name`='dwd_process_outsource_delivery'
  108. AND `estimated_rows` > 1000000
  109. ) = 1
  110. -- V10 · std 备份表存在且非空(回滚路径可用)
  111. AND (SELECT COUNT(*) FROM `mdp_std_process_outsource_order_bak_p0a`) > 0
  112. THEN 1 ELSE 0 END AS ok;