我确定我遗漏了一些简单的东西,但我创造了以下内容:
postgres=# \du
List of roles
Role name | Attributes | Member of
-----------+-----------------------------------------+-----------
admin | No inheritance, Create DB, Cannot login | {}
postgres | Superuser, Create role, Create DB | {}
wade | | {admin}
(请注意Cannot login
和No inheritance
不会影响wade
所发生的事情。请参阅PostgreSQL documentation for role membership了解原因。-bignose)
但是,当我尝试创建数据库时,我得到:
bin wwilliam$ createdb -U wade test
Password:
createdb: database creation failed: ERROR: permission denied to create database
我错过了什么?
答案 0 :(得分:7)
摘自manual:
INHERIT属性控制可授予权限的继承(即数据库对象和角色成员身份的访问权限)。它不适用于CREATE ROLE和ALTER ROLE设置的特殊角色属性。 例如,作为具有CREATEDB权限的角色的成员,即使设置了INHERIT,也不会立即授予创建数据库的能力;在创建数据库之前,有必要通过SET ROLE成为该角色。
(强调我的)。
答案 1 :(得分:0)
在文档中:
可以将角色属性LOGIN,SUPERUSER,CREATEDB和CREATEROLE视为特殊特权,但它们永远不会像数据库对象的普通特权那样被继承。实际上,您必须将ROLE设置为具有这些属性之一的特定角色,才能使用该属性
因此,在创建数据库之前,您必须使用admin
激活SET ROLE admin;
角色。