PostgreSQL是通过角色来管理数据库访问权限的,我们可以将一个角色看成是一个数据库用户,或者一组数据库用户。角色可以拥有数据库对象,如表、索引,也可以把这些对象上的权限赋予其它角色,以控制哪些用户对哪些对象拥有哪些权限。
   
一、数据库角色:

    1. 创建角色:
    CREATE ROLE role_name;
   
    2. 删除角色:
    DROP ROLE role_name;
   
    3. 查询角色:
    检查系统表pg_role,如:
    SELECT usename FROM pg_role;
    也可以在psql中执行\du命令列出所有角色。
   
二、角色属性:

    一个数据库角色可以有一系列属性,这些属性定义他的权限,以及与客户认证系统的交互。
    1. 登录权限:
    只有具有LOGIN属性的角色才可以用于数据库连接,因此我们可以将具有该属性的角色视为登录用户,创建方法有如下两种:
    CREATE ROLE name LOGIN PASSWORD '123456‘;
    CREATE USER name PASSWORD '123456';
   
    2. 超级用户:
    数据库的超级用户拥有该数据库的所有权限,为了安全起见,我们最好使用非超级用户完成我们的正常工作。和创建普通用户不同,创建超级用户必须是以超级用户的身份执行以下命令:
    CREATE ROLE name SUPERUSER;
   
    3. 创建数据库:
    角色要想创建数据库,必须明确赋予创建数据库的属性,见如下命令:
    CREATE ROLE name CREATEDB;
   
    4. 创建角色:
    一个角色要想创建更多角色,必须明确给予创建角色的属性,见如下命令:
    CREATE ROLE name CREATEROLE;
   
三、权限:

    数据库对象在被创建时都会被赋予一个所有者,通常而言,所有者就是执行对象创建语句的角色。对于大多数类型的对象,其初始状态是只有所有者(或超级用户)可以对该对象做任何事情。如果要允许其它用户可以使用该对象,必须赋予适当的权限。PostgreSQL中预定义了许多不同类型的内置权限,如:SELECT、INSERT、UPDATE、DELETE、RULE、REFERENCES、TRIGGER、CREATE、TEMPORARY、EXECUTE和USAGE。
    我们可以使用GRANT命令来赋予权限,如:
    GRANT UPDATE ON accounts TO joe;
    对于上面的命令,其含义为将accounts表的update权限赋予joe角色。此外,我们也可以用特殊的名字PUBLIC把对象的权限赋予系统中的所有角色。在权限声明的位置上写ALL,表示把适用于该对象的所有权限都赋予目标角色。
    要撤销权限,使用合适的REVOKE命令:
    REVOKE ALL ON accounts FROM PUBLIC;
    其含义为:对所有角色(PUBLIC)撤销在accounts对象上的所有权限(ALL)。

四、角色成员:

    在系统的用户管理中,通常会把多个用户赋予一个组,这样在设置权限时只需给该组设置即可,撤销权限时也是从该组撤消。在PostgreSQL中,首先需要创建一个代表组的角色,之后再将该角色的membership权限赋给独立的用户角色即可。
    1. 创建一个组角色,通常而言,该角色不应该具有LOGIN属性,如:
    CREATE ROLE name;   
    2. 使用GRANT和REVOKE命令添加和撤消权限:
    GRANT group_role TO role1, ... ;
    REVOKE group_role FROM role1, ... ;
  一个角色成员可以通过两种方法使用组角色的权限,如:
    1. 每个组成员都可以用SET ROLE命令将自己临时"变成"该组成员,此后再创建的任何对象的所有者将属于该组,而不是原有的登录用户。
    2. 拥有INHERIT属性的角色成员自动继承它们所属角色的权限。
    见如下示例:
    CREATE ROLE joe LOGIN INHERIT;  --INHERIT是缺省属性。
    CREATE ROLE admin NOINHERIT;
    CREATE ROLE wheel NOINHERIT;
    GRANT admin TO joe;
    GRANT wheel TO admin;
    现在我们以角色joe的身份与数据库建立连接,那么该数据库会话将同时拥有角色joe和角色admin的权限,这是因为joe"继承(INHERIT)"了admin的权限。然而与此不同的是,赋予wheel角色的权限在该会话中将不可用,因为joe角色只是wheel角色的一个间接成员,它是通过admin角色间接传递过来的,而admin角色却含有NOINHERIT属性,这样wheel角色的权限将无法被joe继承。
  这样wheel角色的权限将无法被joe继承。此时,我们可以在该会话中执行下面的命令:
    SET ROLE admin;
    在执行之后,该会话将只拥有admin角色的权限,而不再包括赋予joe角色的权限。同样,在执行下面的命令之后,该会话只能使用赋予wheel的权限。
    SET ROLE wheel;
    在执行一段时间之后,如果仍然希望将该会话恢复为原有权限,可以使用下列恢复方式之一:
    SET ROLE joe;
    SET ROLE NONE;
    RESET ROLE;
    注意: SET ROLE命令总是允许选取当前登录角色的直接或间接组角色。因此,在变为wheel之前没必要先变成admin。
    角色属性LOGIN、SUPERUSER和CREATEROLE被视为特殊权限,它们不会像其它数据库对象的普通权限那样被继承。如果需要,必须在调用SET ROLE时显示指定拥有该属性的角色。比如,我们也可以给admin角色赋予CREATEDB和CREATEROLE权限,然后再以joe的角色连接数据库,此时该会话不会立即拥有这些特殊权限,只有当执行SET ROLE admin命令之后当前会话才具有这些权限。
    要删除一个组角色,执行DROP ROLE group_role命令即可。然而在删除该组角色之后,它与其成员角色之间的关系将被立即撤销(成员角色本身不会受影响)。不过需要注意的是,在删除之前,任何属于该组角色的对象都必须先被删除或者将对象的所有者赋予其它角色,与此同时,任何赋予该组角色的权限也都必须被撤消。

