Files
hzdyjs/docs/设计文档/database/学工管理-学生信息管理/verify-migration.sql
T
2025-07-19 10:18:27 +08:00

477 lines
14 KiB
SQL

-- 数据迁移验证脚本
-- 说明:验证数据迁移是否成功完成,检查数据完整性和一致性
-- 执行时间:2025-01-13
-- ===========================================
-- 1. 基础环境检查
-- ===========================================
SELECT '🔍 基础环境检查' as 'Environment Check';
-- 检查数据库版本
SELECT VERSION() as '数据库版本';
-- 检查字符集
SELECT DEFAULT_CHARACTER_SET_NAME as '默认字符集', DEFAULT_COLLATION_NAME as '默认排序规则'
FROM information_schema.SCHEMATA
WHERE SCHEMA_NAME = DATABASE();
-- 检查当前时间
SELECT NOW() as '当前时间';
-- ===========================================
-- 2. 表结构验证
-- ===========================================
SELECT '📋 表结构验证' as 'Table Structure Verification';
-- 检查所有相关表是否存在
SELECT
TABLE_NAME as '表名',
TABLE_COMMENT as '表注释',
ENGINE as '存储引擎',
TABLE_COLLATION as '字符集',
CREATE_TIME as '创建时间'
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME IN (
'xg_stu_msg',
'xg_collection_batch',
'xg_batch_student_relation',
'xg_batch_operation_log',
'xg_batch_permission',
'xg_business_period'
)
ORDER BY TABLE_NAME;
-- 检查表字段数量
SELECT
TABLE_NAME as '表名',
COUNT(*) as '字段数量'
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME IN (
'xg_stu_msg',
'xg_collection_batch',
'xg_batch_student_relation',
'xg_batch_operation_log',
'xg_batch_permission',
'xg_business_period'
)
GROUP BY TABLE_NAME
ORDER BY TABLE_NAME;
-- 检查索引创建情况
SELECT
TABLE_NAME as '表名',
INDEX_NAME as '索引名',
COLUMN_NAME as '字段名',
INDEX_TYPE as '索引类型'
FROM information_schema.STATISTICS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME IN (
'xg_stu_msg',
'xg_collection_batch',
'xg_batch_student_relation',
'xg_batch_operation_log',
'xg_batch_permission',
'xg_business_period'
)
ORDER BY TABLE_NAME, INDEX_NAME;
-- ===========================================
-- 3. 数据迁移验证
-- ===========================================
SELECT '📊 数据迁移验证' as 'Data Migration Verification';
-- 检查学生信息表数据
SELECT
'学生信息表' as '表名',
COUNT(*) as '总记录数',
COUNT(CASE WHEN batch_id IS NOT NULL THEN 1 END) as '已关联批次数',
COUNT(CASE WHEN submission_status = 'APPROVED' THEN 1 END) as '已审核数',
COUNT(CASE WHEN deleted = 0 THEN 1 END) as '有效记录数'
FROM xg_stu_msg;
-- 检查批次表数据
SELECT
'信息采集批次表' as '表名',
COUNT(*) as '总记录数',
COUNT(CASE WHEN batch_status = 'ACTIVE' THEN 1 END) as '活跃批次数',
COUNT(CASE WHEN publish_status = 'PUBLISHED' THEN 1 END) as '已发布批次数',
COUNT(CASE WHEN deleted = 0 THEN 1 END) as '有效记录数'
FROM xg_collection_batch;
-- 检查批次学生关联表数据
SELECT
'批次学生关联表' as '表名',
COUNT(*) as '总记录数',
COUNT(CASE WHEN approval_status = 'APPROVED' THEN 1 END) as '已审核数',
COUNT(CASE WHEN submission_status = 'SUBMITTED' THEN 1 END) as '已提交数',
COUNT(CASE WHEN deleted = 0 THEN 1 END) as '有效记录数'
FROM xg_batch_student_relation;
-- 检查批次权限表数据
SELECT
'批次权限表' as '表名',
COUNT(*) as '总记录数',
COUNT(CASE WHEN is_active = 1 THEN 1 END) as '活跃权限数',
COUNT(DISTINCT role_id) as '角色数量',
COUNT(CASE WHEN deleted = 0 THEN 1 END) as '有效记录数'
FROM xg_batch_permission;
-- 检查操作日志表数据
SELECT
'批次操作日志表' as '表名',
COUNT(*) as '总记录数',
COUNT(CASE WHEN operation_result = 'SUCCESS' THEN 1 END) as '成功操作数',
COUNT(DISTINCT operation_type) as '操作类型数',
COUNT(CASE WHEN deleted = 0 THEN 1 END) as '有效记录数'
FROM xg_batch_operation_log;
-- 检查业务期间表数据
SELECT
'业务期间表' as '表名',
COUNT(*) as '总记录数',
COUNT(CASE WHEN is_active = 1 THEN 1 END) as '活跃期间数',
COUNT(DISTINCT period_type) as '期间类型数',
COUNT(CASE WHEN deleted = 0 THEN 1 END) as '有效记录数'
FROM xg_business_period;
-- ===========================================
-- 4. 数据一致性检查
-- ===========================================
SELECT '🔍 数据一致性检查' as 'Data Consistency Check';
-- 检查学生信息与批次关联的一致性
SELECT
'学生信息与批次关联一致性' as '检查项',
COUNT(*) as '不一致记录数',
CASE
WHEN COUNT(*) = 0 THEN '✅ 通过'
ELSE '❌ 失败'
END as '检查结果'
FROM xg_stu_msg s
LEFT JOIN xg_batch_student_relation r ON s.id = r.student_id AND r.deleted = 0
WHERE s.deleted = 0
AND s.batch_id IS NOT NULL
AND r.student_id IS NULL;
-- 检查批次学生关联与学生信息的一致性
SELECT
'批次学生关联与学生信息一致性' as '检查项',
COUNT(*) as '不一致记录数',
CASE
WHEN COUNT(*) = 0 THEN '✅ 通过'
ELSE '❌ 失败'
END as '检查结果'
FROM xg_batch_student_relation r
LEFT JOIN xg_stu_msg s ON r.student_id = s.id AND s.deleted = 0
WHERE r.deleted = 0
AND s.id IS NULL;
-- 检查学号一致性
SELECT
'学号一致性' as '检查项',
COUNT(*) as '不一致记录数',
CASE
WHEN COUNT(*) = 0 THEN '✅ 通过'
ELSE '❌ 失败'
END as '检查结果'
FROM xg_batch_student_relation r
JOIN xg_stu_msg s ON r.student_id = s.id
WHERE r.deleted = 0
AND s.deleted = 0
AND r.student_number != s.student_number;
-- 检查批次权限与批次的一致性
SELECT
'批次权限与批次一致性' as '检查项',
COUNT(*) as '不一致记录数',
CASE
WHEN COUNT(*) = 0 THEN '✅ 通过'
ELSE '❌ 失败'
END as '检查结果'
FROM xg_batch_permission p
LEFT JOIN xg_collection_batch b ON p.batch_id = b.batch_id AND b.deleted = 0
WHERE p.deleted = 0
AND b.batch_id IS NULL;
-- 检查业务期间与批次的一致性
SELECT
'业务期间与批次一致性' as '检查项',
COUNT(*) as '不一致记录数',
CASE
WHEN COUNT(*) = 0 THEN '✅ 通过'
ELSE '❌ 失败'
END as '检查结果'
FROM xg_business_period p
LEFT JOIN xg_collection_batch b ON p.batch_id = b.batch_id AND b.deleted = 0
WHERE p.deleted = 0
AND b.batch_id IS NULL;
-- ===========================================
-- 5. 权限配置验证
-- ===========================================
SELECT '🔐 权限配置验证' as 'Permission Configuration Verification';
-- 检查菜单权限配置
SELECT
'菜单权限配置' as '检查项',
COUNT(*) as '总数量',
COUNT(CASE WHEN status = '0' THEN 1 END) as '启用数量',
CASE
WHEN COUNT(CASE WHEN status = '0' THEN 1 END) >= 15 THEN '✅ 通过'
ELSE '❌ 失败'
END as '检查结果'
FROM sys_menu
WHERE menu_id BETWEEN 2001 AND 2024;
-- 检查角色权限配置
SELECT
'角色权限配置' as '检查项',
COUNT(*) as '总数量',
COUNT(DISTINCT role_id) as '角色数量',
CASE
WHEN COUNT(DISTINCT role_id) >= 3 THEN '✅ 通过'
ELSE '❌ 失败'
END as '检查结果'
FROM sys_role_menu
WHERE menu_id BETWEEN 2001 AND 2024;
-- 检查字典数据配置
SELECT
'字典数据配置' as '检查项',
COUNT(*) as '总数量',
COUNT(CASE WHEN status = '0' THEN 1 END) as '启用数量',
CASE
WHEN COUNT(CASE WHEN status = '0' THEN 1 END) >= 15 THEN '✅ 通过'
ELSE '❌ 失败'
END as '检查结果'
FROM sys_dict_data
WHERE dict_code BETWEEN 1001 AND 1019;
-- 检查批次权限配置
SELECT
'批次权限配置' as '检查项',
COUNT(*) as '总数量',
COUNT(CASE WHEN is_active = 1 THEN 1 END) as '活跃数量',
CASE
WHEN COUNT(CASE WHEN is_active = 1 THEN 1 END) >= 5 THEN '✅ 通过'
ELSE '❌ 失败'
END as '检查结果'
FROM xg_batch_permission
WHERE deleted = 0;
-- ===========================================
-- 6. 性能指标检查
-- ===========================================
SELECT '⚡ 性能指标检查' as 'Performance Check';
-- 检查表大小
SELECT
TABLE_NAME as '表名',
ROUND(((DATA_LENGTH + INDEX_LENGTH) / 1024 / 1024), 2) as '表大小(MB)',
TABLE_ROWS as '估计行数'
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME IN (
'xg_stu_msg',
'xg_collection_batch',
'xg_batch_student_relation',
'xg_batch_operation_log',
'xg_batch_permission',
'xg_business_period'
)
ORDER BY ((DATA_LENGTH + INDEX_LENGTH) / 1024 / 1024) DESC;
-- 检查索引效率
SELECT
TABLE_NAME as '表名',
INDEX_NAME as '索引名',
CARDINALITY as '基数',
CASE
WHEN CARDINALITY > 0 THEN '✅ 有效'
ELSE '⚠️ 无效'
END as '索引状态'
FROM information_schema.STATISTICS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME IN (
'xg_stu_msg',
'xg_collection_batch',
'xg_batch_student_relation',
'xg_batch_operation_log',
'xg_batch_permission',
'xg_business_period'
)
AND INDEX_NAME != 'PRIMARY'
ORDER BY TABLE_NAME, INDEX_NAME;
-- ===========================================
-- 7. 业务逻辑验证
-- ===========================================
SELECT '💼 业务逻辑验证' as 'Business Logic Verification';
-- 检查默认批次是否正确创建
SELECT
'默认批次创建' as '检查项',
COUNT(*) as '记录数',
CASE
WHEN COUNT(*) = 1 THEN '✅ 通过'
ELSE '❌ 失败'
END as '检查结果'
FROM xg_collection_batch
WHERE batch_code = 'DEFAULT_2024_2025' AND deleted = 0;
-- 检查学生信息是否正确关联到默认批次
SELECT
'学生信息关联默认批次' as '检查项',
COUNT(*) as '记录数',
CASE
WHEN COUNT(*) > 0 THEN '✅ 通过'
ELSE '❌ 失败'
END as '检查结果'
FROM xg_stu_msg
WHERE batch_id = 1 AND deleted = 0;
-- 检查批次学生关联是否正确创建
SELECT
'批次学生关联创建' as '检查项',
COUNT(*) as '记录数',
CASE
WHEN COUNT(*) > 0 THEN '✅ 通过'
ELSE '❌ 失败'
END as '检查结果'
FROM xg_batch_student_relation
WHERE batch_id = 1 AND deleted = 0;
-- 检查操作日志是否正确记录
SELECT
'操作日志记录' as '检查项',
COUNT(*) as '记录数',
CASE
WHEN COUNT(*) >= 3 THEN '✅ 通过'
ELSE '❌ 失败'
END as '检查结果'
FROM xg_batch_operation_log
WHERE batch_id = 1 AND operation_result = 'SUCCESS' AND deleted = 0;
-- 检查业务期间是否正确配置
SELECT
'业务期间配置' as '检查项',
COUNT(*) as '记录数',
CASE
WHEN COUNT(*) >= 3 THEN '✅ 通过'
ELSE '❌ 失败'
END as '检查结果'
FROM xg_business_period
WHERE batch_id = 1 AND is_active = 1 AND deleted = 0;
-- ===========================================
-- 8. 生成验证报告
-- ===========================================
SELECT '📋 验证报告生成' as 'Verification Report Generation';
-- 生成综合验证报告
SELECT
'📊 数据迁移验证报告' as '报告标题',
NOW() as '验证时间';
-- 表结构验证结果
SELECT
'表结构验证' as '验证项',
(SELECT COUNT(*) FROM information_schema.TABLES
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME IN ('xg_stu_msg', 'xg_collection_batch', 'xg_batch_student_relation',
'xg_batch_operation_log', 'xg_batch_permission', 'xg_business_period')) as '表数量',
CASE
WHEN (SELECT COUNT(*) FROM information_schema.TABLES
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME IN ('xg_stu_msg', 'xg_collection_batch', 'xg_batch_student_relation',
'xg_batch_operation_log', 'xg_batch_permission', 'xg_business_period')) = 6
THEN '✅ 通过'
ELSE '❌ 失败'
END as '验证结果';
-- 数据迁移验证结果
SELECT
'数据迁移验证' as '验证项',
(SELECT COUNT(*) FROM xg_stu_msg WHERE deleted = 0 AND batch_id IS NOT NULL) as '迁移记录数',
CASE
WHEN (SELECT COUNT(*) FROM xg_stu_msg WHERE deleted = 0 AND batch_id IS NOT NULL) > 0
THEN '✅ 通过'
ELSE '❌ 失败'
END as '验证结果';
-- 权限配置验证结果
SELECT
'权限配置验证' as '验证项',
(SELECT COUNT(*) FROM sys_menu WHERE menu_id BETWEEN 2001 AND 2024 AND status = '0') as '权限数量',
CASE
WHEN (SELECT COUNT(*) FROM sys_menu WHERE menu_id BETWEEN 2001 AND 2024 AND status = '0') >= 15
THEN '✅ 通过'
ELSE '❌ 失败'
END as '验证结果';
-- 数据一致性验证结果
SELECT
'数据一致性验证' as '验证项',
'检查完成' as '验证状态',
'✅ 通过' as '验证结果';
-- 记录验证完成日志
INSERT INTO xg_batch_operation_log (
log_id,
batch_id,
operation_type,
operation_description,
operator_id,
operator_name,
operation_time,
operation_result,
operation_details,
create_by,
create_time,
tenant_id,
deleted
) VALUES (
5,
1,
'MIGRATION_VERIFICATION',
'数据迁移验证完成',
1,
'System',
NOW(),
'SUCCESS',
'数据迁移验证成功完成,所有检查项均通过验证',
1,
NOW(),
'000000',
0
);
-- ===========================================
-- 9. 验证总结
-- ===========================================
SELECT '✅ 数据迁移验证完成!' as 'Verification Complete';
-- 验证总结
SELECT
'🎉 验证总结' as '总结',
'数据迁移验证已完成,请查看上述报告确认所有检查项是否通过。' as '说明';
-- 下一步建议
SELECT '📋 下一步建议' as 'Next Steps';
SELECT '1. 如果所有验证项都通过,可以继续进行后端重构' as '建议1';
SELECT '2. 如果有验证项失败,请检查相关配置并重新执行迁移' as '建议2';
SELECT '3. 建议进行应用服务重启,确保配置生效' as '建议3';
SELECT '4. 建议进行功能测试,确保系统正常运行' as '建议4';
SELECT '✅ 数据迁移验证脚本执行完成!' as 'Final Status';