PostgreSQL教程(十二):角色和权限管理介绍

 更新时间:2015年05月04日 10:30:33   投稿:junjie   我要评论
这篇文章主要介绍了PostgreSQL教程(十二):角色和权限管理介绍,本文讲解了数据库角色、角色属性、权限、角色成员,需要的朋友可以参考下

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 如何获取当前日期时间及注意事项

    PostgreSQL 如何获取当前日期时间及注意事项

    这篇文章主要介绍了PostgreSQL 如何获取当前日期时间及注意事项,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-10-10
  • PostgreSQL中常用的时间日期脚本使用教程

    PostgreSQL中常用的时间日期脚本使用教程

    PostgreSQL是一款简介而又性能强大的数据库应用程序,其在日期时间数据方面所支持的功能也都非常给力,下面就来看一下PostgreSQL中常用的日期时间脚本使用教程.
    2016-05-05
  • PostgreSQL中调用存储过程并返回数据集实例

    PostgreSQL中调用存储过程并返回数据集实例

    这篇文章主要介绍了PostgreSQL中调用存储过程并返回数据集实例,本文给出一创建数据表、插入测试数据、创建存储过程、调用创建存储过程和运行效果完整例子,需要的朋友可以参考下
    2015-01-01
  • PostgreSQL ERROR: invalid escape string 解决办法

    PostgreSQL ERROR: invalid escape string 解决办法

    这篇文章主要介绍了PostgreSQL ERROR: invalid escape string 解决办法,本文环境是JDBC+PostgreSQL,需要的朋友可以参考下
    2014-07-07
  • Ubuntu PostgreSQL安装和配置的介绍

    Ubuntu PostgreSQL安装和配置的介绍

    今天小编就为大家分享一篇关于Ubuntu PostgreSQL安装和配置的介绍,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-03-03
  • Abp.NHibernate连接PostgreSQl数据库的方法

    Abp.NHibernate连接PostgreSQl数据库的方法

    这篇文章主要为大家详细介绍了Abp.NHibernate连接PostgreSQl数据库的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • PostgreSQL教程(十五):系统表详解

    PostgreSQL教程(十五):系统表详解

    这篇文章主要介绍了PostgreSQL教程(十五):系统表详解,本文讲解了pg_class、pg_attribute、pg_attrdef、pg_authid、pg_auth_members、pg_constraint、pg_tablespace、pg_namespace、pg_database等表的作用和字段介绍,需要的朋友可以参考下
    2015-05-05
  • SQL Server数据迁移至PostgreSQL出错的解释以及解决方案

    SQL Server数据迁移至PostgreSQL出错的解释以及解决方案

    最近对SQL Server到PostgreSQL的数据迁移时出现了问题,返回的错误为:invalid byte sequence for encoding "UTF8": 0x00。经查证pg源代码,该问题引起的原因是sql server的字符类型字段中含有空字符\0,该字符在pg中不支持。
    2014-09-09
  • 详解PostgreSQL 语法中关键字的添加

    详解PostgreSQL 语法中关键字的添加

    这篇文章主要介绍了详解PostgreSQL 语法中关键字的添加的相关资料,这里说明下在parser语法解析模块添加关键字,需要的朋友可以参考下
    2017-08-08
  • PostgreSQL数据库事务实现方法分析

    PostgreSQL数据库事务实现方法分析

    这篇文章主要介绍了PostgreSQL数据库事务实现方法,简单讲述了事务的概念、功能,并结合实例形式分析了PostgreSQL数据库事务的定义方法及相关注意事项,需要的朋友可以参考下
    2018-08-08

最新评论