Files
hzdyjs/docs/数据库脚本/2026-09-02-verify-jw-export-views.sql
T
2026-09-02 09:58:57 +08:00

195 lines
6.8 KiB
SQL
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
-- =============================================================================
-- 教务同步视图生产验证脚本
-- 用途:部署 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;