# 创建角色
CREATE ROLE — 定义一个新的数据库角色
# 概要
CREATE ROLE name [ [ WITH ] option [ ... ] ]
where option can be:
SUPERUSER | NOSUPERUSER
| CREATEDB | NOCREATEDB
| CREATEROLE | NOCREATEROLE
| INHERIT | NOINHERIT
| LOGIN | NOLOGIN
| REPLICATION | NOREPLICATION
| BYPASSRLS | NOBYPASSRLS
| CONNECTION LIMIT connlimit
| [ ENCRYPTED ] PASSWORD 'password' | PASSWORD NULL
| VALID UNTIL 'timestamp'
| IN ROLE role_name [, ...]
| IN GROUP role_name [, ...]
| ROLE role_name [, ...]
| ADMIN role_name [, ...]
| USER role_name [, ...]
| SYSID uid
# 描述
创建角色
向 PostgreSQL 数据库集群添加新角色。角色是可以拥有数据库对象并拥有数据库权限的实体;角色可以被视为“用户”、“组”或两者,这取决于它的使用方式。参考第 22 章和第 21 章有关管理用户和身份验证的信息。你必须有创造者
特权或成为数据库超级用户才能使用此命令。
请注意,角色是在数据库集群级别定义的,因此在集群中的所有数据库中都有效。
# 参数
姓名
新角色的名称。
超级用户
超级用户
这些子句确定新角色是否是“超级用户”,他可以覆盖数据库中的所有访问限制。超级用户状态是危险的,只应在真正需要时使用。您必须自己是超级用户才能创建新的超级用户。如果没有指定,超级用户
是默认值。
创建数据库
NOCREATEDB
这些子句定义角色创建数据库的能力。如果创建数据库
被指定,被定义的角色将被允许创建新的数据库。指定NOCREATEDB
将拒绝角色创建数据库的能力。如果没有指定,NOCREATEDB
是默认值。
创造者
无创角色
这些子句确定是否允许角色创建新角色(即执行创建角色
)。一个角色创造者
特权还可以更改和删除其他角色。如果没有指定,无创角色
是默认值。
继承
非继承
这些子句确定角色是否“继承”其所属角色的权限。一个角色继承
属性可以自动使用已授予其直接或间接成员的所有角色的任何数据库权限。没有继承
, 其他角色的成员资格仅授予以下能力设定角色
转至该其他角色;其他角色的权限只有在这样做之后才可用。如果没有指定,继承
是默认值。
登录
登录
这些子句决定一个角色是否被允许登录;即在客户端连接期间是否可以将角色作为初始会话授权名称。一个角色具有登录
属性可以被认为是一个用户。没有此属性的角色对于管理数据库权限很有用,但不是通常意义上的用户。如果没有指定,登录
是默认值,除非当创建角色
通过其替代拼写调用创建用户
.
复制
非复制
这些子句确定角色是否为复制角色。为了能够以复制模式(物理或逻辑复制)连接到服务器并能够创建或删除复制槽,角色必须具有此属性(或成为超级用户)。一个角色具有复制
属性是一个非常高特权的角色,并且应该只用于实际用于复制的角色。如果没有指定,非复制
是默认值。您必须是超级用户才能创建具有复制
属性。
旁路
不绕行
这些子句确定角色是否绕过每个行级安全 (RLS) 策略。不绕行
是默认值。您必须是超级用户才能创建具有旁路
属性。
请注意,pg_转储将设置行安全
到离开
默认情况下,以确保转储表的所有内容。如果用户运行 pg_dump 没有相应的权限,会返回错误。但是,超级用户和被转储的表的所有者总是绕过 RLS。
连接限制
限制
如果角色可以登录,这指定角色可以建立的并发连接数。-1(默认)表示没有限制。请注意,只有正常连接计入此限制。准备好的事务和后台工作连接都不计入此限制。
[ 加密
] 密码
'密码
'
密码空
设置角色的密码。(密码仅用于具有登录
属性,但您仍然可以为没有它的角色定义一个。)如果您不打算使用密码身份验证,则可以省略此选项。如果未指定密码,则密码将设置为空,并且该用户的密码验证将始终失败。可以选择将空密码显式写为密码空
.
# 笔记
指定空字符串也会将密码设置为 null,但在 PostgreSQL 版本 10 之前并非如此。在早期版本中,可以使用或不使用空字符串,具体取决于身份验证方法和确切版本,而 libpq 会在任何情况下都拒绝使用它。为避免歧义,应避免指定空字符串。
密码始终加密存储在系统目录中。这加密
关键字没有效果,但为了向后兼容而被接受。加密方式由配置参数决定密码_加密.如果提供的密码字符串已经采用 MD5 加密或 SCRAM 加密格式,则无论密码加密
(由于系统无法解密指定的加密密码字符串,因此以不同的格式对其进行加密)。这允许在转储/恢复期间重新加载加密密码。
有效期至
'时间戳
'
这有效期至
子句设置角色密码不再有效的日期和时间。如果省略此条款,密码将始终有效。
扮演
角色名称
这个扮演
子句列出一个或多个现有角色,新角色将作为新成员立即添加到其中。(请注意,没有添加管理员新角色的选项;请使用单独的授予
命令执行此操作。)
分组
角色名称
分组
是一种过时的拼写扮演
.
角色
角色名称
这个角色
子句列出自动添加为新角色成员的一个或多个现有角色。(这实际上使新角色成为一个“群体”。)
管理
角色名称
这个管理
子句就像角色
,但命名的角色将添加到新角色中带管理员选项
,使他们有权将此角色的成员资格授予其他人。
使用者
角色名称
这个使用者
子句是这个词的一种过时拼写角色
条款
系统ID
液体
这个系统ID
子句被忽略,但由于向后兼容而被接受。
# 笔记
使用改变角色
更改角色的属性,以及放弃角色
删除一个角色。指定的所有属性创建角色
可以稍后修改改变角色
命令。
这个有效期至
子句只定义密码的过期时间,而不定义角色本身的过期时间。特别是,当使用非基于密码的身份验证方法登录时,不会强制执行过期时间。
这个继承
属性控制可授予权限(即数据库对象和角色成员身份的访问权限)的继承。它不适用于由设置的特殊角色属性创建角色
和改变角色
.例如,作为一个角色的成员CREATEDB
特权不会立即授予创建数据库的能力,即使继承
设定好了;有必要通过设定角色
在创建数据库之前。
这个继承
由于向后兼容的原因,属性是默认值:在PostgreSQL的早期版本中,用户始终可以访问其所属组的所有权限。然而诺因赫里特
提供与SQL标准中指定的语义更接近的匹配。
当心这件事创建角色
特权没有继承一个人特权的概念创建角色
-角色。这意味着,即使一个角色没有特定的权限,但允许创建其他角色,它也可以轻松创建另一个具有与其自身不同权限的角色(创建具有超级用户权限的角色除外)。例如,如果角色“用户”具有创建角色
特权,但不是CREATEDB
特权,但它可以创建一个新的角色CREATEDB
特权因此,要重视具有创建角色
特权几乎是超级用户角色。
PostgreSQL包含一个程序createuser它的功能与创建角色
(实际上,它调用这个命令),但可以从命令shell运行。
这个连接限制
选择权仅被强制执行;如果两个新会话几乎同时启动,而角色只剩下一个连接“插槽”,则两个会话都可能失败。此外,超级用户永远不会受到限制。
使用此命令指定未加密密码时必须小心。密码将以明文形式传输到服务器,也可能记录在客户端的命令历史记录或服务器日志中。命令createuser但是,传输的密码是加密的。而且psql包含一个命令\密码
以后可以用来安全地更改密码。
# 例子
创建一个可以登录但不提供密码的角色:
CREATE ROLE jonathan LOGIN;
使用密码创建角色:
CREATE USER davide WITH PASSWORD 'jw8s0F4';
(创建用户
和创建角色
除了这意味着登录
.)
创建一个密码在2004年底之前有效的角色。2005年,当一秒钟被勾选后,密码不再有效。
CREATE ROLE miriam WITH LOGIN PASSWORD 'jw8s0F4' VALID UNTIL '2005-01-01';
创建一个可以创建数据库和管理角色的角色:
CREATE ROLE admin WITH CREATEDB CREATEROLE;
# 兼容性
这个创建角色
语句在SQL标准中,但该标准只要求语法
CREATE ROLE name [ WITH ADMIN role_name ]
多个初始管理员,以及创建角色
,是PostgreSQL扩展。
SQL标准定义了用户和角色的概念,但它将它们视为不同的概念,并将定义用户的所有命令留给每个数据库实现来指定。在PostgreSQL中,我们选择将用户和角色统一为一种实体。因此,角色具有比标准中更多的可选属性。
SQL标准指定的行为最接近于给用户诺因赫里特
属性,而角色被赋予继承
属性