我正在寻找一种方法来创建一个函数,该函数接受用户名和密码的两个参数,并使用它创建一个只读角色。我尝试过类似的事情:
create or replace function create_user_readonly (
unm varchar,
pwd varchar
)
returns varchar(10) as $$
begin
create role unm login password @pwd;
return 'success';
end;
$$ language plpgsql;
这会引发错误:
[42601]错误:语法错误在或附近" @"位置:151
我想过使用动态SQL来构建查询但是在这里遇到了这个问题(https://www.postgresql.org/docs/9.1/static/plpgsql-statements.html):
参数符号的另一个限制是它们只能用于 SELECT,INSERT,UPDATE和DELETE命令。在其他语句类型中 (通常称为实用程序语句),您必须以文本方式插入值 即使它们只是数据值。
答案 0 :(得分:2)
这是一个例子:
create or replace function create_user_readonly (
unm varchar,
pwd varchar
)
returns varchar(10) as $$
begin
execute format($f$create role %I login password '%s'$f$,unm,pwd);
execute format('alter role %I set transaction_read_only to on',unm);
return 'success';
end;
$$ language plpgsql;
请记住,虽然您需要更改用户以设置transaction_read_only
以使其只读。
的也强>:
CREATE ROLE
does not offer setting RO默认为角色。
ALTER ROLE
does
请记住,克服uset配置transaction_read_only
就像运行一个语句一样简单。
并创建角色未获得CONNECT
权限,如果您需要,请使用CREATE USER
。