如何使用Postgresql 9.5 SP中的变量更改新创建用户的密码

时间:2019-07-10 21:35:29

标签: postgresql amazon-rds postgresql-9.5

我已经为我的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”时,它就起作用了。

因此,使用PASSWORD'userpassword'更改用户名即可, 但不包含任何变量(信标)。

无论如何,我们可以使用变量而不是对密码进行硬编码吗?

试图运行另一个功能,仅输入密码

2 个答案:

答案 0 :(得分:0)

您必须使用dinamyc SQL执行ALTER USER,例如:

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

我认为您必须在CREATE和GRANT命令的整个代码中执行动态SQL,因为我认为总会创建一个名为“名称”的用户

答案 1 :(得分:0)

它不起作用,因为用户被称为“名称”,它没有参数值

如前所述,您必须动态地执行所有创建和授予代码的操作

函数应如下所示:

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文本,例如:

执行格式('GRANT CONNECT ON DATABASE test to%I',$ 1);

其他方面,请考虑变量名称与参数名称的不同

第一个功能对我有用