CREATE ROLE name [ [ WITH ] option [ ... ] ] 这里 option 可以是: SUPERUSER | NOSUPERUSER | CREATEDB | NOCREATEDB | CREATEROLE | NOCREATEROLE | CREATEUSER | NOCREATEUSER | INHERIT | NOINHERIT | LOGIN | NOLOGIN | CONNECTION LIMIT connlimit | [ ENCRYPTED | UNENCRYPTED ] PASSWORD 'password' | VALID UNTIL 'timestamp' | IN ROLE rolename [, ...] | IN GROUP rolename [, ...] | ROLE rolename [, ...] | ADMIN rolename [, ...] | USER rolename [, ...] | SYSID uid
CREATE ROLE 向一个 PostgreSQL 数据库集群添加一个新角色。一个角色是一个可以拥有数据库对象并且拥有数据库权限的纪录; 角色可以认为是一个"用户",一个"组", 或者是两者兼有。请参考 Chapter 18 和 Chapter 20 获得有关管理用户和权限的信息。 要使用这条命令,你必须拥有 CREATEROLE 权限或者是数据库超级用户。
请注意角色是在数据库集群的范畴里定义的,因此在数据库集群里的所有数据库里有效。
新角色的名称。
NOSUPERUSER is the default. 这些子句决定一个新角色是否"超级用户", 这种用户可以超越数据库中的所有访问权限。超级用户状态是非常危险的,除非真正需要, 否则不应该使用。如果没有声明,你自己必须是一个超级用户才能创建一个新的超级用户。
这些子句定义一个角色是否能创建数据库。如果声明了 CREATEDB, 那么正在创建的角色可以创建新数据库。声明 NOCREATEDB 将不会赋与新角色创建数据库的能力。 如果没有声明,缺省是 NOCREATEDB。
这些子句决定一个角色是否可以创建新角色(也就是说,执行 CREATE ROLE)。 一个拥有 CREATEROLE 权限的角色也可以修改和删除其它角色。 如果没有声明,NOCREATEROLE 是缺省。
这些子句已经过时了,但是仍然接受,拼法为 SUPERUSER 和 NOSUPERUSER。请注意它们并不等于 CREATEROLE!人们很可能轻易地这么认为。
这些子句决定一个角色是否"继承"它所在组的角色的权限。 一个带有 INHERIT 属性的角色可以自动使用已经赋与它直接或间接所在的组的任何权限。 没有 INHERIT,其它角色的成员关系只赋与该角色 SET ROLE 成其它角色的能力; 其它角色的权限只是在这么做了之后才能获得。如果没有声明,INHERIT 是缺省。
这些子句决定一个角色是否可以登录;也就是说,该角色在客户端连接的时候是否可以被给予初始化绘画认证名字。 一个拥有 LOGIN 属性的角色可以认为是一个用户。 没有这个属性的角色可以用于管理数据库权限,但是并不是平常概念的用户。 如果没有声明,NOLOGIN 是缺省,除非是通过调用 CREATE ROLE 的别名 CREATE USER。
如果角色可以登录,这个参数声明该角色可以使用的并发连接数量。 -1 (缺省)意味着没有限制。
设置角色的口令。(口令只是对那些拥有 LOGIN 属性的角色有用, 不过你当然可以给没有这个属性的用户定义之。)如果你不准备使用口令认证,你可以忽略这个选项。
这些关键字控制存储在系统表里面的口令是否加密。 (如果没有声明,那么缺省的行为是由配置参数 password_encryption 控制的。) 如果目前的口令字串已经是用 MD5 加密的格式,那么那就会继续照此存放,而不管是否声明了 ENCRYPTED 或者 UNENCRYPTED (因为系统无法对指定的口令字串进行解密)。 这样就允许在转储/回复的时候重载加密的口令。
请注意老的客户端可能缺乏对 MD5 认证机制的支持,以密文形式存储的口令需要这个机制来运作。
VALID UNTIL 子句设置角色的口令不再有效的一个日期和时间。 如果忽略了这个口令,那么口令将永远有效。
IN ROLE 子句列出一个或多个现有的角色,新角色将立即加入这些角色,成为它们的成员。 (请注意没有任何选项可以把新角色添加为管理员;使用独立的 GRANT 命令来做这件事情。)
IN GROUP 是 IN ROLE 的过时的拼法。
ROLE 子句列出一个或多个现有的角色,它们将自动添加为这个新角色的成员。 (这个动作实际上就是把新角色做成一个"组"。)
The ADMIN clause is like ROLE, but the named roles are added to the new role WITH ADMIN OPTION, giving them the right to grant membership in this role to others. ADMIN 子句类似 ROLE, 只是给出的角色被增加到新角色 WITH ADMIN OPTION, 给他们以把这个角色的成员权限赋与其它角色的权力。
USER 子句是 ROLE 子句的过时的拼法。
SYSID 子句被忽略,但是仍然接受之,主要为了向下兼容。
使用 ALTER ROLE 改变一个角色的属性,以及 DROP ROLE 删除一个角色。所有在 CREATE ROLE 里声明的角色都可以在后面的 ALTER ROLE 命令里修改。
给一个当作组来使用的角色添加或删除成员的比较好的方法是使用 GRANT 和 REVOKE。
VALID UNTIL 子句只是为口令定义一个失效时限,而不是给该角色定义之。 特别要注意的是,当以非口令为基础的认证方式登录的时候,这个失效时间并不是强制的。
INHERIT 属性管理那些可赋予的权限的继承关系(也就是说, 数据库对象的访问权限和角色成员关系)。它并不适用于 CREATE ROLE 和 ALTER ROLE 设置的特殊角色属性。比如,做为一个带有 CREATEDB 权限的角色成员,并不直接拥有创建数据库的能力,即使设置了 INHERIT 也如此; 该角色还是需要通过 SET ROLE 成为该角色,然后才能创建数据库。
INHERIT 属性是缺省的,原因是为了向下兼容:在以前的 PostgreSQL 版本里,用户总是拥有他们所在成员组的所有权限。不过,NOINHERIT 提供了与 SQL 标准所定义的最接近的语意。
PostgreSQL 包括一个程序 createuser, 它和 CREATE ROLE 有一样的功能(实际上,它调用这个命令), 但是可以从命令行 shell 上运行。
CONNECTION LIMIT 选项只是近似地强制;如果两个新的会话几乎同时启动, 而只有该角色只剩下一个"连接槽",那么很可能两个都会失败。同样, 这个限制从来不会对超级用户强制。
创建一个可以登录的角色,但是不用给他口令:
CREATE ROLE jonathan LOGIN;
创建一个带口令的角色:
CREATE USER davide WITH PASSWORD 'jw8s0F4';
(CREATE USER 和 CREATE ROLE 一样,只不过它隐含 LOGIN。)
创建一个带口令的角色,口令有效期到 2004 年底。在 2005 年跑了一秒之后, 口令就不再有效。
CREATE ROLE miriam WITH LOGIN PASSWORD 'jw8s0F4' VALID UNTIL '2005-01-01';
创建一个可以创建数据库和管理角色的角色:
CREATE ROLE admin WITH CREATEDB CREATEROLE;