Files
akmon/force_cleanup_new_tables.sql
2026-01-20 08:04:15 +08:00

264 lines
10 KiB
PL/PgSQL
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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.
-- ===================================================================
-- 强力清理脚本:彻底删除所有新设计的全局配置表
-- 保留原有的 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 $$;