阅读(1253) (12)

PostgreSQL CREATE ROLE

2021-08-23 14:27:07 更新

CREATE ROLE — 定义一个新的数据库角色

大纲

CREATE ROLE name [ [ WITH ] option [ ... ] ]
where option可以是:

      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

描述

CREATE ROLEPostgreSQL数据库集簇增加一个新的角色。一个角色是一个实体,它可以拥有数据库对象并且拥有数据库特权。根据一个角色如何被使用,它可以被考虑成一个用户、一个或者两者。有关管理用户和认证的信息可以参考 第 21 章第 20 章。要使用这个命令,你必须具有CREATEROLE特权或者成为一个数据库超级用户。

注意角色是定义在数据库集簇层面上的,并且因此在集簇中的所有数据库中都可用。

参数

name

新角色的名称。

SUPERUSER
NOSUPERUSER

这些子句决定新角色是否是一个超级用户,它可以越过数据库内的所有访问限制。超级用户状态很危险并且只应该在确实需要时才用。要创建一个新超级用户,你必须自己是一个超级用户。如果没有指定,默认值是NOSUPERUSER

CREATEDB
NOCREATEDB

这些子句定义一个角色创建数据库的能力。如果指定了CREATEDB,被定义的角色将被允许创建新的数据库。指定NOCREATEDB将否定一个角色创建数据库的能力。如果没有指定,默认值是NOCREATEDB

CREATEROLE
NOCREATEROLE

这些子句决定一个角色是否被允许创建新的角色(也就是执行CREATE ROLE)。一个带有CREATEROLE特权的角色也能修改和删除其他角色。如果没有指定,默认值是NOCREATEROLE

INHERIT
NOINHERIT

如果新的角色是其他角色的成员,这些子句决定新角色是否从那些角色中继承特权,把新角色作为成员的角色称为新角色的父角色。一个带有INHERIT属性的角色能够自动使用已经被授予给其直接或间接父角色的任何数据库特权。如果没有INHERIT,在另一个角色中的成员关系只会把 SET ROLE的能力授予给那个其他角色,只有在这样做后那个其他角色的特权才可用。如果没有指定,默认值是INHERIT

LOGIN
NOLOGIN

这些子句决定一个角色是否被允许登录,也就是在客户端连接期间该角色是否能被给定为初始会话认证名称。一个具有LOGIN属性的角色可以被考虑为一个用户。没有这个属性的角色对于管理数据库特权很有用,但是却不是用户这个词的通常意义。如果没有指定,默认值是NOLOGIN,不过当CREATE ROLE被通过CREATE USER调用时默认值会是LOGIN

REPLICATION
NOREPLICATION

这些子句决定一个角色是否为复制角色。角色必须具有这个属性(或者成为一个超级用户)才能以复制模式(物理复制或者逻辑复制)连接到服务器以及创建或者删除复制槽。一个具有REPLICATION属性的角色是一个具有非常高特权的角色,并且只应被用于确实需要复制的角色上。如果没有指定,默认值是NOREPLICATION。 您必须是超级用户才能创建具有REPLICATION属性的新角色。

BYPASSRLS
NOBYPASSRLS

这些子句决定是否一个角色可以绕过每一条行级安全性(RLS)策略。 默认是NOBYPASSRLS。 您必须是超级用户才能创建具有BYPASSRLS属性的新角色。

注意 pg_dump 将默认把row_security设置为OFF, 以确保一个表的所有内容被转储出来。如果运行 pg_dump 的用户不具有适当的权限,将会返回一个错误。 但是,超级用户和被转储表的拥有者总是可以绕过 RLS。

CONNECTION LIMIT connlimit

如果角色能登录,这指定该角色能建立多少并发连接。-1(默认值)表示无限制。注意这个限制仅针对于普通连接。预备事务和后台工作者连接都不受这一限制管辖。

[ ENCRYPTED ] PASSWORD 'password'
PASSWORD NULL

设置角色的口令(口令只对具有LOGIN属性的角色有用,但是不管怎样你还是可以为没有该属性的角色定义一个口令)。如果你没有计划使用口令认证,你可以忽略这个选项。如果没有指定口令,口令将被设置为空并且该用户的口令认证总是会失败。也可以用PASSWORD NULL显式地写出一个空口令。

注意

指定一个空字符串也将把口令设置为空,但是在PostgreSQL版本10之前是不能这样做的。在早期的版本中,是否可以使用空字符串取决于认证方法和确切的版本,而libpq在任何情况下都将拒绝使用空字符串。为了避免混淆,应该避免指定空字符串。

口令总是以加密的方式存放在系统目录中。ENCRYPTED关键词没有实际效果,它只是为了向后兼容性而存在。加密的方法由配置参数password_encryption决定。如果当前的口令字符串已经是MD5加密或者SCRAM加密的格式,那么不管password_encryption的值是什么,口令字符串还是原样存储(因为系统无法解密以不同格式加密的口令字符串)。这种方式允许在转储/恢复时重载加密的口令。

