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

【问题讨论】:

    标签: sql postgresql plpgsql


    【解决方案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 :)
    猜你喜欢
    • 2016-01-17
    • 1970-01-01
    • 1970-01-01
    • 2016-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-10
    相关资源
    最近更新 更多