我已经为我的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'更改用户名即可, 但不包含任何变量(信标)。
无论如何,我们可以使用变量而不是对密码进行硬编码吗?
试图运行另一个功能,仅输入密码
答案 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);
其他方面,请考虑变量名称与参数名称的不同
第一个功能对我有用