-- ============================================ -- 自动创建 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';