| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194 |
- -- =============================================================================
- -- 教务同步视图生产验证脚本
- -- 用途:部署 vw_jw_student_export / vw_jw_student_change_export 后执行
- --
- -- 用法:
- -- mysql -h <host> -u root -p hzdyjs_xg < docs/数据库脚本/2026-09-02-verify-jw-export-views.sql
- --
- -- 说明:
- -- * 脚本仅 SELECT,不修改数据
- -- * 若某段报错,说明对应视图或依赖表/字段异常
- -- * 「培养层次疑似中文」> 0 表示仍返回中文名称,需核对视图是否已更新
- -- =============================================================================
- SET NAMES utf8mb4;
- SELECT '========== 1. 视图是否存在 ==========' AS section;
- SELECT
- TABLE_NAME AS view_name,
- TABLE_TYPE AS object_type
- FROM information_schema.TABLES
- WHERE TABLE_SCHEMA = DATABASE()
- AND TABLE_NAME IN ('vw_jw_student_export', 'vw_jw_student_change_export')
- ORDER BY TABLE_NAME;
- SELECT '========== 2. 依赖:班级校区字段是否存在 ==========' AS section;
- SELECT
- COLUMN_NAME,
- COLUMN_TYPE,
- COLUMN_COMMENT
- FROM information_schema.COLUMNS
- WHERE TABLE_SCHEMA = DATABASE()
- AND TABLE_NAME = 'xg_class_msg'
- AND COLUMN_NAME IN ('campus_id', 'campus_name')
- ORDER BY ORDINAL_POSITION;
- SELECT '========== 3. 基础数据量对比 ==========' AS section;
- SELECT 'xg_student_msg(未删除)' AS metric, COUNT(*) AS cnt
- FROM xg_student_msg WHERE deleted = 0
- UNION ALL
- SELECT 'vw_jw_student_export', COUNT(*) FROM vw_jw_student_export
- UNION ALL
- SELECT 'vw_jw_student_change_export(全部)', COUNT(*) FROM vw_jw_student_change_export
- UNION ALL
- SELECT CONCAT('vw_jw_student_change_export(', YEAR(CURDATE()), '年)'),
- COUNT(*)
- FROM vw_jw_student_change_export
- WHERE YEAR(`异动生效时间`) = YEAR(CURDATE());
- SELECT '========== 4. vw_jw_student_export 关键字段填充率 ==========' AS section;
- SELECT
- COUNT(*) AS total,
- SUM(`学号` IS NOT NULL AND TRIM(`学号`) <> '') AS has_student_no,
- SUM(`班级信息` IS NOT NULL AND TRIM(`班级信息`) <> '') AS has_class,
- SUM(`所在校区` IS NOT NULL AND TRIM(`所在校区`) <> '') AS has_campus,
- SUM(`系部信息` IS NOT NULL AND TRIM(`系部信息`) <> '') AS has_college,
- SUM(`专业信息` IS NOT NULL AND TRIM(`专业信息`) <> '') AS has_major,
- SUM(`培养层次` IS NOT NULL AND TRIM(`培养层次`) <> '') AS has_pycc,
- SUM(`培养层次` REGEXP '^[0-5]$') AS pycc_dict_value_ok,
- SUM(
- `培养层次` IS NOT NULL
- AND TRIM(`培养层次`) <> ''
- AND `培养层次` NOT REGEXP '^[0-5]$'
- ) AS pycc_maybe_chinese_name
- FROM vw_jw_student_export;
- SELECT '========== 5. vw_jw_student_export 培养层次分布(应为 0~5 字典值)==========' AS section;
- SELECT
- COALESCE(`培养层次`, '(null)') AS pycc_value,
- COUNT(*) AS cnt
- FROM vw_jw_student_export
- GROUP BY `培养层次`
- ORDER BY cnt DESC
- LIMIT 20;
- SELECT '========== 6. vw_jw_student_export 所在校区分布(Top 10)==========' AS section;
- SELECT
- COALESCE(`所在校区`, '(null)') AS campus,
- COUNT(*) AS cnt
- FROM vw_jw_student_export
- GROUP BY `所在校区`
- ORDER BY cnt DESC
- LIMIT 10;
- SELECT '========== 7. vw_jw_student_export 样例(3 条,含组织信息)==========' AS section;
- SELECT
- `学号`, `姓名`, `班级信息`, `所在校区`, `系部信息`, `专业信息`, `培养层次`, `学制`, `学生当前状态`
- FROM vw_jw_student_export
- ORDER BY `学号`
- LIMIT 3;
- SELECT '========== 8. vw_jw_student_change_export 关键字段填充率 ==========' AS section;
- SELECT
- COUNT(*) AS total,
- SUM(`异动类型` IS NOT NULL AND TRIM(`异动类型`) <> '') AS has_change_type,
- SUM(`异动前所在院系` IS NOT NULL AND TRIM(`异动前所在院系`) <> '') AS has_before_college,
- SUM(`异动前所在专业` IS NOT NULL AND TRIM(`异动前所在专业`) <> '') AS has_before_major,
- SUM(`异动前所在班级` IS NOT NULL AND TRIM(`异动前所在班级`) <> '') AS has_before_class,
- SUM(`异动前所在校区` IS NOT NULL AND TRIM(`异动前所在校区`) <> '') AS has_before_campus,
- SUM(`异动后所在院系` IS NOT NULL AND TRIM(`异动后所在院系`) <> '') AS has_after_college,
- SUM(`异动后所在专业` IS NOT NULL AND TRIM(`异动后所在专业`) <> '') AS has_after_major,
- SUM(`异动后所在班级` IS NOT NULL AND TRIM(`异动后所在班级`) <> '') AS has_after_class,
- SUM(`异动后所在校区` IS NOT NULL AND TRIM(`异动后所在校区`) <> '') AS has_after_campus
- FROM vw_jw_student_change_export;
- SELECT '========== 9. vw_jw_student_change_export 异动类型分布 ==========' AS section;
- SELECT
- `异动类型`,
- COUNT(*) AS cnt
- FROM vw_jw_student_change_export
- GROUP BY `异动类型`
- ORDER BY cnt DESC;
- SELECT '========== 10. vw_jw_student_change_export 当年记录数(按年)==========' AS section;
- SELECT
- YEAR(`异动生效时间`) AS effect_year,
- COUNT(*) AS cnt
- FROM vw_jw_student_change_export
- GROUP BY YEAR(`异动生效时间`)
- ORDER BY effect_year DESC
- LIMIT 10;
- SELECT '========== 11. vw_jw_student_change_export 样例(3 条)==========' AS section;
- SELECT
- `提交时间`, `异动生效时间`, `异动类型`, `申请人学号`, `姓名`,
- `异动前所在校区`, `异动前所在院系`, `异动前所在专业`, `异动前所在班级`,
- `异动后所在校区`, `异动后所在院系`, `异动后所在专业`, `异动后所在班级`
- FROM vw_jw_student_change_export
- ORDER BY `异动生效时间` DESC
- LIMIT 3;
- SELECT '========== 12. jw_cx 账号视图权限(可选)==========' AS section;
- SELECT
- GRANTEE,
- TABLE_NAME,
- PRIVILEGE_TYPE
- FROM information_schema.TABLE_PRIVILEGES
- WHERE TABLE_SCHEMA = DATABASE()
- AND TABLE_NAME IN ('vw_jw_student_export', 'vw_jw_student_change_export')
- AND GRANTEE LIKE '%jw_cx%'
- ORDER BY TABLE_NAME, PRIVILEGE_TYPE;
- SELECT '========== 13. 快速结论(人工查看)==========' AS section;
- SELECT
- CASE
- WHEN (
- SELECT COUNT(*) FROM information_schema.TABLES
- WHERE TABLE_SCHEMA = DATABASE()
- AND TABLE_NAME IN ('vw_jw_student_export', 'vw_jw_student_change_export')
- ) = 2 THEN 'PASS'
- ELSE 'FAIL'
- END AS views_exist,
- CASE
- WHEN (
- SELECT COUNT(*) FROM vw_jw_student_export LIMIT 1
- ) >= 0 THEN 'PASS'
- ELSE 'FAIL'
- END AS student_export_queryable,
- CASE
- WHEN (
- SELECT COUNT(*) FROM vw_jw_student_change_export LIMIT 1
- ) >= 0 THEN 'PASS'
- ELSE 'FAIL'
- END AS change_export_queryable,
- CASE
- WHEN (
- SELECT COUNT(*) FROM vw_jw_student_export
- WHERE `培养层次` IS NOT NULL
- AND TRIM(`培养层次`) <> ''
- AND `培养层次` NOT REGEXP '^[0-5]$'
- ) = 0 THEN 'PASS'
- ELSE 'WARN'
- END AS pycc_is_dict_value,
- CASE
- WHEN (
- SELECT COUNT(*) FROM information_schema.COLUMNS
- WHERE TABLE_SCHEMA = DATABASE()
- AND TABLE_NAME = 'xg_class_msg'
- AND COLUMN_NAME = 'campus_id'
- ) = 1 THEN 'PASS'
- ELSE 'FAIL'
- END AS class_campus_column_exists;
|