一旦一个对象被创建,它会被分配一个所有者。所有者通常是执行创建语句的角色。对于大部分类型的对象,初始状态下只有所有者(或者超级用户)能够对该对象做任何事情。为了允许其他角色使用它,必须分配权限。

1 权限的类型

PostgreSQL中支持的对象级权限包括SELECT、INSERT、UPDATE、DELETE、TRUNCATE、REFERENCES、TRIGGER、CREATE、CONNECT、TEMPORARY、EXECUTE以及USAGE等以及一个附带WITH GRANT修饰符。除了GRANT外,前几类权限都可以顾名思义的猜到其含义,GRANT的在后面介绍。请注意,每种权限都有其适用的数据库资产类型,比如对于函数来说TRUNCATE权限毫无意义,对表来说EXECUTE权限也无意义。

2 入门介绍

创建数据库之前先使用管理员postgres用户创建一个角色,作为此数据库的所有者。一个特殊的名为PUBLIC的“角色”可以用来向系统中的每一个角色授予一个权限。同时,在数据库中有很多用户时可以设置“组”角色来帮助管理权限。

创建角色

create role mydb_admin login password 'postgres@123';

创建数据库并设定其所有者

create database mydb with owner = mydb_admin;

然后使用mydb_admin身份登录并创建schema和表。

3 GRANT

grant命令可以将权限授予他人。基本用法如下:

grant some_privilege to some_role;

牢记以下几条关于GRANT的使用原则。

  • 只有权限的拥有者才能将权限授予别人,并且拥有者自身还得有GRANT操作的权限。这一点是不言而喻的,因为自己没有的东西当然给不了别人。

  • 对象的所有者天然拥有此对象的所有权限,不需要再次授予。

  • 有些权限只有对象的所有者才能拥有,任何情况下都不能授予别人。这类权限包括DROP、ALTER和REVOKE,但是对象拥有者可以选择撤销他们自己的普通权限,例如把一个表变得对他们自己和其他人只读。

  • 授予时可以加上WITH GRANT OPTION子句,这意味着被授权者可以将得到的权限再次授予别人。示例如下:

    #如果后来授予选项被撤销,则所有从接收人那里获得的权限(直接或者通过授权链获得)都将被撤销。
    grant all on all tables in schema public to mydb_admin with grant option;
  • 如果希望一次性将某个对象的所有权限都授予某人,可以使用ALL关键字,而不需要一个个权限都写下来。

    grant all on mydb_admin.my_table to mydb_admin;
  • ALL 关键字还可以用于指代某个database或者schema中的所有对象。

    grant select, update on all sequences on schema my_schema to public;
  • 如果希望将权限授予所有人,可以使用PUBLIC关键字来指代所有角色。

    grant usage on scheam my_schema to public;

