Supabaseでサインアップ時に自動でプロフィールを作りたい
Supabaseでユーザーを作るとauth.usersテーブルにレコードが追加される。サービス内でプロフィール用のデータを持ちたい場合はpublicスキーマ下にprofilesのようなテーブルを作るが、これをサインアップ時に自動的に行いたい場合がある。
また、連携ログインで他サービスから取得された名前などの情報やsupabase.auth.signUp()時に渡した情報を使ってプロフィールを作りたい場合もある。
Supabaseではauthスキーマ下のデータはセキュリティのために取得やJOINができないため、これを行うにはトリガーを作ることで対処が可能。
これの利点として、ユーザー作成→プロフィール作成みたいな感じで順番に関数を呼ぶような実装だとエラーが生じてユーザーは居るけどプロフィールがないみたいな状態になる可能性があるが、トリガーなら同一トランザクションで実行され、プロフィールの作成に失敗するとユーザーも作成されなくなるため、より整合性を取りやすい。
やり方は以下の通り。単純に関数とトリガーを作ってそれで処理するようにする。
code:sql
-- プロフィールテーブル
CREATE TABLE public.profiles (
id UUID NOT NULL PRIMARY KEY DEFAULT gen_random_uuid(),
user_id UUID NOT NULL UNIQUE REFERENCES auth.users ON DELETE CASCADE,
display_name TEXT,
PRIMARY KEY (id)
);
-- ユーザー作成時(サインアップ)に自動的にプロフィールを作成するトリガー
CREATE OR REPLACE FUNCTION
public.create_profile_on_signup()
RETURNS TRIGGER AS
$$
BEGIN
INSERT INTO public.profiles (user_id, display_name)
VALUES (
NEW.id,
-- raw_user_meta_dataのJSONの中に他サービスからの情報やsignUp時のデータが入っている
NEW.raw_user_meta_data ->> 'display_name'
);
RETURN NEW;
END
$$
LANGUAGE plpgsql
SET search_path = ''
SECURITY DEFINER;
CREATE TRIGGER
create_profile_on_signup
AFTER INSERT ON auth.users
FOR EACH ROW
EXECUTE PROCEDURE public.create_profile_on_signup();