Files
medical-mall/docs/sql/10_schema/99_soft_delete_migration_v1.sql

80 lines
4.1 KiB
SQL
Raw Permalink 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.
-- =====================================================================================
-- Migration: 全量软删除 (Soft Delete) 基础设施补齐
-- 位置docs/sql/10_schema/99_soft_delete_migration_v1.sql
-- 对象类型ALTER TABLE
-- 说明:为所有核心业务表补齐 deleted_at, deleted_by, restored_at, restored_by 字段
-- 涵盖:权限、配置、内容、装修、物流、分销、财务、客服、营销、商品、用户、订单
-- =====================================================================================
DO $$
DECLARE
-- 需补齐软删除字段的业务表全量清单
t_names TEXT[] := ARRAY[
-- 1. 系统与权限 (Auth/System)
'ak_roles', 'ak_permissions', 'ak_admin_roles', 'ak_role_permissions', 'ml_system_configs',
-- 2. 内容与装修 (CMS/Decoration)
'ml_articles', 'ml_article_categories', 'ak_diy_pages',
-- 3. 物流资源 (Delivery)
'ml_delivery_staff', 'ml_delivery_stations', 'ak_shipping_templates',
-- 4. 分销体系 (Distribution)
'ak_distribution_agents', 'ak_distribution_divisions',
'ak_distribution_agent_applications', 'ak_distribution_division_applications',
'ak_promoter_relations', 'ak_commission_logs', 'ak_distribution_level', 'ak_distribution_config',
-- 5. 财务管理 (Finance)
'ml_extract', 'ml_invoices', 'ml_user_bill', 'ml_user_recharge',
-- 6. 客服系统 (Kefu)
'ml_kefu_accounts', 'ml_kefu_words', 'ml_kefu_word_categories', 'ml_kefu_auto_replies', 'ml_kefu_feedbacks',
-- 7. 营销活动 (Marketing)
'ak_advanced_marketing', 'ak_bargain_groupbuy', 'ak_live_products', 'ak_lottery_live',
'ak_marketing_checkin_configs', 'ak_marketing_newcomer_config', 'ak_marketing_signin_logs',
'ak_member_management', 'ak_recharge_management', 'ak_signin_configs',
-- 8. 商品中心 (Product)
'ml_products', 'ml_product_skus', 'ml_categories',
'ak_product_labels', 'ak_product_member_prices', 'ak_product_protections', 'ak_product_templates',
-- 9. 用户管理 (User)
'ak_user_labels', 'ak_user_groups', 'ak_user_levels', 'ak_users',
-- 10. 订单中心 (Order)
'ml_orders'
];
t_name TEXT;
BEGIN
FOREACH t_name IN ARRAY t_names LOOP
-- 检查表是否存在
IF EXISTS (SELECT 1 FROM information_schema.tables WHERE table_schema = 'public' AND table_name = t_name) THEN
-- 1. 增加 deleted_at 字段
IF NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema = 'public' AND table_name = t_name AND column_name = 'deleted_at') THEN
EXECUTE format('ALTER TABLE public.%I ADD COLUMN deleted_at TIMESTAMPTZ DEFAULT NULL', t_name);
END IF;
-- 2. 增加 deleted_by 字段
IF NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema = 'public' AND table_name = t_name AND column_name = 'deleted_by') THEN
EXECUTE format('ALTER TABLE public.%I ADD COLUMN deleted_by UUID REFERENCES public.ak_users(id) ON DELETE SET NULL', t_name);
END IF;
-- 3. 增加 restored_at 字段
IF NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema = 'public' AND table_name = t_name AND column_name = 'restored_at') THEN
EXECUTE format('ALTER TABLE public.%I ADD COLUMN restored_at TIMESTAMPTZ DEFAULT NULL', t_name);
END IF;
-- 4. 增加 restored_by 字段
IF NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema = 'public' AND table_name = t_name AND column_name = 'restored_by') THEN
EXECUTE format('ALTER TABLE public.%I ADD COLUMN restored_by UUID REFERENCES public.ak_users(id) ON DELETE SET NULL', t_name);
END IF;
-- 5. 建立软删除索引
EXECUTE format('CREATE INDEX IF NOT EXISTS %I ON public.%I (deleted_at) WHERE deleted_at IS NULL', 'idx_' || t_name || '_soft_delete', t_name);
END IF;
END LOOP;
END $$;