195 lines
6.8 KiB
SQL
195 lines
6.8 KiB
SQL
-- =============================================================================
|
||
-- 教务同步视图生产验证脚本
|
||
-- 用途:部署 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;
|