docs: complete documentation system (250+ files)
- System architecture and design documentation - Business module docs (ASL/AIA/PKB/RVW/DC/SSA/ST) - ASL module complete design (quality assurance, tech selection) - Platform layer and common capabilities docs - Development standards and API specifications - Deployment and operations guides - Project management and milestone tracking - Architecture implementation reports - Documentation templates and guides
This commit is contained in:
544
docs/09-架构实施/migration-scripts/005-validate-all.sql
Normal file
544
docs/09-架构实施/migration-scripts/005-validate-all.sql
Normal file
@@ -0,0 +1,544 @@
|
||||
-- ========================================
|
||||
-- 005-validate-all.sql
|
||||
-- ========================================
|
||||
-- 目的:全局验证10个Schema和数据迁移的完整性
|
||||
-- 预计时间:10分钟
|
||||
-- 作者:AI助手
|
||||
-- 日期:2025-11-09
|
||||
-- ========================================
|
||||
|
||||
-- 前置条件:
|
||||
-- 1. 已执行 001-create-all-10-schemas.sql
|
||||
-- 2. 已执行 002-migrate-platform.sql
|
||||
-- 3. 已执行 003-migrate-aia.sql
|
||||
-- 4. 已执行 004-migrate-pkb.sql
|
||||
|
||||
-- ========================================
|
||||
-- 第一部分:Schema完整性验证
|
||||
-- ========================================
|
||||
|
||||
\echo '========================================';
|
||||
\echo '第一部分:Schema完整性验证';
|
||||
\echo '========================================';
|
||||
|
||||
SELECT
|
||||
'Schema检查' AS check_type,
|
||||
nspname AS schema_name,
|
||||
CASE
|
||||
WHEN nspname IN ('platform_schema', 'aia_schema', 'pkb_schema',
|
||||
'asl_schema', 'common_schema', 'dc_schema',
|
||||
'rvw_schema', 'admin_schema', 'ssa_schema', 'st_schema')
|
||||
THEN '✅ 存在'
|
||||
ELSE '❌ 不存在'
|
||||
END AS status,
|
||||
pg_catalog.obj_description(oid, 'pg_namespace') AS description
|
||||
FROM pg_namespace
|
||||
WHERE nspname IN (
|
||||
'platform_schema', 'aia_schema', 'pkb_schema',
|
||||
'asl_schema', 'common_schema', 'dc_schema',
|
||||
'rvw_schema', 'admin_schema', 'ssa_schema', 'st_schema'
|
||||
)
|
||||
ORDER BY nspname;
|
||||
|
||||
-- 统计Schema数量
|
||||
DO $$
|
||||
DECLARE
|
||||
schema_count INTEGER;
|
||||
BEGIN
|
||||
SELECT COUNT(*) INTO schema_count
|
||||
FROM pg_namespace
|
||||
WHERE nspname IN (
|
||||
'platform_schema', 'aia_schema', 'pkb_schema',
|
||||
'asl_schema', 'common_schema', 'dc_schema',
|
||||
'rvw_schema', 'admin_schema', 'ssa_schema', 'st_schema'
|
||||
);
|
||||
|
||||
RAISE NOTICE '========================================';
|
||||
IF schema_count = 10 THEN
|
||||
RAISE NOTICE '✅ Schema完整性检查通过:10个Schema全部创建成功';
|
||||
ELSE
|
||||
RAISE WARNING '❌ Schema完整性检查失败:预期10个,实际%个', schema_count;
|
||||
END IF;
|
||||
RAISE NOTICE '========================================';
|
||||
END $$;
|
||||
|
||||
-- ========================================
|
||||
-- 第二部分:表结构验证
|
||||
-- ========================================
|
||||
|
||||
\echo '';
|
||||
\echo '========================================';
|
||||
\echo '第二部分:表结构验证';
|
||||
\echo '========================================';
|
||||
|
||||
SELECT
|
||||
'platform_schema' AS schema_name,
|
||||
tablename AS table_name,
|
||||
'✅' AS status
|
||||
FROM pg_tables
|
||||
WHERE schemaname = 'platform_schema'
|
||||
|
||||
UNION ALL
|
||||
|
||||
SELECT
|
||||
'aia_schema',
|
||||
tablename,
|
||||
'✅'
|
||||
FROM pg_tables
|
||||
WHERE schemaname = 'aia_schema'
|
||||
|
||||
UNION ALL
|
||||
|
||||
SELECT
|
||||
'pkb_schema',
|
||||
tablename,
|
||||
'✅'
|
||||
FROM pg_tables
|
||||
WHERE schemaname = 'pkb_schema'
|
||||
|
||||
ORDER BY schema_name, table_name;
|
||||
|
||||
-- 统计各Schema的表数量
|
||||
DO $$
|
||||
DECLARE
|
||||
platform_tables INTEGER;
|
||||
aia_tables INTEGER;
|
||||
pkb_tables INTEGER;
|
||||
all_ok BOOLEAN := true;
|
||||
BEGIN
|
||||
SELECT COUNT(*) INTO platform_tables FROM pg_tables WHERE schemaname = 'platform_schema';
|
||||
SELECT COUNT(*) INTO aia_tables FROM pg_tables WHERE schemaname = 'aia_schema';
|
||||
SELECT COUNT(*) INTO pkb_tables FROM pg_tables WHERE schemaname = 'pkb_schema';
|
||||
|
||||
RAISE NOTICE '========================================';
|
||||
RAISE NOTICE 'platform_schema: % 个表 (预期1个)', platform_tables;
|
||||
RAISE NOTICE 'aia_schema: % 个表 (预期5个)', aia_tables;
|
||||
RAISE NOTICE 'pkb_schema: % 个表 (预期5个)', pkb_tables;
|
||||
RAISE NOTICE '========================================';
|
||||
|
||||
IF platform_tables != 1 THEN
|
||||
RAISE WARNING '❌ platform_schema表数量异常';
|
||||
all_ok := false;
|
||||
END IF;
|
||||
|
||||
IF aia_tables != 5 THEN
|
||||
RAISE WARNING '❌ aia_schema表数量异常';
|
||||
all_ok := false;
|
||||
END IF;
|
||||
|
||||
IF pkb_tables != 5 THEN
|
||||
RAISE WARNING '❌ pkb_schema表数量异常';
|
||||
all_ok := false;
|
||||
END IF;
|
||||
|
||||
IF all_ok THEN
|
||||
RAISE NOTICE '✅ 表结构验证通过:所有表创建成功';
|
||||
END IF;
|
||||
RAISE NOTICE '========================================';
|
||||
END $$;
|
||||
|
||||
-- ========================================
|
||||
-- 第三部分:数据量对比验证
|
||||
-- ========================================
|
||||
|
||||
\echo '';
|
||||
\echo '========================================';
|
||||
\echo '第三部分:数据量对比验证';
|
||||
\echo '========================================';
|
||||
|
||||
-- 3.1 Platform Schema
|
||||
SELECT
|
||||
'users' AS table_name,
|
||||
(SELECT COUNT(*) FROM public.users) AS public_count,
|
||||
(SELECT COUNT(*) FROM platform_schema.users) AS migrated_count,
|
||||
CASE
|
||||
WHEN (SELECT COUNT(*) FROM public.users) = (SELECT COUNT(*) FROM platform_schema.users)
|
||||
THEN '✅ 一致'
|
||||
ELSE '❌ 不一致'
|
||||
END AS status
|
||||
WHERE EXISTS (SELECT 1 FROM public.users LIMIT 1);
|
||||
|
||||
-- 3.2 AIA Schema
|
||||
SELECT
|
||||
'projects' AS table_name,
|
||||
(SELECT COUNT(*) FROM public.projects) AS public_count,
|
||||
(SELECT COUNT(*) FROM aia_schema.projects) AS migrated_count,
|
||||
CASE
|
||||
WHEN (SELECT COUNT(*) FROM public.projects) = (SELECT COUNT(*) FROM aia_schema.projects)
|
||||
THEN '✅ 一致'
|
||||
ELSE '❌ 不一致'
|
||||
END AS status
|
||||
|
||||
UNION ALL
|
||||
|
||||
SELECT
|
||||
'conversations',
|
||||
(SELECT COUNT(*) FROM public.conversations),
|
||||
(SELECT COUNT(*) FROM aia_schema.conversations),
|
||||
CASE
|
||||
WHEN (SELECT COUNT(*) FROM public.conversations) = (SELECT COUNT(*) FROM aia_schema.conversations)
|
||||
THEN '✅ 一致'
|
||||
ELSE '❌ 不一致'
|
||||
END
|
||||
|
||||
UNION ALL
|
||||
|
||||
SELECT
|
||||
'messages',
|
||||
(SELECT COUNT(*) FROM public.messages),
|
||||
(SELECT COUNT(*) FROM aia_schema.messages),
|
||||
CASE
|
||||
WHEN (SELECT COUNT(*) FROM public.messages) = (SELECT COUNT(*) FROM aia_schema.messages)
|
||||
THEN '✅ 一致'
|
||||
ELSE '❌ 不一致'
|
||||
END
|
||||
|
||||
UNION ALL
|
||||
|
||||
SELECT
|
||||
'general_conversations',
|
||||
(SELECT COUNT(*) FROM public.general_conversations),
|
||||
(SELECT COUNT(*) FROM aia_schema.general_conversations),
|
||||
CASE
|
||||
WHEN (SELECT COUNT(*) FROM public.general_conversations) = (SELECT COUNT(*) FROM aia_schema.general_conversations)
|
||||
THEN '✅ 一致'
|
||||
ELSE '❌ 不一致'
|
||||
END
|
||||
|
||||
UNION ALL
|
||||
|
||||
SELECT
|
||||
'general_messages',
|
||||
(SELECT COUNT(*) FROM public.general_messages),
|
||||
(SELECT COUNT(*) FROM aia_schema.general_messages),
|
||||
CASE
|
||||
WHEN (SELECT COUNT(*) FROM public.general_messages) = (SELECT COUNT(*) FROM aia_schema.general_messages)
|
||||
THEN '✅ 一致'
|
||||
ELSE '❌ 不一致'
|
||||
END;
|
||||
|
||||
-- 3.3 PKB Schema
|
||||
SELECT
|
||||
'knowledge_bases' AS table_name,
|
||||
(SELECT COUNT(*) FROM public.knowledge_bases) AS public_count,
|
||||
(SELECT COUNT(*) FROM pkb_schema.knowledge_bases) AS migrated_count,
|
||||
CASE
|
||||
WHEN (SELECT COUNT(*) FROM public.knowledge_bases) = (SELECT COUNT(*) FROM pkb_schema.knowledge_bases)
|
||||
THEN '✅ 一致'
|
||||
ELSE '❌ 不一致'
|
||||
END AS status
|
||||
|
||||
UNION ALL
|
||||
|
||||
SELECT
|
||||
'documents',
|
||||
(SELECT COUNT(*) FROM public.documents),
|
||||
(SELECT COUNT(*) FROM pkb_schema.documents),
|
||||
CASE
|
||||
WHEN (SELECT COUNT(*) FROM public.documents) = (SELECT COUNT(*) FROM pkb_schema.documents)
|
||||
THEN '✅ 一致'
|
||||
ELSE '❌ 不一致'
|
||||
END
|
||||
|
||||
UNION ALL
|
||||
|
||||
SELECT
|
||||
'batch_tasks',
|
||||
(SELECT COUNT(*) FROM public.batch_tasks),
|
||||
(SELECT COUNT(*) FROM pkb_schema.batch_tasks),
|
||||
CASE
|
||||
WHEN (SELECT COUNT(*) FROM public.batch_tasks) = (SELECT COUNT(*) FROM pkb_schema.batch_tasks)
|
||||
THEN '✅ 一致'
|
||||
ELSE '❌ 不一致'
|
||||
END
|
||||
|
||||
UNION ALL
|
||||
|
||||
SELECT
|
||||
'batch_results',
|
||||
(SELECT COUNT(*) FROM public.batch_results),
|
||||
(SELECT COUNT(*) FROM pkb_schema.batch_results),
|
||||
CASE
|
||||
WHEN (SELECT COUNT(*) FROM public.batch_results) = (SELECT COUNT(*) FROM pkb_schema.batch_results)
|
||||
THEN '✅ 一致'
|
||||
ELSE '❌ 不一致'
|
||||
END
|
||||
|
||||
UNION ALL
|
||||
|
||||
SELECT
|
||||
'task_templates',
|
||||
(SELECT COUNT(*) FROM public.task_templates),
|
||||
(SELECT COUNT(*) FROM pkb_schema.task_templates),
|
||||
CASE
|
||||
WHEN (SELECT COUNT(*) FROM public.task_templates) = (SELECT COUNT(*) FROM pkb_schema.task_templates)
|
||||
THEN '✅ 一致'
|
||||
ELSE '❌ 不一致'
|
||||
END;
|
||||
|
||||
-- ========================================
|
||||
-- 第四部分:外键约束验证
|
||||
-- ========================================
|
||||
|
||||
\echo '';
|
||||
\echo '========================================';
|
||||
\echo '第四部分:外键约束验证';
|
||||
\echo '========================================';
|
||||
|
||||
SELECT
|
||||
tc.table_schema AS schema_name,
|
||||
tc.table_name,
|
||||
tc.constraint_name,
|
||||
kcu.column_name,
|
||||
ccu.table_schema AS foreign_schema,
|
||||
ccu.table_name AS foreign_table,
|
||||
ccu.column_name AS foreign_column,
|
||||
'✅' AS status
|
||||
FROM information_schema.table_constraints tc
|
||||
JOIN information_schema.key_column_usage kcu
|
||||
ON tc.constraint_name = kcu.constraint_name
|
||||
AND tc.table_schema = kcu.table_schema
|
||||
JOIN information_schema.constraint_column_usage ccu
|
||||
ON ccu.constraint_name = tc.constraint_name
|
||||
AND ccu.table_schema = tc.table_schema
|
||||
WHERE tc.constraint_type = 'FOREIGN KEY'
|
||||
AND tc.table_schema IN ('platform_schema', 'aia_schema', 'pkb_schema')
|
||||
ORDER BY tc.table_schema, tc.table_name, tc.constraint_name;
|
||||
|
||||
-- 统计外键数量
|
||||
DO $$
|
||||
DECLARE
|
||||
fk_count INTEGER;
|
||||
BEGIN
|
||||
SELECT COUNT(*) INTO fk_count
|
||||
FROM information_schema.table_constraints
|
||||
WHERE constraint_type = 'FOREIGN KEY'
|
||||
AND table_schema IN ('platform_schema', 'aia_schema', 'pkb_schema');
|
||||
|
||||
RAISE NOTICE '========================================';
|
||||
RAISE NOTICE '✅ 外键约束总数:%', fk_count;
|
||||
RAISE NOTICE '========================================';
|
||||
END $$;
|
||||
|
||||
-- ========================================
|
||||
-- 第五部分:跨Schema引用验证
|
||||
-- ========================================
|
||||
|
||||
\echo '';
|
||||
\echo '========================================';
|
||||
\echo '第五部分:跨Schema引用验证';
|
||||
\echo '========================================';
|
||||
|
||||
-- 验证所有引用platform_schema.users的外键是否有效
|
||||
DO $$
|
||||
DECLARE
|
||||
invalid_aia_projects INTEGER;
|
||||
invalid_aia_conversations INTEGER;
|
||||
invalid_aia_general_conversations INTEGER;
|
||||
invalid_pkb_knowledge_bases INTEGER;
|
||||
invalid_pkb_documents INTEGER;
|
||||
all_valid BOOLEAN := true;
|
||||
BEGIN
|
||||
-- 验证aia_schema.projects
|
||||
SELECT COUNT(*) INTO invalid_aia_projects
|
||||
FROM aia_schema.projects p
|
||||
LEFT JOIN platform_schema.users u ON p.user_id = u.id
|
||||
WHERE u.id IS NULL;
|
||||
|
||||
-- 验证aia_schema.conversations
|
||||
SELECT COUNT(*) INTO invalid_aia_conversations
|
||||
FROM aia_schema.conversations c
|
||||
LEFT JOIN platform_schema.users u ON c.user_id = u.id
|
||||
WHERE u.id IS NULL;
|
||||
|
||||
-- 验证aia_schema.general_conversations
|
||||
SELECT COUNT(*) INTO invalid_aia_general_conversations
|
||||
FROM aia_schema.general_conversations gc
|
||||
LEFT JOIN platform_schema.users u ON gc.user_id = u.id
|
||||
WHERE u.id IS NULL;
|
||||
|
||||
-- 验证pkb_schema.knowledge_bases
|
||||
SELECT COUNT(*) INTO invalid_pkb_knowledge_bases
|
||||
FROM pkb_schema.knowledge_bases kb
|
||||
LEFT JOIN platform_schema.users u ON kb.user_id = u.id
|
||||
WHERE u.id IS NULL;
|
||||
|
||||
-- 验证pkb_schema.documents
|
||||
SELECT COUNT(*) INTO invalid_pkb_documents
|
||||
FROM pkb_schema.documents d
|
||||
LEFT JOIN platform_schema.users u ON d.user_id = u.id
|
||||
WHERE u.id IS NULL;
|
||||
|
||||
RAISE NOTICE '========================================';
|
||||
RAISE NOTICE '跨Schema引用验证结果:';
|
||||
RAISE NOTICE '----------------------------------------';
|
||||
|
||||
IF invalid_aia_projects > 0 THEN
|
||||
RAISE WARNING '❌ aia_schema.projects有%条无效user_id', invalid_aia_projects;
|
||||
all_valid := false;
|
||||
ELSE
|
||||
RAISE NOTICE '✅ aia_schema.projects外键全部有效';
|
||||
END IF;
|
||||
|
||||
IF invalid_aia_conversations > 0 THEN
|
||||
RAISE WARNING '❌ aia_schema.conversations有%条无效user_id', invalid_aia_conversations;
|
||||
all_valid := false;
|
||||
ELSE
|
||||
RAISE NOTICE '✅ aia_schema.conversations外键全部有效';
|
||||
END IF;
|
||||
|
||||
IF invalid_aia_general_conversations > 0 THEN
|
||||
RAISE WARNING '❌ aia_schema.general_conversations有%条无效user_id', invalid_aia_general_conversations;
|
||||
all_valid := false;
|
||||
ELSE
|
||||
RAISE NOTICE '✅ aia_schema.general_conversations外键全部有效';
|
||||
END IF;
|
||||
|
||||
IF invalid_pkb_knowledge_bases > 0 THEN
|
||||
RAISE WARNING '❌ pkb_schema.knowledge_bases有%条无效user_id', invalid_pkb_knowledge_bases;
|
||||
all_valid := false;
|
||||
ELSE
|
||||
RAISE NOTICE '✅ pkb_schema.knowledge_bases外键全部有效';
|
||||
END IF;
|
||||
|
||||
IF invalid_pkb_documents > 0 THEN
|
||||
RAISE WARNING '❌ pkb_schema.documents有%条无效user_id', invalid_pkb_documents;
|
||||
all_valid := false;
|
||||
ELSE
|
||||
RAISE NOTICE '✅ pkb_schema.documents外键全部有效';
|
||||
END IF;
|
||||
|
||||
RAISE NOTICE '========================================';
|
||||
|
||||
IF all_valid THEN
|
||||
RAISE NOTICE '✅ 所有跨Schema引用验证通过';
|
||||
ELSE
|
||||
RAISE WARNING '❌ 存在无效的跨Schema引用';
|
||||
END IF;
|
||||
|
||||
RAISE NOTICE '========================================';
|
||||
END $$;
|
||||
|
||||
-- ========================================
|
||||
-- 第六部分:索引验证
|
||||
-- ========================================
|
||||
|
||||
\echo '';
|
||||
\echo '========================================';
|
||||
\echo '第六部分:索引验证';
|
||||
\echo '========================================';
|
||||
|
||||
SELECT
|
||||
schemaname AS schema_name,
|
||||
tablename AS table_name,
|
||||
indexname AS index_name,
|
||||
'✅' AS status
|
||||
FROM pg_indexes
|
||||
WHERE schemaname IN ('platform_schema', 'aia_schema', 'pkb_schema')
|
||||
ORDER BY schemaname, tablename, indexname;
|
||||
|
||||
-- 统计索引数量
|
||||
DO $$
|
||||
DECLARE
|
||||
index_count INTEGER;
|
||||
BEGIN
|
||||
SELECT COUNT(*) INTO index_count
|
||||
FROM pg_indexes
|
||||
WHERE schemaname IN ('platform_schema', 'aia_schema', 'pkb_schema')
|
||||
AND indexname NOT LIKE '%pkey'; -- 排除主键索引
|
||||
|
||||
RAISE NOTICE '========================================';
|
||||
RAISE NOTICE '✅ 非主键索引总数:%', index_count;
|
||||
RAISE NOTICE '========================================';
|
||||
END $$;
|
||||
|
||||
-- ========================================
|
||||
-- 第七部分:数据采样验证(抽样检查)
|
||||
-- ========================================
|
||||
|
||||
\echo '';
|
||||
\echo '========================================';
|
||||
\echo '第七部分:数据采样验证';
|
||||
\echo '========================================';
|
||||
|
||||
-- 采样验证:检查ID是否完全一致
|
||||
DO $$
|
||||
DECLARE
|
||||
user_ids_match BOOLEAN;
|
||||
project_ids_match BOOLEAN;
|
||||
BEGIN
|
||||
-- 验证users的ID
|
||||
SELECT NOT EXISTS (
|
||||
SELECT id FROM public.users
|
||||
EXCEPT
|
||||
SELECT id FROM platform_schema.users
|
||||
) AND NOT EXISTS (
|
||||
SELECT id FROM platform_schema.users
|
||||
EXCEPT
|
||||
SELECT id FROM public.users
|
||||
) INTO user_ids_match;
|
||||
|
||||
-- 验证projects的ID
|
||||
SELECT NOT EXISTS (
|
||||
SELECT id FROM public.projects
|
||||
EXCEPT
|
||||
SELECT id FROM aia_schema.projects
|
||||
) AND NOT EXISTS (
|
||||
SELECT id FROM aia_schema.projects
|
||||
EXCEPT
|
||||
SELECT id FROM public.projects
|
||||
) INTO project_ids_match;
|
||||
|
||||
RAISE NOTICE '========================================';
|
||||
IF user_ids_match THEN
|
||||
RAISE NOTICE '✅ users表ID完全一致';
|
||||
ELSE
|
||||
RAISE WARNING '❌ users表ID存在差异';
|
||||
END IF;
|
||||
|
||||
IF project_ids_match THEN
|
||||
RAISE NOTICE '✅ projects表ID完全一致';
|
||||
ELSE
|
||||
RAISE WARNING '❌ projects表ID存在差异';
|
||||
END IF;
|
||||
RAISE NOTICE '========================================';
|
||||
END $$;
|
||||
|
||||
-- ========================================
|
||||
-- 第八部分:最终总结报告
|
||||
-- ========================================
|
||||
|
||||
\echo '';
|
||||
\echo '========================================';
|
||||
\echo '最终总结报告';
|
||||
\echo '========================================';
|
||||
|
||||
SELECT
|
||||
'✅ Schema隔离迁移验证完成' AS summary,
|
||||
(SELECT COUNT(*) FROM platform_schema.users) || ' users' AS platform,
|
||||
(SELECT COUNT(*) FROM aia_schema.projects) || ' projects, ' ||
|
||||
(SELECT COUNT(*) FROM aia_schema.conversations) || ' conversations' AS aia,
|
||||
(SELECT COUNT(*) FROM pkb_schema.knowledge_bases) || ' knowledge_bases, ' ||
|
||||
(SELECT COUNT(*) FROM pkb_schema.documents) || ' documents' AS pkb;
|
||||
|
||||
\echo '';
|
||||
\echo '========================================';
|
||||
\echo '✅ 所有验证完成!';
|
||||
\echo '========================================';
|
||||
\echo '下一步:';
|
||||
\echo '1. 更新Prisma配置(schema.prisma)';
|
||||
\echo '2. 生成Prisma Client';
|
||||
\echo '3. 更新代码以使用新Schema';
|
||||
\echo '4. 运行应用测试';
|
||||
\echo '========================================';
|
||||
|
||||
-- ========================================
|
||||
-- 完成
|
||||
-- ========================================
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user