Как изменить пароль вновь созданного пользователя, используя переменную в postgresql 9.5 SP - PullRequest
0 голосов
/ 11 июля 2019

Я создал хранимую процедуру (функцию) для моей базы данных postgresql 9.5 для создания пользователей. код ниже:

CREATE FUNCTION add_user (name text, cred text) RETURNS void AS $$
DECLARE
  name text := 'abc123';
BEGIN
  CREATE USER name WITH LOGIN NOSUPERUSER INHERIT NOCREATEDB 
  NOCREATEROLE NOREPLICATION;
  GRANT CONNECT ON DATABASE test TO name;
  GRANT USAGE ON SCHEMA test_schema TO name;
  GRANT SELECT ON test_schema.test_table TO name;
  ALTER USER name WITH PASSWORD cred;
END; 
$$ LANGUAGE plpgsql;

Не удалось изменить пароль для пользователя. В тот момент, когда я заменяю "cred" на жестко закодированный пароль, он работает.

Итак, ALTER USER name с паролем 'userpassword' работает, но НЕ с какой-либо переменной (кредит).

Можно ли в любом случае использовать переменную вместо жесткого кодирования пароля?

Попробовал запустить другую функцию, только для пароля

Ответы [ 2 ]

0 голосов
/ 11 июля 2019

это не работает, потому что пользователь называется "имя", он не принимает значение параметра

Как я уже говорил, вы должны делать это динамически весь код для создания и предоставления

функция должна выглядеть следующим образом:

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);

другой пункт, считайте, что имя переменной отличается от имени параметра

эта функция работает для меня

0 голосов
/ 11 июля 2019

вы должны выполнить ALTER USER с динамическим SQL, например:

EXECUTE 'ALTER USER || name || ' WITH PASSWORD '|| cred;

Я считаю, что вы должны выполнять динамический SQL во всем коде команд CREATE и GRANT, потому что я думаю, что всегда будет создаваться пользователь с именем "name"

...