简述
- PostgreSQL通过角色(role)来控制数据库的访问权限。角色可以拥有数据库对象(比如表、函数等),并允许将这些对象的权限授予其他角色,从而实现对象访问的控制。
- 角色(role)包含了两种概念:①具有登录权限的角色称为用户(user);②包含其他成员的角色称为组(group)。
用户和组
- 数据库使用过程中,DBA通常会创建多个用户,并根据用户的实际情况赋予权限。为了便于权限管理,可创建角色,然后将角色赋予用户。通过角色权限的授予和撤销操作,批量控制用户权限。此时的角色充当的是组(group)的概念,用户加入到这个组便拥有了这个组的权限。
- PostgreSQL不允许两个角色互为授权。
- PUBLIC为PostgreSQL中的特殊角色,不能将其设置为任何组的成员。
权限与继承
- 在SQL标准中,用户和角色存在明确的差异,用户不会自动继承权限,而角色会继承权限。
- PostgreSQL通过
INHERIT
和NOINHERIT
属性来实现上述标准,只需为角色设置INHERIT
属性,为用户设置NOINHERIT
属性。为了兼容8.1之前的版本属性,PostgreSQL默认为所有的角色设置了INHERIT
属性,因此用户默认会自动继承它所在组的权限。 - 只有数据库的对象上的普通权限可以被继承,角色的
LOGIN
、SUPERUSER
、CREATEDB
和CREATEROLE
权限被认为是特殊权限,不会被继承。
SET ROLE命令
- 用户在登录后,可使用
SET ROLE
命令,让当前会话临时拥有某个角色的权限; - 执行该命令后,此时会话将拥有角色的权限,而不是登录用户的权限;
- 会话过程创建的数据库对象将归角色所有,而不是登录用户所有。
案例说明
创建三个角色db_user
、net_manager
、sys_manager