PostgreSQL角色和权限的更多相关文章

  1. PostgreSQL角色和权限理解

    1.继承的权限只是继承该组的表的权限,用户对应的管理员权限则不会被继承. 2.inherit权限是说本角色是否继承别人的权限,而不是本权限能否被别的角色继承.   postgres=# create ...

  2. PostgreSQL学习手册(角色和权限)

    原文地址:http://www.cnblogs.com/stephen-liu74/archive/2012/05/18/2302639.html PostgreSQL是通过角色来管理数据库访问权限的 ...

  3. PostgreSQL学习笔记(九) 用户、角色、权限管理

    PostgreSQL是一个多用户数据库,可以为不同用户指定允许的权限. 角色PostgreSQL使用角色的概念管理数据库访问权限. 根据角色自身的设置不同,一个角色可以看做是一个数据库用户,或者一组数 ...

  4. PostgreSQL 用户、角色、权限管理

    PostgreSQL是一个多用户数据库,可以为不同用户指定允许的权限. 角色 PostgreSQL使用角色的概念管理数据库访问权限. 根据角色自身的设置不同,一个角色可以看做是一个数据库用户,或者一组 ...

  5. [转帖]PostgreSQL的用户、角色和权限管理

    PostgreSQL的用户.角色和权限管理 2018年05月18日 14:02:29 jerry-89 阅读数 6143 https://blog.csdn.net/eagle89/article/d ...

  6. [转]PostgreSQL 逻辑结构 和 权限体系 介绍

    摘要: 本文旨在帮助用户理解PostgreSQL的逻辑结构和权限体系,帮助用户快速的理解和管理数据库的权限. 逻辑结构 最上层是实例,实例中允许创建多个数据库,每个数据库中可以创建多个schema,每 ...

  7. PostgreSQL角色问题

    角色 PostgreSQL使用角色的概念管理数据库访问权限. 根据角色自身的设置不同,一个角色可以看做是一个数据库用户,或者一组数据库用户. 角色可以拥有数据库对象(比如表)以及可以把这些对象上的权限 ...

  8. postgresql用户与权限管理

    pg使用角色的概念管理数据库访问权限,角色是一系列相关权限的集合.为了管理方便,通常把一系列先关的权限赋予给一个角色,如果哪个用户需要这些权限,就把这些角色赋予给响应的用户. 由于用户也拥有一系列的相 ...

  9. Oracle 用户、角色、权限(系统权限、对象权限)的数据字典表

    1 三者的字典表 1.1 用户 select * from dba_users; select * from all_users; select * from user_users; 1.2 角色 s ...

随机推荐

  1. ARM与单片机到底有啥区别

    1.软件方面    这应该是最大的区别了.引入了操作系统.为什么引入操作系统?有什么好处?    1)方便.主要体现在后期的开发,即在操作系统上直接开发应用程序.不像单片机一样一切都要重新写.前期的操 ...

  2. MVC和WebApi 使用get和post 传递参数。 转载https://blog.csdn.net/qq373591361/article/details/51508806

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/qq373591361/article/details/51508806我们总结一下用js请求服务器的 ...

  3. [Codeforces 729F] Financiers Game

    题意: 两个人分别从长度为n的数列的两端开始取数,如果前一 个人取了k个数,后一个人必须取k或k+1个. 第一个人最 开始可以取1个或2个,不能操作时结束. 两个人都希望自 己取到的数字之和尽量大,并 ...

  4. HTML段落,换行,字符实体

    HTML段落,换行,字符实体 html段落 <p>标签定义一个文本段落,一个段落含有默认的上下间距,段落之间会用这种默认间距隔开,代码如下: <!DOCTYPE html> & ...

  5. java多线程学习笔记(八)

    本节开始线程间通信: 使用wait/notify实现线程间通信 生产者/消费者模式的实现 方法join的使用 ThreadLocal类的使用 可以通过使用 sleep() 结合 while(true) ...

  6. redux请求数据流程

    redux请求数据流程 store里面的index.js文件 import {createStore,combineReducers,applyMiddleware} from "redux ...

  7. for语句基础求和练习

    结构 for(初始化表达式;条件表达式;循环后的操作表达式) { 循环体; } 1.求出1-10之间数据之和: class Hello2 { public static void main(Strin ...

  8. python面试如何以相反顺序展示一个文件的内容?

    >>> for line in reversed(list(open('Today.txt'))): print(line.rstrip())containeritertools D ...

  9. iview 分割面板效果(二)

    源码地址:https://gitee.com/yolanda624/coffer/tree/master/src/components/a-split-panel

  10. PHP应该学什么,如何学好PHP

    http://blog.sina.com.cn/s/blog_76bdabf70101azl4.html(注:原文来自传智播客) 本文转自http://blog.sina.com.cn/s/blog_ ...