使用参数以编程方式创建角色

时间:2017-04-20 18:43:16

标签: sql postgresql plpgsql

我正在寻找一种方法来创建一个函数,该函数接受用户名和密码的两个参数,并使用它创建一个只读角色。我尝试过类似的事情:

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命令。在其他语句类型中   (通常称为实用程序语句),您必须以文本方式插入值   即使它们只是数据值。

1 个答案:

答案 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