概述
相比mysql而言,postgresql在权限管理上最大的特点是引入了角色的概念,角色就是一系列相关权限的集合。比如mysql需要授权的话,直接给某个user在需要的对象上grant需要的权限,这样操作其实是比较繁琐的,你需要对每一个新建出来的账户都精细地分配不同的权限值,因为需要权限值可能会非常多且不同。而引入的角色的概念后,将可以将一些列相关的数据库权限赋给一个角色,然后再把角色赋给user就行。
在postgre中,一个用户也是一个角色,我们可以将一个用户的权限赋给另外一个用户,并且用户和角色在数据库实例层面是全局的。在初始化postgre时,有一个预定义的超级用户,这个用户名称就是你安装postgre时的linux系统账户。
角色的属性和创建语法
CREATE ROLE name [ [ WITH ] option [ ... ] ]
这里的option可以是:
SUPERUSER | NOSUPERUSER
| CREATEDB | NOCREATEDB
| CREATEROLE | NOCREATEROLE
| CREATEUSER | NOCREATEUSER
| INHERIT | NOINHERIT
| LOGIN | NOLOGIN
| REPLICATION | NOREPLICATION
| CONNECTION LIMIT connlimit
| [ ENCRYPTED | UNENCRYPTED ] PASSWORD 'password'
| VALID UNTIL 'timestamp'
| IN ROLE role_name [, ...]
| IN GROUP role_name [, ...]
| ROLE role_name [, ...]
| ADMIN role_name [, ...]
| USER role_name [, ...]
| SYSID uid
login privilege
只有具有LOGIN属性的角色才可以用作数据库连接的初始角色名。一个带有LOGIN属性的角色可以认为是和"数据库用户"相同的事物。要创建一个具有登录权限的角色,可以有以下两种方法
CREATE ROLE name LOGIN;
CREATE USER name;
也就是说,除了CREATEUSER默认赋予LOGIN之外,CREATEUSER 等价于CREATEROLE(默认不赋予CREATE ROLE)。
superuser status
数据库超级用户超越所有权限检查。这是一个危险的权限,应该小心使用;最好使用非超级用户完成你的大多数工作。要创建数据库超级用户,用CREATEROLE name SUPERUSER命令。你必须用已经是超级用户的角色执行这条命令。
database creation
角色要想创建数据库,必须明确给出权限(对于超级用户是例外,因为他们超越所有权限检查)。要创建这样的角色,用CREATEROLE name CREATEDB命令。
role creation
角色要想创建角色,必须明确给出权限(对于超级用户是例外,因为他们超越所有权限检查)。要创建这样的角色,用CREATEROLE name CREATEROLE 命令。一个带有CREATEROLE权限的角色也可以更改和删除其它角色,以及给其它角色赋予或者撤销成员关系。不过,要创建、更改、删除一个超级用户角色的成员关系,需要具有超级用户属性;只有CREATEROLE还不够。
initiating replication
角色要想启动流复制,必须明确给出权限(对于超级用户是例外,因为他们超越所有权限检查)。用于流复制的角色必须总是拥有LOGIN权限。要创建这样的角色,使用CREATEROLEname REPLICATIONLOGIN命令。
Password
只有在客户认证方法要求与数据库建立连接必须使用口令的时候,口令才比较重要。 password和md5认证方法使用口令。数据库口令与操作系统口令是无关的。在创建角色的时候可以这样声明一个口令:CREATEROLE name PASSWORD 'string'。
INHERIT
如果一个账户拥有某一个或多个角色,这时指定为INHERIT,则表示用户自动拥有相应角色的权限,否则这个账户没有该角色的权限。即决定一个角色是否"继承"它所在组的角色的权限。一个带有INHERIT属性的角色可以自动使用已经赋与它直接或间接所在组的任何权限。没有INHERIT,其它角色的成员关系只赋与该角色SET ROLE 成其它角色的能力;其它角色的权限只是在这么做了之后才能获得。如果没有声明,缺省是INHERIT。
CONNECTION LIMIT connlimit
如果角色可以登录,这个参数声明该角色可以使用的并发连接数量。-1(缺省)意味着没有限制。