VALID UNTIL 'timestamp'

VALID UNTIL机制设置一个日期和时间,在该时间点之后角色的口令将会失效。如果这个子句被忽略,那么口令将总是有效。

IN ROLE role_name

IN ROLE子句列出一个或多个现有的角色,新角色将被立即作为新成员加入到这些角色中(注意没有选项可以把新角色作为一个管理员加入,需要用一个单独的GRANT命令来完成)。

IN GROUP role_name

IN GROUPIN ROLE的一种已废弃的拼写方式。

ROLE role_name

ROLE子句列出一个或者多个现有角色,它们会被自动作为成员加入到新角色中(这实际上新角色变成了一个)。

ADMIN role_name

ADMIN子句与ROLE相似,但是被提及的角色被使用WITH ADMIN OPTION加入到新角色中,让它们能够把这个角色中的成员关系授予给其他人。

USER role_name

USER子句是ROLE子句的一个已废弃的拼写方式。

SYSID uid

SYSID子句会被忽略,但是会为了向后兼容,还是会接受它。

注解

使用ALTER ROLE来更改一个角色的属性,以及使用DROP ROLE来移除一个角色。所有用 CREATE ROLE指定的属性可以被后来的ALTER ROLE命令所修改。

增加和移除组角色成员的最佳方式是使用GRANTREVOKE

VALID UNTIL子句只为一个口令而不是为一个角色本身定义了一个过期时间。特别地,当使用一个非基于口令认证的方法登录时,过期时间是不会被强制的。

INHERIT属性管理可授予特权(也就是对数据库对象和角色成员关系的访问特权)的继承性。它并不适用于由CREATE ROLEALTER ROLE设置的特殊角色属性。例如,作为具有CREATEDB特权的角色的一个成员,并不会立刻授予创建数据库的角色,即便INHERIT被设置也是如此,在创建一个数据库之前必须通过 SET ROLE 成为该角色。

INHERIT属性是用于向后兼容原因的默认值:在早前的PostgreSQL发布中,用户总是能够访问其所属组的所有特权。不过,NOINHERIT更加接近于 SQL 标准中指定的语义。

要小心CREATEROLE特权。对于一个CREATEROLE角色的特权没有继承的概念。那意味着即使一个角色没有特定的特权但被允许创建其他角色,它可以轻易地创建与自身特权不同的另一个角色(除了创建具有超级用户特权的角色)。例如,如果角色user具有CREATEROLE特权但是没有 CREATEDB特权,但是它能够创建一个带有CREATEDB特权的新角色。因此,可以把具有CREATEROLE特权的角色看成是准超级用户角色。

PostgreSQL包括一个程序createuser,它具有和CREATE ROLE相同的功能(事实上,它会调用这个命令),但是它可以从命令 shell 中运行。

CONNECTION LIMIT只被近似地强制,如果两个新会话在几乎相同时间被开始,而此时该角色只剩下刚好一个连接,两者可能都将失败。还有,该限制从不对超级用户强制。

用这个命令指定一个非加密口令时必须加以注意。该命令将被以明文的形式传输到服务器,并且它也可能被记录在客户端命令历史或者服务器日志中。不过,命令createuser会传输加密的口令。还有,psql包含一个命令\password,它可以被用来安全地改变该口令。

例子

创建一个能登录但是没有口令的角色:

CREATE ROLE jonathan LOGIN;

创建一个有口令的角色:

CREATE USER davide WITH PASSWORD 'jw8s0F4';

CREATE USERCREATE ROLE完全相同,除了它带有LOGIN)。

创建一个角色,它的口令有效期截止到 2004 年底。在进入 2005 年第一秒时,该口令会失效。

CREATE ROLE miriam WITH LOGIN PASSWORD 'jw8s0F4' VALID UNTIL '2005-01-01';

创建一个能够创建数据库并且管理角色的角色:

CREATE ROLE admin WITH CREATEDB CREATEROLE;

兼容性

SQL 标准中有CREATE ROLE语句,但是标准只要求语法

CREATE ROLE name [ WITH ADMIN role_name ]

多个初始管理员以及CREATE ROLE的所有其他选项都是PostgreSQL扩展。

SQL 标准定义了用户和角色的概念,但是它把它们看成是可区分的概念并且将定义用户的所有命令留给每一种数据库实现来指定。在PostgreSQL中,我们已经选择把用户和角色统一成一种单一实体类型。因此角色比起标准中拥有更多可选的属性。

SQL 标准指定的行为可以通过给用户NOINHERIT属性来得到最大的金丝,而角色会被给予INHERIT属性。