「PostgreSQL」- 数据库角色(=> Chapter 22. Database Roles)

用户角色(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