PostgreSQL数据库角色和权限

来源:互联网 发布:python 里的key 编辑:程序博客网 时间:2024/04/30 01:36

PostgreSQL使用角色来管理数据库的访问权限,数据库角色跟操作系统用户是不相关的,数据库角色只是用来管理数据库。根据角色不同,一个角色可以看做是一个用户,或者一组用户。角色可以有数据库对象,例如表,视图,也可以把这些对象上的访问权限赋予其他角色,这样其他角色也可以访问不属于他自身的其他对象。

角色的概念替换了"用户"和"组"。在PostgreSQL 版本8.1之前,用户和组是独立类型的记录,但现在它们只是角色。任何角色都可以是 一个用户、一个组、或者两者。

1、创建角色

postgres=# create role zxy_1;
CREATE ROLE

2、查看当前的角色,可查看系统表pg_roles

postgres=# select rolname from pg_roles;
 rolname
----------
 postgres
 zxy
(2 行记录)

注意:psql的元命令\du也可以查看当前角色

postgres=# \du
                             角色列表
 角色名称 |                    属性                    | 成员属于
----------+--------------------------------------------+----------
 postgres | 超级用户, 建立角色, 建立 DB, 复制, 绕过RLS | {}
 zxy      | 超级用户, 建立 DB

补充:postgres这个角色最初创建数据库系统时,默认创建的超级用户角色,在数据库创建完之后是通过它与数据库最先连接的,通过它连接之后,你才能创建更多的角色。


3、删除角色
postgres=# drop role rolename;


二、 角色属性

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

  • 登陆(login):具有login属性的角色可以连接数据库,一个带有login属性的角色可以等同于“数据库用户”,因为数据库用户创建的时候默认自带login属性.
  • 超级用户(superuser):超级用户拥有至高无上的权限,但是这个权限分配的时候,一定要小心,想要创建超级用户,必须使用带超级用户的角色去创建带“超级用户”的角色 .
  • 创建数据库(createdb):创建数据库属性,顾名思义就是拥有“创建数据库”属性的角色可以创建数据库,对于超级用户的角色来说,自身可以创建数据库,不用带“创建数据库”属性 .
  • 创建角色(createrole):带有“创建角色”属性的角色可以创建其他角色。一般带有“创建角色”属性的角色还可以删除和更改其他角色(删除和更改只限于普通用户) 
  • 口令(password):只有在客户认证方法要求与数据库建立连接必须使用口令的时候, 口令才比较重要.

注意:

  1.  关于login属性,除了创建数据库默认创建的postgres可以直接登陆,其他角色登陆数据必须有login属性,就算是“超级用户”角色都不能
  2. 一个角色的属性可以在创建后用ALTER ROLE修改,并不是一成不变的。详情可 参考\h create role 和\h alter role 来查看
  3. 创建一个具有CREATEDB和CREATEROLE权限, 但是并非超级用户的角色是一个很好的习惯, 你可以使用这个角色进行所有日常的数据库和角色管理。 这个方法避免了以超级用户操作时,发生误操作导致的严重后果.

练习

postgres=# create role zxy_1 login;
CREATE ROLE
postgres=# create role zxy_2 superuser;
CREATE ROLE
postgres=# create role zxy_3 createdb;
CREATE ROLE
postgres=# create role zxy_4 createrole;
CREATE ROLE
postgres=# create role zxy_5 password 'zxy_5';
CREATE ROLE
postgres=# \du
                             角色列表
 角色名称 |                    属性                    | 成员属于
----------+--------------------------------------------+----------
 postgres | 超级用户, 建立角色, 建立 DB, 复制, 绕过RLS | {}
 zxy      | 超级用户, 建立 DB                          | {}
 zxy_1    |                                            | {}
 zxy_2    | 超级用户, 无法登录                         | {}
 zxy_3    | 建立 DB, 无法登录                          | {}
 zxy_4    | 建立角色, 无法登录                         | {}
 zxy_5    | 无法登录                                   | {}

赋予zxy_2密码和Login属性,则就可以登陆数据库
postgres=# alter role zxy_2 password 'zxy';
ALTER ROLE
postgres=# alter role zxy_2 login;
ALTER ROLE
postgres=# select current_role;
 current_user
--------------
 zxy_2
(1 行记录)

查看角色的属性详情,可以查看pg_roles。
postgres=# select oid,rolname,rolsuper,rolcreaterole,rolcreatedb,rolcanlogin,rolpassword from pg_roles;
  oid  | rolname  | rolsuper | rolcreaterole | rolcreatedb | rolcanlogin | rolpassword
-------+----------+----------+---------------+-------------+-------------+-------------
    10 | postgres | t        | t             | t           | t           | ********
 24577 | zxy      | t        | f             | t           | t           | ********
 24597 | zxy_1    | f        | f             | f           | t           | ********
 24599 | zxy_3    | f        | f             | t           | f           | ********
 24600 | zxy_4    | f        | t             | f           | f           | ********
 24601 | zxy_5    | f        | f             | f           | f           | ********
 24598 | zxy_2    | t        | f             | f           | t           | ********
(7 行记录)

三、权限

权限就是该用户或者角色是否对能某个对象做任何事情,这个能力代表的就是权限,权限允许你可以操作这个对象,你想要操作,则必须要赋予相应的权限。常见的一些权限如: SELECT,INSERT,UPDATE, DELETE, TRUNCATE, REFERENCES,TRIGGER,CREATE, CONNECT, TEMPORARY, EXECUTE, andUSAGE等等。

使用GRANT命令赋予权限,要撤销权限,使用REVOKE命令

postgres=# grant select on t_1 to zxy_1;
GRANT

zxy_1=> select* from t_1;

 id | name

----+-------

  1 | smith

 10 | sott

(2 行记录)


postgres=# revoke select on t_1 from zxy_1;
REVOKE

zxy_1=> select* from t_1;

错误:  对关系t_1 权限不够