我需要一个非超级用户来创建数据库和用户,并将这些用户分配给各自的数据库,但是这个"开始"用户应该不能删除其他数据库,或者基本上只能创建用户和数据库。
我有这段代码,它可以创建数据库和用户,但是不能将数据库分配给创建的用户。它返回:必须是角色"..."的成员:
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"
2条答案
按热度按时间6bc51xsx1#
简短的回答是,如果没有一点自定义扩展,就不可能,因为
CREATE DATABASE
在事务上不安全,所以不能从函数调用,甚至不能从存储过程调用(我试过了)。结果是非超级用户只能将数据库分配给他或她所属的角色。
有几件事可以做:您可以创建一个“驻留”角色,数据库可以进入该角色直到被声明为止,然后您可以让每个人都成为该驻留角色的成员,然后能够声明数据库。
使用C语言扩展也应该可以解决这个问题,但这在托管服务上不起作用。
作为基于注解的附加说明,您可能需要在声明数据库(https://www.postgresql.org/docs/current/sql-reassign-owned.html)时运行
REASSIGN OWNED
9udxz4iz2#
我找到了一个解决方案或修复来实现这一点,灵感来自克里斯的想法和这个article(和自己的工作)。首先设置,作为超级用户:
这将创建角色“switch”和“userCreateAccount”,它们都是非超级用户,并且具有受限权限。现在在psql中使用“userCreateAccount”:
现在,由于“UserCreateAccount”和“NewUser”在“Switch”角色上,并且“NewDB”由switch拥有,我只需简单地重新分配所有权。
最后,但不知道是否有必要作为UserCreateAccount在psql:
这样,我就可以使用整个NewDB并归NewUser所有