(一)概念的区分

    Postgresql的官方文档上对于role的定义是A role is an entity that can own database objectsand have database privileges; a role can be considered a "user",a "group", or both depending on how it isused.意思是一个角色是一个可以有自己的数据库对象数据库操纵权限的实体,一个角色可以被认为是一个“用户”,一个“组”,或者两者都可,取决于它的使用方式。

CREATEUSER is now an alias forCREATEROLE. The only difference is that when the command is spelled CREATE USER,LOGIN is assumed by default,whereas NOLOGIN is assumed whenthe command is spelledCREATEROLE.也就是说CREATE USER实际上就是CREATE ROLE,唯一不同的是, CREATE USER命令默认是带有登录权限的,而CREATE ROLE则没有

       而所谓的登录角色和组角色在似乎是pgAdmin所定义的,我官方文档上并没有找到login role或者group role的定义,不过我找到这样一条说明The concept of rolessubsumes the concepts of "users" and "groups". In PostgreSQLversions before 8.1, users and groups were distinct kinds of entities, but nowthere are only roles. Any role can act as a user, a group, or both.

大家自己理解把。(看这意思似乎是8.1版之前存在过users和groups的概念,不过现在都是role了

       总的来说,登录角色就是具有登录权限的角色,是通常意义上的用户,不具有登录权限的角色就是组角色,是一些登录角色的集合。这样的目的是为了方便批量授权。在PostgreSQL中登录角色、组角色和用户本质上都是角色;看下面的操作就知道了。

sql server 2017 用户组或角色 在当前数据库中已存在 sql里面的角色和用户区别_数据库

 

在psql shell中输入这上面两条命令创建的角色如下图所示:

sql server 2017 用户组或角色 在当前数据库中已存在 sql里面的角色和用户区别_sql_02

 

如图,使用CREATE ROLE创建的角色在组角色下,使用CREATE USER创建的角色在登录角色栏下。

(二)角色的权限分配

PostgreSQL存在两种权限,一种是角色权限即role attribute(例如创建角色,创建数据库,修改目录等)另一种是操作数据库的权限即privilege(例如数据库的连接,数据表的各种操作等)。下面分别来说。

(1)     角色权限

一个数据库角色可以有一系列属性,这些属性定义他的权限,以及与客户认证系统的交互。如下图

sql server 2017 用户组或角色 在当前数据库中已存在 sql里面的角色和用户区别_sql_03

 

(2)     数据库权限、成员角色及权限的继承

PostgreSQL中预定义了许多不同类型的数据库内置权限,如:SELECT、INSERT、UPDATE、DELETE、RULE、REFERENCES、TRIGGER、CREATE、TEMPORARY、EXECUTE和USAGE。

         任何角色都可以是成员角色,但是只有组角色能拥有成员角色。成员角色会自动继承父角色(它所属的组角色)的数据库权限。

         一个登录角色最终的权限等于其各个组角色所得权限的总合。

数据库的权限需要逐层授予,列如某个登录角色想要查看某张具体的表,那么他所属的组角色需要同时获得这张表所在的数据库的connect权限、所在架构的usage权限和这张表的Select权限。权限不够时系统给出得提示如以下三图:

 

sql server 2017 用户组或角色 在当前数据库中已存在 sql里面的角色和用户区别_PostgreSQL_04

 

sql server 2017 用户组或角色 在当前数据库中已存在 sql里面的角色和用户区别_数据库_05

 

sql server 2017 用户组或角色 在当前数据库中已存在 sql里面的角色和用户区别_PostgreSQL_06

 

在pgAdmin中授予这些权限的方法是分别鼠标右击数据库名、架构名、数据表名在展开菜单中选择属性,然后选择权限选项卡,选择相应的组角色,勾选需要的权限点击添加即可。

!!!!!注意!!!!!数据库对象是不能直接把权限授予普通登录角色的,只能将权限授予登录角色所在的组角色或者是带有超级用户属性的登录角色(准确说超级用户的行为是不被检查的)。那么如果你的登录角色没有组角色,那就给他创建一个组角色,让登录角色成为组角色的成员角色。另外,我强烈建议不要随便给登录角色赋予超级用户权限,因为这是相当危险的。


PostgreSQL roles can be a single role, or they can function as a group of roles. A user is simply a role with the ability to login (the role has the LOGIN attribute). Because all roles created by Cloud SQL have the LOGIN attribute, Cloud SQL uses the terms "role" and "user" interchangeably. However, if you create a role with the psql client, it does not necessarily have the LOGIN attribute.

All PostgreSQL users must have a password. You cannot login with a user that does not have a password

Translated:

PostgreSQL角色可以是单个角色,也可以作为一组角色运行。 用户只是具有登录能力的角色(该角色具有LOGIN属性)。 由于Cloud SQL创建的所有角色都具有LOGIN属性,因此Cloud SQL可互换地使用术语“角色”和“用户”。 但是,如果使用psql客户端创建角色,则它不一定具有LOGIN属性。

所有PostgreSQL用户都必须拥有密码。 您无法使用没有密码的用户登录