это не работает, потому что пользователь называется "имя", он не принимает значение параметра
Как я уже говорил, вы должны делать это динамически весь код для создания и предоставления
функция должна выглядеть следующим образом:
CREATE or REPLACE FUNCTION add_user (name text, cred text) RETURNS void AS $$
DECLARE
name_temp text := 'abc123';
BEGIN
EXECUTE ' CREATE USER '|| $1 ||' WITH LOGIN NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE NOREPLICATION';
EXECUTE ' GRANT CONNECT ON DATABASE test TO ' || $1;
EXECUTE ' GRANT USAGE ON SCHEMA test_schema TO '|| $1;
EXECUTE 'GRANT SELECT ON test_schema.test_table TO '|| $1;
EXECUTE 'ALTER USER ' || $1 || ' WITH PASSWORD '''|| $2||'''';
END;
$$ LANGUAGE plpgsql;
Я рекомендую использовать функцию форматирования для формирования текстов CREATE, GRANT и ALTER, для вопросов безопасности, например:
EXECUTE format ('GRANT CONNECT НА БАЗЕ ДАННЫХ ДО% I ', $ 1);
другой пункт, считайте, что имя переменной отличается от имени параметра
эта функция работает для меня