1.0.506.verify.sql 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. -- 1.0.506.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. -- 断言强度沿用 Phase 1 Final Review 的补强结论,勿弱化:
  10. -- · UK 一律断言「精确列序」而非列数(CREATE TABLE IF NOT EXISTS 对已存在表静默 no-op,
  11. -- 只数列数会放过结构漂移)。
  12. -- · 字符串等值一律加 COLLATE utf8mb4_bin(表默认 utf8mb4_0900_ai_ci 大小写不敏感,
  13. -- 而 biz_key_expr 的大小写正是致命维度:写错即静默退化成 source_row_id)。
  14. SELECT (SELECT COUNT(*) FROM information_schema.TABLES
  15. WHERE TABLE_SCHEMA = DATABASE()
  16. AND TABLE_NAME IN ('mdp_stg_s0_employee','mdp_stg_s0_line')) = 2;
  17. SELECT (SELECT COUNT(*) FROM information_schema.TABLES
  18. WHERE TABLE_SCHEMA = DATABASE()
  19. AND TABLE_NAME IN ('dim_employee','dim_line')) = 2;
  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_employee'
  23. AND INDEX_NAME = 'uk_stg_s0_employee' 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_line'
  28. AND INDEX_NAME = 'uk_stg_s0_line' 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 = 'dim_employee'
  33. AND INDEX_NAME = 'uk_dim_employee' AND NON_UNIQUE = 0), '')
  34. = 'tenant_id,employee_code';
  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_line'
  38. AND INDEX_NAME = 'uk_dim_line' AND NON_UNIQUE = 0), '')
  39. = 'tenant_id,line_code';
  40. SELECT (SELECT COUNT(*) FROM information_schema.COLUMNS
  41. WHERE TABLE_SCHEMA = DATABASE()
  42. AND TABLE_NAME IN ('dim_employee','dim_line')
  43. AND COLUMN_NAME = 'tenant_id' AND IS_NULLABLE = 'NO') = 2;
  44. SELECT (SELECT COUNT(*) FROM information_schema.COLUMNS
  45. WHERE TABLE_SCHEMA = DATABASE()
  46. AND TABLE_NAME IN ('mdp_stg_s0_employee','mdp_stg_s0_line')
  47. AND COLUMN_NAME = 'tenant_id' AND IS_NULLABLE = 'NO') = 2;
  48. SELECT (SELECT COUNT(*) FROM information_schema.COLUMNS
  49. WHERE TABLE_SCHEMA = DATABASE()
  50. AND TABLE_NAME IN ('mdp_stg_s0_employee','mdp_stg_s0_line')
  51. AND COLUMN_NAME = 'source_biz_key' AND CHARACTER_MAXIMUM_LENGTH = 300) = 2;
  52. SELECT (SELECT COUNT(*) FROM information_schema.COLUMNS
  53. WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'dim_employee'
  54. AND COLUMN_NAME = 'sys_user_id' AND IS_NULLABLE = 'YES') = 1;
  55. SELECT (SELECT COUNT(*) FROM information_schema.STATISTICS
  56. WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'dim_employee'
  57. AND NON_UNIQUE = 0 AND COLUMN_NAME = 'sys_user_id') = 0;
  58. SELECT (SELECT COUNT(*) FROM information_schema.COLUMNS
  59. WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'dim_employee'
  60. AND COLUMN_NAME = 'department_code' AND IS_NULLABLE = 'YES') = 1;
  61. SELECT (SELECT COUNT(*) FROM `mdp_entity`
  62. WHERE `entity_code` IN ('S0_EMPLOYEE','S0_LINE')
  63. AND `status` = 1 AND `sync_mode` = 'FULL' AND `incr_column` IS NULL) = 2;
  64. SELECT (SELECT COUNT(*) FROM `mdp_entity` e JOIN `mdp_source` s ON s.`id` = e.`source_id`
  65. WHERE e.`entity_code` IN ('S0_EMPLOYEE','S0_LINE')
  66. AND s.`source_code` = 'AIDOPDEV_MYSQL') = 2;
  67. SELECT (SELECT COUNT(*) FROM `mdp_entity`
  68. WHERE `entity_code` = 'S0_EMPLOYEE'
  69. AND `biz_key_expr` COLLATE utf8mb4_bin = 'Employee'
  70. AND `source_table_name` COLLATE utf8mb4_bin = 'EmployeeMaster'
  71. AND `target_table_name` COLLATE utf8mb4_bin = 'mdp_stg_s0_employee'
  72. AND `batch_size` > 613) = 1;
  73. SELECT (SELECT COUNT(*) FROM `mdp_entity`
  74. WHERE `entity_code` = 'S0_LINE'
  75. AND `biz_key_expr` COLLATE utf8mb4_bin = 'Line'
  76. AND `source_table_name` COLLATE utf8mb4_bin = 'LineMaster'
  77. AND `target_table_name` COLLATE utf8mb4_bin = 'mdp_stg_s0_line'
  78. AND `batch_size` > 109) = 1;
  79. SELECT (SELECT COUNT(*) FROM information_schema.STATISTICS
  80. WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'dim_employee'
  81. AND INDEX_NAME = 'uk_dim_employee'
  82. AND COLUMN_NAME IN ('domain_code','company_id','factory_id','sys_user_id')) = 0;
  83. SELECT (SELECT COUNT(*) FROM information_schema.STATISTICS
  84. WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'dim_line'
  85. AND INDEX_NAME = 'uk_dim_line'
  86. AND COLUMN_NAME IN ('domain_code','company_id','factory_id')) = 0;
  87. SELECT (SELECT COUNT(*) FROM `mdp_entity`
  88. WHERE `target_table_name` IN ('mdp_stg_employee','mdp_stg_line','mdp_stg_location')
  89. AND `entity_code` LIKE 'S0\_%') = 0;