@TemaKam

Как правильно использовать аргументы в функции?

хочу создать функцию, которая будет принимать на вход имя пользователя и роль
CREATE OR REPLACE FUNCTION create_user(user_name varchar, role_name varchar)
RETURNS SETOF varchar AS 
$BODY$ 
BEGIN
CREATE USER user_name PASSWORD (SELECT random_string((SELECT random_int_between(5,15))));
GRANT role_name TO user_name;
RETURN QUERY SELECT * FROM all_users;
END; 
$BODY$ LANGUAGE plpgsql;

при использовании пишет, что роль "role_name" не существует, т.е. параметр не раскрылся - почему?
и с паролем тоже тут не так, как правильно написать, чтобы пароль присваивался тот, что вернет SELECT?
  • Вопрос задан
  • 49 просмотров
Решения вопроса 1
@galaxy
CREATE USER user_name PASSWORD (SELECT random_string((SELECT random_int_between(5,15))));

Не думаю, что такое извращение возможно. По крайнер мере документация по CREATE ROLE явно допуская только PASSWORD NULL или PASSWORD 'qwerty', без выражений или тем более SQL запросов.

Далее
Non-optimizable SQL commands (also called utility commands) are not capable of accepting query parameters. So automatic substitution of PL/pgSQL variables does not work in such commands. To include non-constant text in a utility command executed from PL/pgSQL, you must build the utility command as a string and then EXECUTE it, as discussed in Section 43.5.4.

https://www.postgresql.org/docs/current/plpgsql-st...

Т.е. вы не можете в команду CREATE USER вставить переменную plpgsql. Ваша команда просто интерпетируется как будто вы хотите создать юзера с именем user_name. Аналогично ведет себя GRANT.
Пароль лучше сгенерить в переменную, а эти команды надо выполнять через EXECUTE, примерно так:
SELECT random_string(SELECT random_int_between(5,15)) INTO pass;
EXECUTE format('CREATE USER %I PASSWORD %L', user_name, pass);
EXECUTE format('GRANT %I TO %I', role_name, user_name);
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы