用户角色(Database Roles)
DB Role 类似我们理解的角色(用户),其是权限的代表。在 DB Cluster 中,DB Role 是全局的(而不是每个单独的数据库)。
CREATE ROLE name; # createuser name DROP ROLE name; # dropuser name # 查看所有 ROLE SELECT rolname FROM pg_roles; psql> \du
当数据库初始化时,initdb,将创建默认 postgres 角色。如果需要创建其他角色,则需要先登录该角色。
角色权限(Role Attributes)
用户登录:CREATE ROLE name LOGIN # 若无 LOGIN,则无法登录;
超级用户:CREATE ROLE name SUPERUSER
建数据库:CREATE ROLE name CREATEDB
角色创建:CREATE ROLE name CREATEROLE
允许复制:CREATE ROLE name REPLICATION LOGIN # 复制,还要允许其登录;
配置密码:CREATE ROLE name PASSWORD ‘string’
ALTER ROLE:修改已创建角色的配置;
基于 ROLE 的参数配置:
ALTER ROLE myname SET enable_indexscan TO off; ALTER ROLE rolename RESET varname # 修改原有配置;
角色群组(Role Membership)
Role 既是 User 也是 Group;
CREATE ROLE name; # 创建角色组,其与创建角色相同 GRANT group_role TO role1, ... ; REVOKE group_role FROM role1, ... ;
授予 Role 之后,具有两种使用方法:
1)SET ROLE:使当前 Role 临时成为被授予的角色,此时创建的数据库对象将属于被授予的角色;
2)INHERIT:通过该关键字,当前用户直接继承权限,而无需 SET ROLE 进行切换;
CREATE ROLE joe LOGIN INHERIT; # 将继承来自 Group 的权限; CREATE ROLE admin NOINHERIT; # 但是 admin 选择不继承权限; CREATE ROLE wheel NOINHERIT; GRANT admin TO joe; GRANT wheel TO admin; // 针对如上命令: // 1)joe 继承 admin 用户; // 2)joe 无法继承 wheel 用户(因为 admin NOINHERIT 配置) // 3)但是依旧能够通过 SET ROLE admin; SET ROLE joe 切换角色; // 切换到原来角色 SET ROLE joe; SET ROLE NONE; RESET ROLE;
LOGIN, SUPERUSER, CREATEDB, CREATEROLE:是特殊权限,无法直接继承。需要授予角色,然后通过 SET ROLE 进行切换。
删除角色(Dropping Roles)
ALTER TABLE bobs_table OWNER TO alice; # 在删除前,需要重新分配该角色所具有的数据库对象; REASSIGN OWNED # 该命令也能进行重新分配,但是仅能管理当前数据库; DROP OWNED # DROP ROLE name; # 针对角色的成员,其对应的角色也被收回;
常规的删除流程:
REASSIGN OWNED BY doomed_role TO successor_role; DROP OWNED BY doomed_role; -- repeat the above commands in each database of the cluster DROP ROLE doomed_role;
预建角色(Predefined Roles)
PostgreSQL 已经预先创建部分常用的角色,我们能够将这些角色直接赋予其他用户,目的是方便使用。
函数安全(Function Security)
WIP