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

119 lines
3.6 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.
-- =====================================================
-- 快速修复视图策略错误
-- 解决 "is not a table" 错误
-- =====================================================
-- 删除可能错误创建在视图上的策略
DO $$
DECLARE
r RECORD;
BEGIN
RAISE NOTICE '🧹 检查并删除视图上的错误策略';
-- 尝试删除可能错误创建在视图上的策略
-- 注意:这些命令可能会失败,但不会影响系统
BEGIN
DROP POLICY IF EXISTS "Users can view role info with restrictions" ON public.user_roles_with_email;
RAISE NOTICE ' 删除了视图策略: user_roles_with_email';
EXCEPTION WHEN OTHERS THEN
RAISE NOTICE ' 视图策略不存在或已删除: user_roles_with_email';
END;
-- 检查其他可能的视图策略
FOR r IN
SELECT schemaname, tablename, policyname
FROM pg_policies
WHERE schemaname = 'public'
AND tablename IN (
SELECT table_name
FROM information_schema.views
WHERE table_schema = 'public'
)
LOOP
BEGIN
EXECUTE format('DROP POLICY IF EXISTS %I ON %I.%I',
r.policyname, r.schemaname, r.tablename);
RAISE NOTICE ' 删除了视图策略: %.%', r.tablename, r.policyname;
EXCEPTION WHEN OTHERS THEN
RAISE NOTICE ' 无法删除策略: %.%', r.tablename, r.policyname;
END;
END LOOP;
RAISE NOTICE '✅ 视图策略清理完成';
END $$;
-- 确保视图存在且正确
DO $$
BEGIN
RAISE NOTICE '🔍 检查视图状态';
-- 重新创建视图(如果需要)
DROP VIEW IF EXISTS public.user_roles_with_email CASCADE;
CREATE OR REPLACE VIEW public.user_roles_with_email AS
SELECT
ur.id,
ur.user_id,
ur.role,
ur.class_id,
ur.school_id,
ur.created_at,
ur.updated_at,
au.email,
au.raw_user_meta_data->>'user_role' as metadata_role,
CASE
WHEN ur.role = au.raw_user_meta_data->>'user_role' THEN true
ELSE false
END as role_synced
FROM public.user_roles ur
LEFT JOIN auth.users au ON au.id = ur.user_id;
RAISE NOTICE '✅ 视图重建完成';
END $$;
-- 验证系统状态
DO $$
DECLARE
view_count INTEGER;
table_count INTEGER;
policy_count INTEGER;
BEGIN
RAISE NOTICE '🔍 验证系统状态';
-- 检查视图
SELECT COUNT(*) INTO view_count
FROM information_schema.views
WHERE table_schema = 'public'
AND table_name = 'user_roles_with_email';
-- 检查表
SELECT COUNT(*) INTO table_count
FROM information_schema.tables
WHERE table_schema = 'public'
AND table_name = 'user_roles';
-- 检查策略(应该只在表上,不在视图上)
SELECT COUNT(*) INTO policy_count
FROM pg_policies
WHERE schemaname = 'public'
AND tablename = 'user_roles';
RAISE NOTICE '📊 系统状态:';
RAISE NOTICE ' - user_roles_with_email 视图: %',
CASE WHEN view_count > 0 THEN '存在' ELSE '不存在' END;
RAISE NOTICE ' - user_roles 表: %',
CASE WHEN table_count > 0 THEN '存在' ELSE '不存在' END;
RAISE NOTICE ' - user_roles 表策略数量: %', policy_count;
IF view_count > 0 AND table_count > 0 THEN
RAISE NOTICE '🎉 系统状态正常!';
ELSE
RAISE NOTICE '⚠️ 系统可能需要重新初始化';
END IF;
END $$;
-- 完成消息
SELECT
'✅ 视图策略错误已修复' as status,
'视图不支持RLS策略权限由底层表控制' as message;