在Postgres中,我如何创建具有CREATEROLE
- 权限的用户,但仅限于特定的DB / DB集?
我尝试过:
CREATE ROLE user WITH LOGIN PASSWORD 'password' NOCREATEDB CREATEROLE;
这是对的吗? +如何将CREATEROLE
授予多个数据库?
答案 0 :(得分:4)
角色由数据库群集创建,根据doc而不是数据库。如果您将这个强大的权利赋予用户,他将能够创建可在群集的每个数据库中使用的角色。
由于您需要为角色授予权限,因此可以确保将来自单个数据库的内容分配给该角色。
答案 1 :(得分:2)
似乎这不是一个简单的方法。但您可以使用<script type="module">
选项创建函数以实现所需的行为:
security definer
以超级用户身份创建此功能。
然后,您可以使用create or replace function fn_create_role(p_name text, p_password text, p_databases text[]) returns void
language plpgsql
security definer
as $$
begin
execute format('create role %I with login password %L;', p_name, p_password);
execute format('grant connect on database %s to %I', array_to_string(p_databases, ','), p_name);
return;
end $$;
选项创建角色,但为此功能授予NOCREATEROLE
权限,并使用它创建其他角色。
注意:您需要从特定数据库的EXECUTE
角色撤消connect
选项,以禁止默认情况下角色连接到它们,例如:
public
测试它:
作为超级用户(在我的情况下revoke connect on database db1, db2 from public;
,也拥有同名的架构)
nd
在终端:
$ psql -h localhost -d db1 -U win Password for user win: psql (9.6.3) SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256, compression: off) Type "help" for help. win@db1=> \q $ psql -h localhost -d db2 -U win Password for user win: psql: FATAL: permission denied for database "db2" DETAIL: User does not have CONNECT privilege.