Написать тригер в Postgres, который принимает id пользователя (user_id)

Рейтинг: 1Ответов: 1Опубликовано: 15.08.2023

При создании нового пользователя в Postgres у меня стоит триггер который автоматически создает ему чат (по типу saved messages в telegram).

У меня также в бд есть таблица chat_members, которая хранит участников чатов связью много ко многим пользователей и чатов.

Необходимо написать триггер, который при создании любого чата будет автоматически записывать в таблицу chat_members его создателя, но я не знаю как передать id пользователя, так как в таблице chats нет такой колонки. Одним из решений является добавление колонки created_by в таблице chat, и запись туда создателя чата, а потом триггер берет этот id и создает запись в таблице chat_members.

Моя схема бд в Supabase:

Supabase db schema

Сам триггер и функция которая создает чат:

create function public.create_user_saved_chat()
returns public.chats as $$
declare
    new_chat public.chats;
begin
    insert into public.chats (type, name) 
    values ('saved', 'Saved chat')
    returning * into new_chat;
    
    return new_chat; 
end;
$$ language plpgsql security definer;
create function public.handle_new_user()
returns trigger as $$
begin
    perform public.create_user_saved_chat();

    return new;
end;
$$ language plpgsql security definer;

create trigger on_auth_user_created
  after insert on auth.users
  for each row execute procedure public.handle_new_user();

Ответы

▲ 0

Допустим, что в таблице auth.users ID пользователя хранится в поле user_id, тогда:

В функции public.handle_new_user добавляем переменную и присваиваем ей значение из NEW.chat_id(значение поля после вставки записи).

NEW это специальная переменная типа Record. Переменная содержит новую строку базы данных для команд INSERT/UPDATE в триггерах уровня строки. Более подробно о триггерах в PostgreSQL

В функцию create_user_saved_chat добавляем входящий параметр iduser.

При вызове create_user_saved_chat из функции handle_new_user передаем user_id

В функции create_user_saved_chat добавляем insert нужных нам данных в таблицу chat_members, так как нам теперь известно и id нового чата и id пользователя

create function public.create_user_saved_chat(iduser integer)
returns public.chats as $$
declare
    new_chat public.chats;
begin
    insert into public.chats (type, name) 
    values ('saved', 'Saved chat')
    returning * into new_chat; -- Тут лежит созданная строка
    
    insert into public.chat_members (chat_id, user_id)
    values (new_chat.id, iduser); -- Сохраняем
    return new_chat; 
end;
$$ language plpgsql security definer;

create function public.handle_new_user()
returns trigger as $$
declare 
  IDUSER INTEGER = NEW.user_id; -- ID созданного пользователя
begin
    perform public.create_user_saved_chat(IDUSER);

    return new;
end;
$$ language plpgsql security definer;