一个数据库角色可以有一些属性,它们定义角色的权限并且与客户端认证系统交互。
只有具有LOGIN
属性的角色才能被用于一个数据库连接的初始角色名称。一个带有LOGIN
属性的角色可以被认为和一个“数据库用户”相同。
一个数据库超级用户会绕开所有权限检查,除了登入的权利。这是一个危险的权限并且应该小心使用,最好用一个不是超级用户的角色来完成你的大部分工作。要创建一个新数据库超级用户,使用CREATE ROLE
。你必须作为一个超级用户来完成这些。
name
SUPERUSER
一个角色必须被显式给予权限才能创建数据库(除了超级用户,因为它们会绕开所有权限检查)。要创建这样一个角色,使用CREATE ROLE
。
name
CREATEDB
一个角色必须被显式给予权限才能创建更多角色(除了超级用户,因为它们会绕开所有权限检查)。要创建这样一个角色,使用CREATE ROLE
。一个带有name
CREATEROLECREATEROLE
权限的角色也可以修改和删除其他角色,还可以授予或回收角色中的成员关系。然而,要创建、修改、删除或修改一个超级用户角色的成员关系,需要以超级用户的身份操作。CREATEROLE
不足以完成这一切。
一个角色必须被显式给予权限才能发起流复制(除了超级用户,因为它们会绕开所有权限检查)。一个被用于流复制的角色必须也具有LOGIN
权限。
只有当客户端认证方法要求用户在连接数据库时提供一个口令时,一个口令才有意义。password
和md5
认证方法使用口令。数据库口令与操作系统命令独立。在角色创建时指定一个口令:CREATE ROLE
。
name
PASSWORD 'string
'
默认情况下,角色被授予继承其所属角色的权限的权限。但是,若要创建不具有该权限的角色,请使用 CREATE ROLE
。
name
NOINHERIT
必须明确授予角色绕过每个行级安全 (RLS) 策略的权限
(超级用户除外,因为超级用户会绕过所有权限检查)。
要创建这样的角色,请以超级用户身份使用 CREATE ROLE
。
name
BYPASSRLS
连接限制可以指定角色可以建立的并发连接数。
-1(默认值)表示无限制。在创建角色时使用以下方法指定连接限制:
CREATE ROLE
。
name
CONNECTION LIMIT 'integer
'
在创建后可以用ALTER ROLE
修改一个角色属性。CREATE ROLE和ALTER ROLE命令的细节可见参考页。
一个好习惯是创建一个具有CREATEDB
和CREATEROLE
权限的角色,而不是创建一个超级用户,并且然后用这个角色来完成对数据库和角色的例行管理。这种方法避免了在非必要时作为超级用户操作任务的风险。
对于Chapter 18中描述的运行时配置设置,一个角色也可以有角色相关的默认值。例如,如果出于某些原因你希望在每次连接时禁用索引扫描(提示:不是好主意),你可以使用:
ALTER ROLE myname SET enable_indexscan TO off;
这将保存设置(但是不会立刻设置它)。在这个角色的后续连接中,它就表现得像在会话开始之前执行过SET enable_indexscan TO off
。你也可以在会话期间改变该设置,它将只是作为默认值。要移除一个角色相关的默认设置,使用ALTER ROLE
。注意附加到没有rolename
RESET varname
LOGIN
权限的角色的角色相关默认值相当无用,因为它们从不会被调用。