1.0.504.verify.sql 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. -- 1.0.504.verify.sql
  2. -- 契约(CURRENT.md > F-11,由 AutoVersionUpdate.RunVerifyScriptIfExists 逐条执行取首行首列判真):
  3. -- ① 禁止 SET @var(返回 null 即判失败)→ 一律内联子查询,每条语句自包含
  4. -- ② 每条返回「通过为真」的标量(用 = 期望值 得 1/0),不得返回错误条数
  5. -- ③ 一条语句一个断言,不用 UNION 汇总
  6. -- ④ 文件以最后一条 SQL 的分号结束,末尾不得残留 comment-only 块
  7. -- 本文件只做结构级断言:migration 执行时 dim 尚无数据,数据正确性由 S0DimReconciler 在刷新时验证。
  8. --
  9. -- 断言强度说明(Final Review 补强,勿弱化):
  10. -- · UK 一律断言「精确列序」而非列数——脚本用 CREATE TABLE IF NOT EXISTS,
  11. -- 若目标库已存在同名表但 UK 列不同,建表会静默 no-op,只数列数会放过结构漂移。
  12. -- · 字符串等值一律加 COLLATE utf8mb4_bin——表默认 utf8mb4_0900_ai_ci 大小写不敏感,
  13. -- 而 raw_data 的 JSON 路径大小写正是致命维度(货架若写成 PascalCase 会静默退化成 GUID)。
  14. SELECT (SELECT COUNT(*) FROM information_schema.TABLES
  15. WHERE TABLE_SCHEMA = DATABASE()
  16. AND TABLE_NAME IN ('mdp_stg_s0_work_center','mdp_stg_s0_department','mdp_stg_s0_location')) = 3;
  17. SELECT (SELECT COUNT(*) FROM information_schema.TABLES
  18. WHERE TABLE_SCHEMA = DATABASE()
  19. AND TABLE_NAME IN ('dim_work_center','dim_department','dim_location','dim_location_shelf')) = 4;
  20. SELECT IFNULL((SELECT GROUP_CONCAT(COLUMN_NAME ORDER BY SEQ_IN_INDEX)
  21. FROM information_schema.STATISTICS
  22. WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'mdp_stg_s0_work_center'
  23. AND INDEX_NAME = 'uk_stg_s0_work_center' AND NON_UNIQUE = 0), '')
  24. = 'tenant_id,source_system,source_table,source_row_id';
  25. SELECT IFNULL((SELECT GROUP_CONCAT(COLUMN_NAME ORDER BY SEQ_IN_INDEX)
  26. FROM information_schema.STATISTICS
  27. WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'mdp_stg_s0_department'
  28. AND INDEX_NAME = 'uk_stg_s0_department' AND NON_UNIQUE = 0), '')
  29. = 'tenant_id,source_system,source_table,source_row_id';
  30. SELECT IFNULL((SELECT GROUP_CONCAT(COLUMN_NAME ORDER BY SEQ_IN_INDEX)
  31. FROM information_schema.STATISTICS
  32. WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'mdp_stg_s0_location'
  33. AND INDEX_NAME = 'uk_stg_s0_location' AND NON_UNIQUE = 0), '')
  34. = 'tenant_id,source_system,source_table,source_row_id';
  35. SELECT IFNULL((SELECT GROUP_CONCAT(COLUMN_NAME ORDER BY SEQ_IN_INDEX)
  36. FROM information_schema.STATISTICS
  37. WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'dim_work_center'
  38. AND INDEX_NAME = 'uk_dim_work_center' AND NON_UNIQUE = 0), '')
  39. = 'tenant_id,domain_code,work_center_code';
  40. SELECT IFNULL((SELECT GROUP_CONCAT(COLUMN_NAME ORDER BY SEQ_IN_INDEX)
  41. FROM information_schema.STATISTICS
  42. WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'dim_department'
  43. AND INDEX_NAME = 'uk_dim_department' AND NON_UNIQUE = 0), '')
  44. = 'tenant_id,domain_code,department_code';
  45. SELECT IFNULL((SELECT GROUP_CONCAT(COLUMN_NAME ORDER BY SEQ_IN_INDEX)
  46. FROM information_schema.STATISTICS
  47. WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'dim_location'
  48. AND INDEX_NAME = 'uk_dim_location' AND NON_UNIQUE = 0), '')
  49. = 'tenant_id,domain_code,location_code';
  50. SELECT IFNULL((SELECT GROUP_CONCAT(COLUMN_NAME ORDER BY SEQ_IN_INDEX)
  51. FROM information_schema.STATISTICS
  52. WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'dim_location_shelf'
  53. AND INDEX_NAME = 'uk_dim_location_shelf' AND NON_UNIQUE = 0), '')
  54. = 'tenant_id,domain_code,location_code,shelf_code';
  55. SELECT (SELECT COUNT(*) FROM information_schema.COLUMNS
  56. WHERE TABLE_SCHEMA = DATABASE()
  57. AND TABLE_NAME IN ('dim_work_center','dim_department','dim_location','dim_location_shelf')
  58. AND COLUMN_NAME = 'tenant_id' AND IS_NULLABLE = 'NO') = 4;
  59. SELECT (SELECT COUNT(*) FROM information_schema.COLUMNS
  60. WHERE TABLE_SCHEMA = DATABASE()
  61. AND TABLE_NAME IN ('mdp_stg_s0_work_center','mdp_stg_s0_department','mdp_stg_s0_location')
  62. AND COLUMN_NAME = 'tenant_id' AND IS_NULLABLE = 'NO') = 3;
  63. SELECT (SELECT COUNT(*) FROM information_schema.COLUMNS
  64. WHERE TABLE_SCHEMA = DATABASE()
  65. AND TABLE_NAME IN ('mdp_stg_s0_work_center','mdp_stg_s0_department','mdp_stg_s0_location')
  66. AND COLUMN_NAME = 'source_biz_key' AND CHARACTER_MAXIMUM_LENGTH = 300) = 3;
  67. SELECT (SELECT COUNT(*) FROM `mdp_entity`
  68. WHERE `entity_code` IN ('S0_WORK_CENTER','S0_DEPARTMENT','S0_LOCATION','S0_LOCATION_SHELF')
  69. AND `status` = 1 AND `sync_mode` = 'FULL' AND `incr_column` IS NULL) = 4;
  70. SELECT (SELECT COUNT(*) FROM `mdp_entity` e JOIN `mdp_source` s ON s.`id` = e.`source_id`
  71. WHERE e.`entity_code` IN ('S0_WORK_CENTER','S0_DEPARTMENT','S0_LOCATION','S0_LOCATION_SHELF')
  72. AND s.`source_code` = 'AIDOPDEV_MYSQL') = 4;
  73. SELECT (SELECT COUNT(*) FROM `mdp_entity`
  74. WHERE `entity_code` = 'S0_WORK_CENTER'
  75. AND `biz_key_expr` COLLATE utf8mb4_bin = 'Domain,WorkCtr'
  76. AND `source_table_name` COLLATE utf8mb4_bin = 'WorkCtrMaster'
  77. AND `target_table_name` COLLATE utf8mb4_bin = 'mdp_stg_s0_work_center') = 1;
  78. SELECT (SELECT COUNT(*) FROM `mdp_entity`
  79. WHERE `entity_code` = 'S0_DEPARTMENT'
  80. AND `biz_key_expr` COLLATE utf8mb4_bin = 'Domain,Department'
  81. AND `source_table_name` COLLATE utf8mb4_bin = 'DepartmentMaster'
  82. AND `target_table_name` COLLATE utf8mb4_bin = 'mdp_stg_s0_department') = 1;
  83. SELECT (SELECT COUNT(*) FROM `mdp_entity`
  84. WHERE `entity_code` = 'S0_LOCATION'
  85. AND `biz_key_expr` COLLATE utf8mb4_bin = 'Domain,location'
  86. AND `source_table_name` COLLATE utf8mb4_bin = 'LocationMaster'
  87. AND `target_table_name` COLLATE utf8mb4_bin = 'mdp_stg_s0_location') = 1;
  88. SELECT (SELECT COUNT(*) FROM `mdp_entity`
  89. WHERE `entity_code` = 'S0_LOCATION_SHELF'
  90. AND `biz_key_expr` COLLATE utf8mb4_bin = 'domain_code,location,inv_shelf'
  91. AND `source_table_name` COLLATE utf8mb4_bin = 'LocationShelfMaster'
  92. AND `target_table_name` COLLATE utf8mb4_bin = 'mdp_stg_s0_location') = 1;
  93. SELECT (SELECT COUNT(*) FROM `mdp_entity`
  94. WHERE `target_table_name` = 'mdp_stg_location'
  95. AND `entity_code` LIKE 'S0\_%') = 0;