官方手册的”GRANT“(https://www.postgresql.org/docs/current/sql-grant.html )章节中对GRANT命令的所有细节都有及其详尽的说明,建议阅读,防止设错权限导致系统安全隐患。

4 REVOKE

默认情况下,所有用户都有一组权限(SELECT, INSERT, UPDATE, DELETE, TRUNCATE,REFERENCES和TRIGGER)通过特殊角色PUBLIC连接到所有新创建的表。为了确保某个用户不再能够访问某个表,对该表的权限必须从PUBLIC和该特定用户撤销。

从用户user1撤销表table1的所有权限,运行以下SQL命令:

REVOKE ALL ON table1 FROM user1;

不过,因为所有用户通常都可以通过 PUBLIC 角色访问该表,所以还必须执行以下操作。

REVOKE ALL ON table1 FROM PUBLIC;

5 默认权限

从pg9.0开始引入了默认权限,使用默认权限,用户可以一次性针对某个特定schema或database中的所有数据库资产进行权限设置操作,哪怕这些资产还没有创建。如果你的默认全新啊更新及时,那么这样可以大大简化权限管理的工作。

假设我们希望对所有数据库用户都授予某schema中所有函数和表的EXECUTE和SELECT权限,那么我们可以按下面示例来定义权限。

定义schema的默认权限

grant usage on schema my_schema to public;

alter default privileges in schema my_schema grant select, references on tables to public;

alter default privileges in schema my_schema grant all on tables to mydb_admin with grant option;

alter default privileges in schema my_schema grant select, update on sequences to public;

alter default privileges in schema my_schema grant all on functions to mydb_admin with grant option;

alter default privileges in schema my_schema grant usage on type to public;

新增或修改默认权限并不会影响已有的权限设置,即只有当某个对象的某项权限未专门设定的情况下,默认权限设定才会生效。

了解更多默认权限的信息,参考官方手册”修改默认权限“这一节(https://www.postgresql.org/docs/current/sql-alterdefaultprivileges.html )的内容。

PostgreSQL权限管理的更多相关文章

  1. PostgreSQL 用户和权限管理

    PostgreSQL 用户和权限管理 创建 CREATE ROLE rolename;CREATE USER username;CREATE USER和CREATE ROLE的区别在于,CREATE ...

  2. PostgreSQL学习之【用户权限管理】说明

    背景 最近在学习PostgreSQL,看了用户权限管理文档,涉及到的知识点比较多,顺便写篇文章进行整理并不定时更新,也方便自己后续进行查阅. 说明 注意:创建好用户(角色)之后需要连接的话,还需要修改 ...

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

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

  4. POSTGRESQL 批量权限 管理方法

    原博地址 https://yq.aliyun.com/articles/41512?spm=a2c4e.11153940.0.0.20b7640fcDiFQA 关于PostgreSQL的逻辑架构和权限 ...

  5. postgresql逻辑结构--用户及权限管理(七)

    一.用户和角色 二.创建用户和角色 三.权限管理 四.

  6. Greeplum 系列(七) 权限管理

    Greeplum 系列(七) 权限管理 一.角色管理 Role 分为用户(User)和组(Group),用户有 login 权限,组用来管理用户,一般不会有 login 权限.初始化 gp 时创建了一 ...

  7. Centos7安装gitlab11 学习笔记之基础概念、部署安装、权限管理、issue管理

    一.基础介绍 1.简介 一个基于GIT的源码托管解决方案 基于rubyonrails开发 集成了nginx postgreSQL redis sidekiq等组件 2.安装要求 2g内存以上,有点占内 ...

  8. Android权限管理之RxPermission解决Android 6.0 适配问题

    前言: 上篇重点学习了Android 6.0的运行时权限,今天还是围绕着Android 6.0权限适配来总结学习,这里主要介绍一下我们公司解决Android 6.0权限适配的方案:RxJava+RxP ...

  9. Android权限管理之Android 6.0运行时权限及解决办法

    前言: 今天还是围绕着最近面试的一个热门话题Android 6.0权限适配来总结学习,其实Android 6.0权限适配我们公司是在今年5月份才开始做,算是比较晚的吧,不过现在Android 6.0以 ...

  10. Android权限管理之Permission权限机制及使用

    前言: 最近突然喜欢上一句诗:"宠辱不惊,看庭前花开花落:去留无意,望天空云卷云舒." 哈哈~,这个和今天的主题无关,最近只要不学习总觉得生活中少了点什么,所以想着围绕着最近面试过 ...

随机推荐

  1. 三种循环的区别-break语句

    三种循环的区别 循环语句的区别 for 和 while 的小区别: 控制条件语句所控制的那个变量,在for循环结束后,就不能再被访问到了,而while循环结束还可以继 续使用,如果你想继续使用,就用w ...

  2. MRS_外部库相关问题汇总

    解决问题如下: CH32V307使用IQMath库时 使用MRS时,当使用到math数学库 CH32V307使用IQMath库时 CH32V307是支持硬件浮点的,可以是math.h中的sinf.IQ ...

  3. Python 内置界面开发框架 Tkinter入门篇 丙(文末有福利彩蛋,今天可是元宵节)

    以下内容为本人的学习笔记,如需要转载,请声明原文链接微信公众号「ENG八戒」https://mp.weixin.qq.com/s/B1hH5Qzd2RkAiiUId1tLWw 本文大概 2874 个字 ...

  4. JAVA虚拟机20-基于栈的解释器执行过程示例

    1.准备代码 public int calc() { int a = 100; int b = 200; int c = 300; return (a + b) * c; } 2.使用javap -v ...

  5. Session和Shiro的Session区别

    tomcat中的session常出现为jsessionId,而shiro的session不相同,两者的id不同. 在controller中,通过 request.getSession(_) 获取会话 ...

  6. Redux Toolkit 的使用方法

    Redux Toolkit 是什么? Redux Toolkit 是 Redux 官方强烈推荐,开箱即用的一个高效的 Redux 开发工具集.它旨在成为标准的 Redux 逻辑开发模式,我们强烈建议你 ...

  7. JZOJ 3432. 【GDOI2014模拟】服务器

    题目 解析 很容易想到的 \(dp\): 设 \(f_i\) 表示已经处理完 \(1..i\) 并且 \(i\) 是直接复制的需要的最小花费 那么 \(f_i=f_j+(i-j) \times (i- ...

  8. MySQL视图、存储过程、函数、触发器、定时任务、流程控制总结

    视图的增删改查 视图相当于一张只能读的表,不可以修改.当组成视图的表发生数据变化的时候,视图会相对应的进行改变. 存储过程的练习 创建存储过程: create [if not exists] proc ...

  9. Postgresql架构体系解析

    一.PostgreSQL物理架构 postgresql的物理架构非常简单,它由共享内存.一系列后台进程和数据文件组成. 二.Shared Memory 共享内存是服务器服务器为数据库缓存和事务日志缓存 ...

  10. pat 乙级1024 科学计数法关于stl中size()的一些思考即测试点六,无符号整数问题

    来,先看题目:1024 科学计数法 分数 20 作者 HOU, Qiming 单位 浙江大学 科学计数法是科学家用来表示很大或很小的数字的一种方便的方法,其满足正则表达式 [+-][1-9].[0-9 ...