一个数据库角色可以有一系列属性,这些属性定义他的权限,以及与客户认证系统的交互。
只有具有 LOGIN 属性的角色可以用做数据库连接的初始角色名。 一个带有 LOGIN 属性的角色可以认为是和"数据库用户"相同的事情。 要创建一个具有登录权限的角色,用下列之一
CREATE ROLE name LOGIN; CREATE USER name;
(CREATE USER is equivalent to CREATE ROLE except that CREATE USER assumes LOGIN by default, while CREATE ROLE does not.)
数据库超级用户超越所有权限检查。这事一个危险的权限,应该小心使用; 最好使用非超级用户完成你的大多数工作。 要创建数据库超级用户,用 CREATE ROLE name SUPERUSER。 你必须用已经是超级用户的用户身份执行这条命令。
角色要想创建数据库,必须明确给出权限(对于超级用户是例外,因为他们超越所有权限检查)。 要创建这样的用户,用 CREATE ROLE name CREATEDB。
一个角色要想创建更多角色,必须明确给予其权限(除了超级用户之外, 因为超级用户绕开所有权限检查)。要创建这样的角色, 使用 CREATE ROLE name CREATEROLE。 一个带有 CREATEROLE 权限的角色也可以更改和删除其它角色, 以及给其它角色赋予或者撤销成员属性。 不过,要创建,更改,删除或者改变一个超级用户角色的成员关系,需要有超级用户状态; CREATEROLE 还不够处理这些。
只有在对客户认证方法要求客户在与数据库建立连接是使用口令的时候,口令才比较重要。 password,md5,和 crypt 认证方法使用口令。 数据库口令与操作系统口令是无关的。在创建角色的时候声明一个口令是这样: CREATE ROLE name PASSWORD 'string'。
一个角色的属性可以在创建后用 ALTER ROLE 修改。 参考 CREATE ROLE 和 ALTER ROLE 的手册获取细节。
提示: 创建一个具有 CREATEDB 和 CREATEROLE 权限,但是并非超级用户的角色是一个很好的习惯, 你可以使用这个角色进行所有日常的数据库和角色的管理。这个方法避免了以超级用户操作时, 发生误操作导致的严重后果。
一个角色也可以为许多运行时配置设置个人缺省, 那些配置在 Chapter 17 里描述。 比如,如果出于某种原因你想在所有你做的连接中关闭索引扫描(提示:不是个好主意), 你可以用
ALTER ROLE myname SET enable_indexscan TO off;
这样就会保存该设置(但是不是立即设置)。 这么做后,在这个角色随后的连接中就好像在会话开始之后都马上 SET enable_indexscan TO off;了一样。 你也可以在会话中修改这个设置;它只是缺省。要撤销任何这样的设置, 使用 ALTER ROLE username RESET varname;。 请注意,对那些没有 LOGIN 权限的角色,这些角色相关的缺省值几乎没什么用, 因为它们从来不会被调用。