[아웃소싱] 트리거 삭제하고 다시 만들기

y1nlog·2025년 2월 27일
0
// public.users 테이블 생성
create table public.users (
  id uuid primary key references auth.users(id) on delete cascade,
  email text unique not null,
  nickname text,
  created_at timestamp not null
);

// 트리거 함수 생성
create function sync_users_to_public()
returns trigger as $$
begin
  insert into public.users (id, email, nickname, created_at)
  values (
    new.id, 
    new.email, 
    new.raw_user_meta_data->>'nickname', 
    new.created_at
  )
  on conflict (id) do update 
  set nickname = excluded.nickname;
  return new;
end;
$$ language plpgsql security definer;

// 트리거 생성
create trigger on_auth_user_created
after insert on auth.users
for each row execute function sync_users_to_public();

트리거 삭제하기

트리거는 auth.users 테이블에 걸려 있으므로 아래와 같은 명령어를 사용해 트리거를 삭제할 수 있다.

DROP TRIGGER on_auth_user_created ON auth.users;

트리거 함수 삭제

해당 트리거와 관련된 트리거 함수(sync_users_to_public)도 더 이상 사용하지 않으려면 함수도 삭제할 수 있다.
함수는 public 스키마에 존재할 가능성이 크기 때문에 다음 명령어로 함수를 삭제하면 된다.

DROP FUNCTION sync_users_to_public();

트리거 삭제 후 해당 트리거의 동작이 더 이상 발생하지 않으므로, 이후 auth.users 테이블에 새 사용자가 추가되더라도 public.users 테이블에 동기화되지 않는다.


배경

변경가능한 정보인 닉네임이 auth 스키마에 있음으로서 추가적인 동기화 로직이 필요하다고 생각되어 테이블 구조 변경 후, 회원가입 시 닉네임을 auth가 아닌 public에만 추가하는 로직으로 수정하고자 함.

기존 걸어둔 트리거에 닉네임이 들어가 있어, 트리거 및 테이블 전체 삭제 후 새로 진행하였으나

supabase.auth.signUp 처리 이후, 새로 세팅한 INSERT 실행 시 오류 발생.
아예 추가되지 않거나, 한번에 5~6개 rows 동일한 유저가 추가되거나...

그래서 트리거로 회원가입시 불변되는 정보만 동기화되도록 세팅코자 함.

새로 만들기

실행계획

  1. sync_users_to_public 트리거 함수는 auth.users 테이블에 데이터가 삽입될 때 public.users 테이블에 id, email, created_at을 삽입한다.
  1. nickname과 profile_img_url은 초기값인 null로 설정되며, 이후 별도로 업데이트된다.
  1. 트리거는 auth.users에 데이터가 삽입될 때마다 실행된다.
  1. JavaScript에서 nickname과 profile_img_url을 별도로 받아서 public.users 테이블을 업데이트한다.

트리거 함수 수정

요구사항

auth.users에 새로 가입한 사용자의 정보를 public.users 테이블에 삽입할 때,
nicknameprofile_img_urlnull로 초기화하고,
id, email, created_at만 자동으로 public.users에 입력되도록 한다.

트리거 함수

create function sync_users_to_public()
returns trigger as $$
begin
-- 'auth.users'에 정보가 삽입되면, 'public.users' 테이블에 nickname과 기본 정보를 삽입
  insert into public.users (id, email, created_at, nickname, profile_img_url)
  values (
    new.id, 
    new.email, 
    new.created_at
    null,
    null
  )
  return new;
end;
$$ language plpgsql security definer;
  • ref.
    on conflict (id) do nothing; -- id가 이미 존재하면 아무 것도 하지 않음
    set nickname = excluded.nickname; -- 기존 값이 있으면 nickname을 업데이트

트리거 생성

auth.users 테이블에 사용자가 추가될 때마다 public.users 테이블에 자동으로 정보를 삽입하는 트리거를 생성한다.

create trigger on_auth_user_created
after insert on auth.users
for each row execute function sync_users_to_public();

적용하기


아니 코드의 상태가? 튜터님 피드백도 받았는데 이게 웬 오류지

사실 8번째줄에 ,가 없었다.

이제 안 사실이지만 내가 적용시켰던 트리거함수는 여기서 확인이 되더라.

최종 코드는 이렇게

콤마도 잘 들어갔고, conflict 구문은 넣을 필요도 없었다. 왜냐면 do nothing이었으니 필요가 없지...

이제 동기화된 public.users 데이터에 닉네임도 잘 들어가는 걸 볼 수 있다.

profile
FrontEnd Developer

0개의 댓글