通过编程方式创建角色参数

问题描述:

我正在寻找一种方法来创建一个函数,该函数需要用户名和密码的两个参数并使用它创建一个只读角色。我已经试过类似:通过编程方式创建角色参数

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] ERROR: syntax error at or near "@" Position: 151

我想使用动态SQL构造查询,但遇到了这个位置(https://www.postgresql.org/docs/9.1/static/plpgsql-statements.html):

Another restriction on parameter symbols is that they only work in SELECT, INSERT, UPDATE, and DELETE commands. In other statement types (generically called utility statements), you must insert values textually even if they are just data values.

这里是一个例子:

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代替,如果您需要的话。

+0

谢谢Vao,完全有效!你的名字应该是哇:)是否'''transaction_read_only''不是可以在与'''create role'''相同的语句中完成的事情? – Anand

+0

不是真的,至少我从来没有尝试过,它没有记录:) –

+1

更新了你的笔记,并添加了几个我的nota bene –