-- =================================================================== -- 强力清理脚本:彻底删除所有新设计的全局配置表 -- 保留原有的 ak_global_config 表(单表+key后缀设计) -- =================================================================== -- 注意:此脚本会强制删除所有可能的新设计表和对象 -- 执行前请确保已备份重要数据! -- 首先检查当前存在的表 DO $$ DECLARE rec RECORD; BEGIN RAISE NOTICE '========================================'; RAISE NOTICE '当前存在的配置相关表:'; RAISE NOTICE '========================================'; FOR rec IN SELECT table_name FROM information_schema.tables WHERE table_schema = 'public' AND (table_name LIKE '%config%' OR table_name LIKE '%language%') ORDER BY table_name LOOP RAISE NOTICE '表: %', rec.table_name; END LOOP; RAISE NOTICE '========================================'; END $$; -- 1. 删除所有相关函数(包括可能的不同版本) -- 删除新设计的函数 DROP FUNCTION IF EXISTS public.get_configs_by_language(VARCHAR); DROP FUNCTION IF EXISTS public.get_config_by_language(VARCHAR); DROP FUNCTION IF EXISTS public.get_config_value(VARCHAR, VARCHAR); DROP FUNCTION IF EXISTS public.get_hot_searches(VARCHAR); -- 删除基于现有表的优化函数(来自 optimize_existing_global_config.sql) DROP FUNCTION IF EXISTS public.get_global_config_by_language(VARCHAR); DROP FUNCTION IF EXISTS public.get_global_config_value(VARCHAR, VARCHAR); DROP FUNCTION IF EXISTS public.get_company_config(VARCHAR); DROP FUNCTION IF EXISTS public.get_hot_search_keywords(VARCHAR); DROP FUNCTION IF EXISTS public.get_social_media_config(VARCHAR); -- 2. 删除所有相关视图 -- 删除新设计的视图 DROP VIEW IF EXISTS public.vw_global_config_multilingual CASCADE; DROP VIEW IF EXISTS public.vw_config_by_language CASCADE; -- 删除基于现有表的优化视图(来自 optimize_existing_global_config.sql) DROP VIEW IF EXISTS public.vw_global_config_by_language CASCADE; -- 3. 删除所有可能的触发器 DROP TRIGGER IF EXISTS update_ak_global_config_updated_at ON public.ak_global_config; DROP TRIGGER IF EXISTS update_ak_global_configs_updated_at ON public.ak_global_configs; DROP TRIGGER IF EXISTS update_ak_global_config_translations_updated_at ON public.ak_global_config_translations; DROP TRIGGER IF EXISTS update_ak_config_main_updated_at ON public.ak_config_main; DROP TRIGGER IF EXISTS update_ak_config_translations_updated_at ON public.ak_config_translations; -- 4. 强制删除所有可能的新设计表(按依赖顺序) -- 注意:保留 ak_languages 表,因为它与 ak_contents 系统有关联 DROP TABLE IF EXISTS public.ak_global_config_translations CASCADE; DROP TABLE IF EXISTS public.ak_config_translations CASCADE; DROP TABLE IF EXISTS public.ak_global_configs CASCADE; DROP TABLE IF EXISTS public.ak_config_main CASCADE; -- DROP TABLE IF EXISTS public.ak_languages CASCADE; -- 保留现有语言表 DROP TABLE IF EXISTS public.ak_language CASCADE; DROP TABLE IF EXISTS public.languages CASCADE; -- 5. 删除可能存在的序列(保留 ak_languages 相关序列) DROP SEQUENCE IF EXISTS public.ak_global_configs_id_seq CASCADE; DROP SEQUENCE IF EXISTS public.ak_config_main_id_seq CASCADE; DROP SEQUENCE IF EXISTS public.ak_global_config_translations_id_seq CASCADE; DROP SEQUENCE IF EXISTS public.ak_config_translations_id_seq CASCADE; -- DROP SEQUENCE IF EXISTS public.ak_languages_id_seq CASCADE; -- 保留现有语言表序列 -- 6. 删除可能存在的类型定义 DROP TYPE IF EXISTS public.config_type CASCADE; DROP TYPE IF EXISTS public.language_code CASCADE; -- 7. 验证清理结果 DO $$ DECLARE table_count INTEGER; function_count INTEGER; view_count INTEGER; trigger_count INTEGER; sequence_count INTEGER; rec RECORD; BEGIN -- 检查剩余的配置相关表(排除现有的 ak_languages 表) SELECT COUNT(*) INTO table_count FROM information_schema.tables WHERE table_schema = 'public' AND table_name IN ( 'ak_global_configs', 'ak_global_config_translations', 'ak_config_main', 'ak_config_translations', 'ak_language', 'languages' ); -- 检查剩余的相关函数 SELECT COUNT(*) INTO function_count FROM information_schema.routines WHERE routine_schema = 'public' AND routine_name IN ( 'get_configs_by_language', 'get_config_by_language', 'get_config_value', 'get_hot_searches', 'get_global_config_by_language', 'get_global_config_value', 'get_company_config', 'get_hot_search_keywords', 'get_social_media_config' ); -- 检查剩余的相关视图 SELECT COUNT(*) INTO view_count FROM information_schema.views WHERE table_schema = 'public' AND table_name IN ( 'vw_global_config_multilingual', 'vw_global_config_by_language', 'vw_config_by_language' ); -- 检查剩余的相关序列 SELECT COUNT(*) INTO sequence_count FROM information_schema.sequences WHERE sequence_schema = 'public' AND sequence_name LIKE '%config%'; RAISE NOTICE '========================================'; RAISE NOTICE '强力清理结果检查:'; RAISE NOTICE '剩余新设计表数量: %', table_count; RAISE NOTICE '剩余相关函数数量: %', function_count; RAISE NOTICE '剩余相关视图数量: %', view_count; RAISE NOTICE '剩余相关序列数量: %', sequence_count; RAISE NOTICE '========================================'; -- 显示剩余的配置相关表(ak_languages 是现有系统表,会保留) RAISE NOTICE '当前剩余的配置相关表:'; FOR rec IN SELECT table_name FROM information_schema.tables WHERE table_schema = 'public' AND (table_name LIKE '%config%' OR table_name LIKE '%language%') ORDER BY table_name LOOP RAISE NOTICE ' - %', rec.table_name; END LOOP; -- 特别说明保留的表 IF EXISTS (SELECT 1 FROM information_schema.tables WHERE table_schema = 'public' AND table_name = 'ak_languages') THEN RAISE NOTICE ' ℹ️ ak_languages 表已保留(与 ak_contents 系统关联)'; END IF; IF table_count = 0 AND function_count = 0 AND view_count = 0 THEN RAISE NOTICE '✅ 全面清理完成!所有新设计的表结构和优化函数已删除'; RAISE NOTICE '现在可以重新执行 optimize_existing_global_config.sql 创建新的优化函数'; ELSE RAISE NOTICE '⚠️ 还有一些对象未删除,可能需要手动处理'; END IF; RAISE NOTICE '========================================'; END $$; -- 8. 检查原有表是否还存在并显示其结构 DO $$ DECLARE original_table_exists BOOLEAN; column_info RECORD; BEGIN SELECT EXISTS ( SELECT 1 FROM information_schema.tables WHERE table_schema = 'public' AND table_name = 'ak_global_config' AND table_type = 'BASE TABLE' ) INTO original_table_exists; IF original_table_exists THEN RAISE NOTICE '✅ 原有的 ak_global_config 表仍然存在'; -- 显示表结构 RAISE NOTICE '表结构:'; FOR column_info IN SELECT column_name, data_type, is_nullable, column_default FROM information_schema.columns WHERE table_schema = 'public' AND table_name = 'ak_global_config' ORDER BY ordinal_position LOOP RAISE NOTICE ' - % (% %)', column_info.column_name, column_info.data_type, CASE WHEN column_info.is_nullable = 'NO' THEN 'NOT NULL' ELSE 'NULL' END; END LOOP; -- 显示配置数量 RAISE NOTICE '当前配置数量: %', ( SELECT COUNT(*) FROM public.ak_global_config WHERE is_active = true ); -- 显示一些示例配置 RAISE NOTICE '示例配置(前5个):'; FOR column_info IN SELECT config_key, config_value FROM public.ak_global_config WHERE is_active = true ORDER BY config_key LIMIT 5 LOOP RAISE NOTICE ' - %: %', column_info.config_key, LEFT(column_info.config_value, 50); END LOOP; ELSE RAISE NOTICE '❌ 警告:原有的 ak_global_config 表不存在!'; RAISE NOTICE '您可能需要:'; RAISE NOTICE '1. 从备份恢复原有表'; RAISE NOTICE '2. 或者执行 init_company_global_config.sql 重新创建'; END IF; END $$; -- 9. 可选:重新创建基础触发器函数(如果被删除了) CREATE OR REPLACE FUNCTION update_updated_at_column() RETURNS TRIGGER AS $$ BEGIN NEW.updated_at = NOW(); RETURN NEW; END; $$ LANGUAGE plpgsql; -- 10. 可选:重新为原有表创建触发器(如果被删除了) DO $$ BEGIN IF EXISTS (SELECT 1 FROM information_schema.tables WHERE table_schema = 'public' AND table_name = 'ak_global_config') THEN DROP TRIGGER IF EXISTS update_ak_global_config_updated_at ON public.ak_global_config; CREATE TRIGGER update_ak_global_config_updated_at BEFORE UPDATE ON public.ak_global_config FOR EACH ROW EXECUTE FUNCTION update_updated_at_column(); RAISE NOTICE '✅ 为原有表重新创建了更新触发器'; END IF; END $$; -- 完成提示 DO $$ BEGIN RAISE NOTICE '========================================'; RAISE NOTICE '全面清理脚本执行完成!'; RAISE NOTICE '已删除所有新设计的表、函数、视图等对象'; RAISE NOTICE '========================================'; RAISE NOTICE '后续建议步骤:'; RAISE NOTICE '1. 验证原有的 ak_global_config 表功能正常'; RAISE NOTICE '2. 确认 ak_languages 表与 ak_contents 系统关联正常'; RAISE NOTICE '3. 重新执行 optimize_existing_global_config.sql 创建优化查询函数'; RAISE NOTICE '4. 测试前端配置加载功能'; RAISE NOTICE '5. 如果原有表不存在,执行 init_company_global_config.sql'; RAISE NOTICE '========================================'; END $$;