-- 商城数据库脚本验证测试 -- 这个脚本用于验证数据库创建和模拟数据插入是否正常工作 -- 1. 检查必要的扩展是否可用 DO $$ BEGIN -- 检查 uuid-ossp 扩展 IF NOT EXISTS (SELECT 1 FROM pg_extension WHERE extname = 'uuid-ossp') THEN RAISE NOTICE 'uuid-ossp 扩展未安装,请先执行: CREATE EXTENSION IF NOT EXISTS "uuid-ossp";'; ELSE RAISE NOTICE 'uuid-ossp 扩展已安装 ✓'; END IF; -- 检查 pgcrypto 扩展 IF NOT EXISTS (SELECT 1 FROM pg_extension WHERE extname = 'pgcrypto') THEN RAISE NOTICE 'pgcrypto 扩展未安装,请先执行: CREATE EXTENSION IF NOT EXISTS "pgcrypto";'; ELSE RAISE NOTICE 'pgcrypto 扩展已安装 ✓'; END IF; END $$; -- 2. 检查 ak_users 表是否存在 DO $$ BEGIN IF EXISTS (SELECT 1 FROM information_schema.tables WHERE table_schema = 'public' AND table_name = 'ak_users') THEN RAISE NOTICE 'ak_users 表已存在 ✓'; -- 检查 ak_users 表结构 IF EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema = 'public' AND table_name = 'ak_users' AND column_name = 'auth_id' AND data_type = 'uuid') THEN RAISE NOTICE 'ak_users.auth_id 字段类型正确 (uuid) ✓'; ELSE RAISE NOTICE 'ak_users.auth_id 字段类型可能不正确,应为 uuid 类型'; END IF; ELSE RAISE NOTICE 'ak_users 表不存在,需要先创建或从现有系统迁移'; END IF; END $$; -- 3. 语法验证 - 测试典型的 RLS 策略语法 DO $$ BEGIN RAISE NOTICE '开始验证 RLS 策略语法...'; -- 测试 UUID 比较语法 BEGIN -- 这个查询应该能正常解析 PERFORM 1 WHERE '00000000-0000-0000-0000-000000000000'::uuid = '00000000-0000-0000-0000-000000000000'::uuid; RAISE NOTICE 'UUID 比较语法正确 ✓'; EXCEPTION WHEN OTHERS THEN RAISE NOTICE 'UUID 比较语法错误: %', SQLERRM; END; RAISE NOTICE 'RLS 策略语法验证完成 ✓'; END $$; -- 4. 检查商城表是否已存在 DO $$ DECLARE table_count INTEGER; mall_tables TEXT[] := ARRAY[ 'ml_user_profiles', 'ml_user_addresses', 'ml_shopping_cart', 'ml_merchants', 'ml_categories', 'ml_products', 'ml_product_images', 'ml_product_variants', 'ml_inventory', 'ml_orders', 'ml_order_items', 'ml_reviews', 'ml_user_behavior', 'ml_promotions', 'ml_coupons', 'ml_user_coupons', 'ml_delivery_info', 'ml_system_config' ]; tbl TEXT; BEGIN table_count := 0; FOREACH tbl IN ARRAY mall_tables LOOP IF EXISTS (SELECT 1 FROM information_schema.tables WHERE table_schema = 'public' AND table_name = tbl) THEN table_count := table_count + 1; END IF; END LOOP; RAISE NOTICE '商城表检查: %/% 个表已存在', table_count, array_length(mall_tables, 1); IF table_count = 0 THEN RAISE NOTICE '商城表尚未创建,可以执行 complete_mall_database.sql'; ELSIF table_count = array_length(mall_tables, 1) THEN RAISE NOTICE '所有商城表已存在 ✓'; ELSE RAISE NOTICE '部分商城表已存在,建议检查现有表结构'; END IF; END $$; -- 5. 模拟数据检查 DO $$ DECLARE user_count INTEGER; profile_count INTEGER; product_count INTEGER; BEGIN -- 检查用户数据 SELECT COUNT(*) INTO user_count FROM public.ak_users WHERE username IN ('admin', 'merchant1', 'merchant2', 'customer1', 'customer2', 'customer3', 'driver1', 'driver2'); RAISE NOTICE '测试用户数量: %', user_count; -- 检查商城相关数据(如果表存在) IF EXISTS (SELECT 1 FROM information_schema.tables WHERE table_schema = 'public' AND table_name = 'ml_user_profiles') THEN SELECT COUNT(*) INTO profile_count FROM public.ml_user_profiles; RAISE NOTICE '用户档案数量: %', profile_count; END IF; IF EXISTS (SELECT 1 FROM information_schema.tables WHERE table_schema = 'public' AND table_name = 'ml_products') THEN SELECT COUNT(*) INTO product_count FROM public.ml_products; RAISE NOTICE '商品数量: %', product_count; END IF; END $$; -- 验证完成 SELECT '数据库验证测试完成' AS status;