1.0.554.verify.sql 5.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. -- ============================================================================
  2. -- 1.0.554.verify.sql · R2-A 执行后校验
  3. -- 返回单列 ok:1 = 全部断言通过,0 = 任一失败。
  4. --
  5. -- V1 inbound_enabled = tinyint / NOT NULL / DEFAULT 0
  6. -- V2 inbound_max_rows = int / NOT NULL / DEFAULT 500
  7. -- V3 stale_guard_enabled = tinyint / NOT NULL / DEFAULT 1
  8. -- V4 三列无 NULL(NOT NULL 语义未被削弱)
  9. -- V5 值域合法:inbound_enabled / stale_guard_enabled ∈ {0,1}
  10. -- V6 drift 计数为 0(与 migration 同口径,NULL-safe <=>)
  11. -- V7 uk_inbound_grant 仍存在且列序正确(1.0.553 产物,本批只读回归)
  12. -- V8 R2-B 对象未被本批触碰(列数守恒)
  13. -- V9 P0 对象未被触碰(UK 列序 / CHECK / po_no·po_line NOT NULL)
  14. -- V10 mdp_entity 仍有行(ALTER 未清空表)
  15. --
  16. -- 注:不比对 COLUMN_COMMENT —— 注释不属于功能契约,且会与 CodeFirst 的
  17. -- 注释同步互踩,纳入比对会造成假失败。
  18. -- ============================================================================
  19. SELECT CASE WHEN
  20. -- V1 · inbound_enabled
  21. (SELECT COUNT(*) FROM information_schema.`COLUMNS`
  22. WHERE `TABLE_SCHEMA` = DATABASE() AND `TABLE_NAME` = 'mdp_entity'
  23. AND `COLUMN_NAME` = 'inbound_enabled'
  24. AND `COLUMN_TYPE` = 'tinyint' AND `IS_NULLABLE` = 'NO'
  25. AND `COLUMN_DEFAULT` <=> '0') = 1
  26. -- V2 · inbound_max_rows(类型本就是 int,本批只补 DEFAULT)
  27. AND (SELECT COUNT(*) FROM information_schema.`COLUMNS`
  28. WHERE `TABLE_SCHEMA` = DATABASE() AND `TABLE_NAME` = 'mdp_entity'
  29. AND `COLUMN_NAME` = 'inbound_max_rows'
  30. AND `COLUMN_TYPE` = 'int' AND `IS_NULLABLE` = 'NO'
  31. AND `COLUMN_DEFAULT` <=> '500') = 1
  32. -- V3 · stale_guard_enabled
  33. AND (SELECT COUNT(*) FROM information_schema.`COLUMNS`
  34. WHERE `TABLE_SCHEMA` = DATABASE() AND `TABLE_NAME` = 'mdp_entity'
  35. AND `COLUMN_NAME` = 'stale_guard_enabled'
  36. AND `COLUMN_TYPE` = 'tinyint' AND `IS_NULLABLE` = 'NO'
  37. AND `COLUMN_DEFAULT` <=> '1') = 1
  38. -- V4 · 三列无 NULL
  39. AND (SELECT COUNT(*) FROM `mdp_entity`
  40. WHERE `inbound_enabled` IS NULL
  41. OR `inbound_max_rows` IS NULL
  42. OR `stale_guard_enabled` IS NULL) = 0
  43. -- V5 · 值域合法
  44. AND (SELECT COUNT(*) FROM `mdp_entity` WHERE `inbound_enabled` NOT IN (0, 1)) = 0
  45. AND (SELECT COUNT(*) FROM `mdp_entity` WHERE `stale_guard_enabled` NOT IN (0, 1)) = 0
  46. -- V6 · drift 归零(与 migration Step 1/3 同口径)
  47. AND (SELECT COUNT(*) FROM information_schema.`COLUMNS`
  48. WHERE `TABLE_SCHEMA` = DATABASE() AND `TABLE_NAME` = 'mdp_entity' AND (
  49. (`COLUMN_NAME` = 'inbound_enabled'
  50. AND NOT (`COLUMN_TYPE` = 'tinyint' AND `IS_NULLABLE` = 'NO' AND `COLUMN_DEFAULT` <=> '0'))
  51. OR (`COLUMN_NAME` = 'inbound_max_rows'
  52. AND NOT (`COLUMN_TYPE` = 'int' AND `IS_NULLABLE` = 'NO' AND `COLUMN_DEFAULT` <=> '500'))
  53. OR (`COLUMN_NAME` = 'stale_guard_enabled'
  54. AND NOT (`COLUMN_TYPE` = 'tinyint' AND `IS_NULLABLE` = 'NO' AND `COLUMN_DEFAULT` <=> '1'))
  55. )) = 0
  56. -- V7 · uk_inbound_grant 回归(1.0.553 产物;NON_UNIQUE=0 数的是索引列数=2)
  57. AND (SELECT COUNT(*) FROM information_schema.`STATISTICS`
  58. WHERE `TABLE_SCHEMA` = DATABASE() AND `TABLE_NAME` = 'mdp_inbound_grant'
  59. AND `INDEX_NAME` = 'uk_inbound_grant' AND `NON_UNIQUE` = 0) = 2
  60. AND (SELECT GROUP_CONCAT(`COLUMN_NAME` ORDER BY `SEQ_IN_INDEX` SEPARATOR ',')
  61. FROM information_schema.`STATISTICS`
  62. WHERE `TABLE_SCHEMA` = DATABASE() AND `TABLE_NAME` = 'mdp_inbound_grant'
  63. AND `INDEX_NAME` = 'uk_inbound_grant') = 'access_key,entity_code'
  64. -- V8 · R2-B 对象未被触碰(列数守恒,取自审计基线)
  65. AND (SELECT COUNT(*) FROM information_schema.`COLUMNS`
  66. WHERE `TABLE_SCHEMA` = DATABASE() AND `TABLE_NAME` = 'mdp_inbound_grant') = 13
  67. AND (SELECT COUNT(*) FROM information_schema.`COLUMNS`
  68. WHERE `TABLE_SCHEMA` = DATABASE() AND `TABLE_NAME` = 'mdp_inbound_request') = 21
  69. AND (SELECT COUNT(*) FROM information_schema.`COLUMNS`
  70. WHERE `TABLE_SCHEMA` = DATABASE() AND `TABLE_NAME` = 'mdp_inbound_envelope') = 10
  71. AND (SELECT COUNT(*) FROM information_schema.`COLUMNS`
  72. WHERE `TABLE_SCHEMA` = DATABASE() AND `TABLE_NAME` = 'mdp_field_map') = 10
  73. -- V9 · P0 对象未被触碰
  74. AND (SELECT GROUP_CONCAT(`COLUMN_NAME` ORDER BY `SEQ_IN_INDEX` SEPARATOR ',')
  75. FROM information_schema.`STATISTICS`
  76. WHERE `TABLE_SCHEMA` = DATABASE() AND `TABLE_NAME` = 'dwd_process_outsource_delivery'
  77. AND `INDEX_NAME` = 'uk_po_line_stat') = 'tenant_id,factory_id,stat_date,po_no,po_line'
  78. AND (SELECT COUNT(*) FROM information_schema.`TABLE_CONSTRAINTS`
  79. WHERE `TABLE_SCHEMA` = DATABASE() AND `TABLE_NAME` = 'dwd_process_outsource_delivery'
  80. AND `CONSTRAINT_TYPE` = 'CHECK'
  81. AND `CONSTRAINT_NAME` = 'ck_dwd_process_outsource_valid_tenant') = 1
  82. AND (SELECT COUNT(*) FROM information_schema.`COLUMNS`
  83. WHERE `TABLE_SCHEMA` = DATABASE() AND `TABLE_NAME` = 'dwd_process_outsource_delivery'
  84. AND `COLUMN_NAME` IN ('po_no', 'po_line') AND `IS_NULLABLE` = 'YES') = 0
  85. -- V10 · mdp_entity 仍有行(ALTER 未清空表)
  86. AND (SELECT COUNT(*) FROM `mdp_entity`) > 0
  87. THEN 1 ELSE 0 END AS ok;