Вопрос или проблема
Я создаю проект на Next.js, у меня установлен и хорошо работает Supabase для регистрации/входа и т.д.
Я начал создавать функции, одну из которых для переноса данных из таблицы auth.user в таблицу public.user.
Это не сработало, поэтому я создал таблицу логирования, чтобы проверить, смогу ли я взять данные из auth.users и вставить их в таблицу логирования по мере создания auth.user.
Это тоже не работает.
Триггер и функция иногда срабатывают, когда я вручную вставляю нового пользователя в таблицу auth. Эти пользователи неподтвержденные.
Пользователи, которых я создаю через API JS, автоматически подтверждаются (я отключил необходимость подтверждения).
Так что это действительно запутанная ситуация, я смотрел на это в течение нескольких часов и не понимаю, почему это происходит.
Мой код
CREATE TRIGGER handle_auth_user
AFTER INSERT ON auth.users
FOR EACH ROW
EXECUTE FUNCTION on_auth_user_created();
FUNCTION on_auth_user_created()
RETURNS TRIGGER AS $$
BEGIN
INSERT INTO logging (id)
VALUES (NEW.id);
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
В этой функции выше ^ Всё работает, если в функции нет никаких вставок. Например, повышенное уведомление работает. Но как только происходят вставки, API JS не позволяет мне добавлять пользователей. И большинство времени я не могу вставить их вручную.
Пробовал предоставить публичный доступ и т.д. Пробовал несколько различных таблиц для вставки.
Есть видео на YouTube, которое подтверждает, что это должно работать. Возможно, мне придется начать с нуля и попробовать снова, но я совершенно запутался.
Есть ли у вас идеи?
Спасибо
Пробовал триггеры и функции. Ожидал, что при создании Auth.user вставка в любую таблицу будет возможна.
Ответ или решение
Проблема, с которой вы столкнулись, связана с тем, как триггеры и функции в PostgreSQL взаимодействуют с процессом вставки записей в таблицу auth.users
. Давайте разберем вашу ситуацию и предложим возможные решения.
1. Проверка ваших триггеров и функций
Ваш триггер и функция выглядят корректно на первый взгляд, однако есть несколько моментов, которые стоит учесть:
-
Права доступа. Убедитесь, что у пользователя, который вызывает функцию, есть необходимые права для вставки в таблицу
logging
. Если пользователь не имеет доступа, это может привести к неудаче вставки и, как следствие, блокировке процесса регистрации. -
Исключения в функции. Если в вашей функции происходит ошибка (например, при вставке в
logging
), это может привести к отмене всей операции вставки вauth.users
. Убедитесь, что функция не генерирует никаких исключений. Для отладки вы можете добавить обработку ошибок:FUNCTION on_auth_user_created() RETURNS TRIGGER AS $$ BEGIN BEGIN INSERT INTO logging (id) VALUES (NEW.id); EXCEPTION WHEN OTHERS THEN RAISE NOTICE 'Ошибка вставки в logging: %', SQLERRM; END; RETURN NEW; END; $$ LANGUAGE plpgsql;
2. Использование AFTER INSERT
Вы используете триггер AFTER INSERT
, что корректно. Однако, в некоторых случаях может быть полезно переключиться на триггер BEFORE INSERT
, если вам нужно изменить или перепроверить данные перед добавлением.
3. Тестирование из SQL
Чтобы изолировать проблему, попробуйте выполнить вставку напрямую через SQL-запросы. Попробуйте выполнить добавление пользователя в auth.users
вручную и посмотрите, сработает ли триггер. Это поможет вам понять, происходит ли проблема из-за вашего JavaScript API или из-за триггера.
4. Просмотр ошибок
Запустите следующее SQL-запрос для просмотра журналов ошибок, чтобы понять, почему ваша функция может не работать:
SELECT * FROM pg_catalog.pg_logs;
5. Обработка в JavaScript
Если вы уверены, что триггер и функция настроены корректно, посмотрите на ваш код JavaScript. Возможно, при обработке ответа на запрос регистрации пользователя происходит ошибка, или вы обрабатываете возвращаемые данные неправильно.
6. Программы для тестирования
Попробуйте использовать такие утилиты, как pgAdmin или DBeaver, чтобы запускать запросы напрямую и следить за тем, как работает ваш триггер. Это может помочь изолировать проблему в коде.
Заключение
Если все вышеперечисленные советы не помогут, возможно, имеет смысл создать новый проект Supabase и повторно сконфигурировать только нужные таблицы и триггеры, чтобы проверить, воспроизводится ли ошибка. Это также может помочь вам выяснить, нет ли проблем в существующей конфигурации проекта.
Если проблемы продолжаются, рассмотрите возможность обращения в поддержку Supabase с подробным описанием вашей ситуации.
Удачи вам в решении этой проблемы!