(一)概念的区分
最近在学数据库,老师要求我们通过使用postgresql来学习。拿着用SQL server演示的教材,看着SQL server的实验指导书,在Postgresql上做实现,虽说都是关系型数据库,但是很多概念都是不一样的,真的是相当难受。使用postgresql的人在国内比较少,在学习访问权限的时候遇到很多问题,在度娘上没找到答案,只好自己查阅了官方文档,经过大量的实践才算略懂一二。在此分享给大家,说的很啰嗦,请谅解。注下面的实践都是在PostgreSQL 9.5上完成的,图形化管理软件为pgAdmin III。
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.意思是一个角色是一个可以有自己的数据库对象和数据库操纵权限的实体,一个角色可以被认为是一个“用户”,一个“组”,或者两者都可,取决于它的使用方式。
Postgresql的官方文档上对于CREATE USER命令的说明是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中登录角色、组角色和用户本质上都是角色;看下面的操作就知道了。
在psql shell中输入这上面两条命令创建的角色如下图所示:
如图,使用CREATE ROLE创建的角色在组角色下,使用CREATE USER创建的角色在登录角色栏下。
(二)角色的权限分配
PostgreSQL存在两种权限,一种是角色权限即role attribute(例如创建角色,创建数据库,修改目录等),另一种是操作数据库的权限即privilege(例如数据库的连接,数据表的各种操作等)。下面分别来说。
(1) 角色权限
一个数据库角色可以有一系列属性,这些属性定义他的权限,以及与客户认证系统的交互。如下图
(2) 数据库权限、成员角色及权限的继承
PostgreSQL中预定义了许多不同类型的数据库内置权限,如:SELECT、INSERT、UPDATE、DELETE、RULE、REFERENCES、TRIGGER、CREATE、TEMPORARY、EXECUTE和USAGE。
任何角色都可以是成员角色,但是只有组角色能拥有成员角色。成员角色会自动继承父角色(它所属的组角色)的数据库权限。
一个登录角色最终的权限等于其各个组角色所得权限的总合。
数据库的权限需要逐层授予,列如某个登录角色想要查看某张具体的表,那么他所属的组角色需要同时获得这张表所在的数据库的connect权限、所在架构的usage权限和这张表的Select权限。权限不够时系统给出得提示如以下三图:
在pgAdmin中授予这些权限的方法是分别鼠标右击数据库名、架构名、数据表名在展开菜单中选择属性,然后选择权限选项卡,选择相应的组角色,勾选需要的权限点击添加即可。
!!!!!注意!!!!!数据库对象是不能直接把权限授予普通登录角色的,只能将权限授予登录角色所在的组角色或者是带有超级用户属性的登录角色(准确说超级用户的行为是不被检查的)。那么如果你的登录角色没有组角色,那就给他创建一个组角色,让登录角色成为组角色的成员角色。另外,我强烈建议不要随便给登录角色赋予超级用户权限,因为这是相当危险的。