Функция выписки транзакции на PostgreSQL - PullRequest
0 голосов
/ 06 августа 2020

Я хочу аутентифицировать пользователя по его псевдониму (networkId) и предварительно хешированному паролю, с таблицей publi c (recoyx.user) и частной таблицей пользователя (recoyx_private.user). Функция основана на просмотре этого учебника PostGraphile (PostGraphile сочетает в себе GraphQL и PostgreSQL).

create function recoyx.authenticate(
    network_id text,
    password_hash text
) returns recoyx.jwt_token
begin;
    set local id to (select (numeric_id) from recoyx.user where user.network_id = $1).numeric_id;
    select (numeric_id, password_hash)::recoyx.jwt_token
        from recoyx_private.user
        where user.numeric_id = id and user.password_hash = $2;
end;

Средство выполнения запросов дает неверный синтаксис в этой функции в целом, как в части например, select * from recoyx.table where table.field = value, фреймы транзакций и привязка id. Я взял обработчик запросов из этого примера , который дает короткое средство для инициализации, запроса и освобождения обработчика запросов для базы данных PostgreSQL (я получил сюда через эту документацию API модуля postgraphile ).

Когда я удаляю эту функцию из своего запроса, она работает нормально. Насколько я только что видел, точка действительна, и локальное назначение тоже. Так что, мой синтаксис действительно неправильный?

Обновление

Теперь это моя функция:

create function recoyx.authenticate(
    network_id text,
    password_hash text
) returns recoyx.jwt_token
as
$body$
    select (numeric_id, password_hash)::recoyx.jwt_token
        from recoyx_private.user
        where   numeric_id = (select numeric_id from recoyx.user where network_id = $1)
            and password_hash = $2;
$body$
language sql
stable;

Я получаю неопределенные отношения, но подключаюсь к значениям по умолчанию Роль root, которая входит в мою установку PostgreSQL (postgres роль), когда я запускаю create function запрос

Я поместил проект на GitHub . Запускаю запрос через npm run init-database. См. пример среды. json (он определяет обычную роль «postgres»).

1 Ответ

2 голосов
/ 06 августа 2020

Как описано в руководстве , тело функции передается в виде строки в Postgres (а учебник, на который вы ссылаетесь, фактически включал необходимый as $$ ...$$ - вы просто не копировали его). Вы также забыли указать язык функции.

set local id не является допустимым назначением переменной в PL / pg SQL или SQL (в котором нет переменных для начните с).

Но вам действительно не нужна переменная, чтобы делать то, что вы хотите, ваша функция может быть реализована как функция SQL:

create function recoyx.authenticate(
    network_id text,
    password_hash text
) returns recoyx.jwt_token
as
$body$
  select (numeric_id, password_hash)::recoyx.jwt_token
  from recoyx_private.user
  where user.numeric_id = (select numeric_id 
                           from recoyx.user 
                           where network_id = $1)
    and user.password_hash = $2;
$body$
language sql
stable;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...