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

Posted

技术标签:

【中文标题】使用参数以编程方式创建角色【英文标题】:Create role programmatically with parameters 【发布时间】:2017-04-20 18:43:16 【问题描述】:

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

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】:

这是一个例子:

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 ROLEdoes not offer setting RO 默认为角色。

ALTER ROLEdoes

请记住,克服 uset 配置 transaction_read_only 就像运行一条语句一样简单。

并且创建角色不会授予CONNECT 权限,如果需要,请改用CREATE USER

【讨论】:

感谢 Vao,这完全有效!你的名字应该是 Wow :) transaction_read_only 不是可以在与 create role 相同的语句中完成的吗? 不是真的,至少我从未尝试过,也没有记录 :) 更新了你的笔记并添加了几个我的作为 nota bene 非常感谢!我很欣赏 nota benes :)

以上是关于使用参数以编程方式创建角色的主要内容,如果未能解决你的问题,请参考以下文章

我们如何在Liferay中以编程方式创建用户和网站模板的角色,权限?

以编程方式将角色添加到身份

如何以编程方式更改 iPhone 的蓝牙参数?

以编程方式为特定用户角色禁用税收

使用 Keycloak API 以编程方式将角色分配给组

如何以编程方式检测营销和基于角色的电子邮件?