postgresql 非超级用户可以在Postgres 10中为其他用户创建DB吗?

g9icjywg  于 2023-01-30  发布在  PostgreSQL
关注(0)|答案(2)|浏览(208)

我需要一个非超级用户来创建数据库和用户,并将这些用户分配给各自的数据库,但是这个"开始"用户应该不能删除其他数据库,或者基本上只能创建用户和数据库。
我有这段代码,它可以创建数据库和用户,但是不能将数据库分配给创建的用户。它返回:必须是角色"..."的成员:

CREATE ROLE starter NOSUPERUSER LOGIN CREATEDB CREATEROLE NOREPLICATION NOBYPASSRLS NOINHERIT WITH ENCRYPTED PASSWORD 'mypassword';
REVOKE SELECT,INSERT,UPDATE,DELETE,TRUNCATE,REFERENCES,TRIGGER ON ALL TABLES IN SCHEMA public FROM starter;
  • 还尝试创建用户

是否有办法允许"初学者"用户向DB添加所有者?
我使用这个查询:

CREATE DATABASE newdatabase OWNER test;

输出:

ERROR:  must be member of role "test"
6bc51xsx

6bc51xsx1#

简短的回答是,如果没有一点自定义扩展,就不可能,因为CREATE DATABASE在事务上不安全,所以不能从函数调用,甚至不能从存储过程调用(我试过了)。
结果是非超级用户只能将数据库分配给他或她所属的角色。
有几件事可以做:您可以创建一个“驻留”角色,数据库可以进入该角色直到被声明为止,然后您可以让每个人都成为该驻留角色的成员,然后能够声明数据库。
使用C语言扩展也应该可以解决这个问题,但这在托管服务上不起作用。
作为基于注解的附加说明,您可能需要在声明数据库(https://www.postgresql.org/docs/current/sql-reassign-owned.html)时运行REASSIGN OWNED

9udxz4iz

9udxz4iz2#

我找到了一个解决方案或修复来实现这一点,灵感来自克里斯的想法和这个article(和自己的工作)。首先设置,作为超级用户:

CREATE ROLE Switch NOSUPERUSER LOGIN PASSWORD 'mypassword'; 
CREATE USER UserCreateAccount NOSUPERUSER LOGIN CREATEDB CREATEROLE NOREPLICATION NOBYPASSRLS NOINHERIT PASSWORD 'mypassword' IN ROLE Switch; 
REVOKE SELECT,INSERT,UPDATE,DELETE,TRUNCATE,REFERENCES,TRIGGER ON ALL TABLES IN SCHEMA public FROM UserCreateAccount;

这将创建角色“switch”和“userCreateAccount”,它们都是非超级用户,并且具有受限权限。现在在psql中使用“userCreateAccount”:

CREATE USER NewUser IN ROLE Switch PASSWORD 'mypassword';
CREATE DATABASE NewDB OWNER Switch;
GRANT ALL PRIVILEGES ON DATABASE NewDB TO NewUser;

现在,由于“UserCreateAccount”和“NewUser”在“Switch”角色上,并且“NewDB”由switch拥有,我只需简单地重新分配所有权。

REASSIGN OWNED BY Switch TO NewUser

最后,但不知道是否有必要作为UserCreateAccount在psql:

REVOKE Switch FROM NewUser;

这样,我就可以使用整个NewDB并归NewUser所有

相关问题