Files
medical-mall/pages/user/test/USER_AUTH_TRIGGER.sql
2026-01-30 16:17:13 +08:00

90 lines
3.0 KiB
PL/PgSQL
Raw 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.
-- ============================================
-- 自动创建 ak_users 记录的触发器
-- ============================================
-- 位置pages/user/test/USER_AUTH_TRIGGER.sql
-- 用途:当 auth.users 表中创建新用户时,自动在 ak_users 表中创建对应的业务资料记录
--
-- 执行方式:
-- 在 Supabase Dashboard 的 SQL Editor 中执行此文件
-- 需要 superuser 权限Dashboard 默认有)
-- ============================================
-- 触发器函数 `public.handle_new_user()` 的定义在 `USER_AUTH_SCHEMA.sql` 中完成。
-- 这里仅负责在 auth.users 上创建触发器(避免重复定义函数导致版本不一致)。
-- 兼容处理:如果 `public.handle_new_user()` 尚未创建(例如先执行了本文件),则在此处补齐创建。
-- 说明:这里采用“存在则跳过”的创建方式,不会覆盖已有实现。
DO $$
BEGIN
IF NOT EXISTS (
SELECT 1
FROM pg_proc p
JOIN pg_namespace n ON n.oid = p.pronamespace
WHERE n.nspname = 'public'
AND p.proname = 'handle_new_user'
) THEN
EXECUTE $fn$
CREATE FUNCTION public.handle_new_user()
RETURNS TRIGGER
LANGUAGE plpgsql
SECURITY DEFINER
SET search_path = public
AS $body$
BEGIN
BEGIN
INSERT INTO public.ak_users (id, email, username)
VALUES (
NEW.id,
NEW.email,
COALESCE(SPLIT_PART(NEW.email, '@', 1), 'user')
)
ON CONFLICT (id) DO NOTHING;
EXCEPTION WHEN OTHERS THEN
RAISE WARNING 'handle_new_user failed: %', SQLERRM;
END;
RETURN NEW;
END;
$body$;
$fn$;
END IF;
END $$;
-- 在 auth.users 表上创建触发器
-- 注意:这个触发器会在每次 auth.users 插入新记录时自动执行
DO $$
BEGIN
IF NOT EXISTS (SELECT 1 FROM pg_trigger WHERE tgname = 'on_auth_user_created') THEN
EXECUTE 'CREATE TRIGGER on_auth_user_created AFTER INSERT ON auth.users FOR EACH ROW EXECUTE FUNCTION public.handle_new_user()';
END IF;
END $$;
-- ============================================
-- 验证触发器
-- ============================================
-- 执行以下查询验证触发器是否创建成功:
-- SELECT * FROM pg_trigger WHERE tgname = 'on_auth_user_created';
-- SELECT * FROM pg_proc WHERE proname = 'handle_new_user';
-- ============================================
-- 测试触发器(可选)
-- ============================================
-- 注意:以下测试代码会创建一个测试用户,执行前请确认
--
-- 1. 通过 Supabase Auth API 注册一个新用户
-- 2. 检查 ak_users 表中是否自动创建了对应的记录
--
-- 或者手动测试(需要 admin 权限):
-- INSERT INTO auth.users (id, email, encrypted_password, email_confirmed_at, created_at, updated_at)
-- VALUES (
-- gen_random_uuid(),
-- 'test@example.com',
-- crypt('password', gen_salt('bf')),
-- NOW(),
-- NOW(),
-- NOW()
-- );
--
-- 然后检查 ak_users 表:
-- SELECT * FROM ak_users WHERE email = 'test@example.com';