关于PostgreSQL的逻辑架构和权限体系,可以参考
https://yq.aliyun.com/articles/41210
本文将给大家介绍一下如何批量管理表,视图,物化视图的权限。
以及如何管理默认权限,批量赋予schema的权限。

对整个schema的对象进行权限管理

PostgreSQL 从9.0开始就提供了比较方便的对整个schema的指定对象赋权给目标用的语法。
http://www.postgresql.org/docs/9.5/static/sql-grant.html
例子

GRANT { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER }[, ...] | ALL [ PRIVILEGES ] }ON { [ TABLE ] table_name [, ...]| ALL TABLES IN SCHEMA schema_name [, ...] }TO role_specification [, ...] [ WITH GRANT OPTION ]REVOKE [ GRANT OPTION FOR ]{ { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER }[, ...] | ALL [ PRIVILEGES ] }ON { [ TABLE ] table_name [, ...]| ALL TABLES IN SCHEMA schema_name [, ...] }FROM { [ GROUP ] role_name | PUBLIC } [, ...][ CASCADE | RESTRICT ]

将schema digoal下的所有表的select,update权限赋予给test用户。
注意
如果digoal.*中包含了非当前用户的表,并且当前用户非超级用户,并且当前用户没有这些表的select,update的with grant option权限。将报错。
换句话说,如果要确保这个赋权操作万无一失,可以选择使用超级用户来执行。

grant select,update on all tables in schema digoal to test;  

将schema digoal下的所有表的select,update权限从test用户回收。

revoke select,update on all tables in schema digoal from test;  

在对整个schema下的所有对象的权限管理完后, 别忘记了在对象之上,还需要对schema、database、instance进行相应的赋权。

如何设置用户创建的对象的默认权限

另一个问题,如何设置用户新建的对象的默认权限?
在PostgreSQL 9.0以后新加的语法:
http://www.postgresql.org/docs/9.5/static/sql-alterdefaultprivileges.html
例如

ALTER DEFAULT PRIVILEGES[ FOR { ROLE | USER } target_role [, ...] ][ IN SCHEMA schema_name [, ...] ]abbreviated_grant_or_revokewhere abbreviated_grant_or_revoke is one of:GRANT { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER }[, ...] | ALL [ PRIVILEGES ] }ON TABLESTO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]

例子:
将digoal用户未来在public下面创建的表的select,update权限默认赋予给test用户.

postgres=> alter default privileges for role digoal in schema public grant select,update on tables to test;
ALTER DEFAULT PRIVILEGES

将test用户未来在public,digoal下面创建的表的select,update权限默认赋予给digoal用户.

postgres=# alter default privileges for role test in schema public,digoal grant select,update on tables to digoal;
ALTER DEFAULT PRIVILEGES

查看已经赋予的默认权限

postgres=> \ddp+Default access privilegesOwner   | Schema | Type  |     Access privileges
----------+--------+-------+---------------------------digoal   | public | table | test=rw/digoaltest     | digoal | table | digoal=rw/testtest     | public | table | digoal=rw/test

SELECT pg_catalog.pg_get_userbyid(d.defaclrole) AS "Owner",n.nspname AS "Schema",CASE d.defaclobjtype WHEN 'r' THEN 'table' WHEN 'S' THEN 'sequence' WHEN 'f' THEN 'function' WHEN 'T' THEN 'type' END AS "Type",pg_catalog.array_to_string(d.defaclacl, E'\n') AS "Access privileges"
FROM pg_catalog.pg_default_acl dLEFT JOIN pg_catalog.pg_namespace n ON n.oid = d.defaclnamespace
ORDER BY 1, 2, 3;Owner   | Schema | Type  |     Access privileges
----------+--------+-------+---------------------------digoal   | public | table | test=rw/digoalpostgres |        | table | postgres=arwdDxt/postgres+|        |       | digoal=arwdDxt/postgrestest     | digoal | table | digoal=rw/testtest     | public | table | digoal=rw/test
(4 rows)

如何定制批量管理权限

将"指定用户" owne 的表、视图、物化视图的"指定权限"赋予给"指定用户",并排除"指定对象"
这个需求需要写一个函数来完成,如下

create or replace function g_or_v
(g_or_v text,   -- 输入 grant or revoke 表示赋予或回收own name,      -- 指定用户 owner target name,   -- 赋予给哪个目标用户 grant privilege to who?objtyp text,   --  对象类别: 表, 物化视图, 视图 object type 'r', 'v' or 'm', means table,view,materialized viewexp text[],    --  排除哪些对象, 用数组表示, excluded objectspriv text      --  权限列表, privileges, ,splits, like 'select,insert,update'
) returns void as
$$declarensp name;rel name;sql text;tmp_nsp name := '';
beginfor nsp,rel in select t2.nspname,t1.relname from pg_class t1,pg_namespace t2 where t1.relkind=objtyp and t1.relnamespace=t2.oid and t1.relowner=(select oid from pg_roles where rolname=own)loopif (tmp_nsp = '' or tmp_nsp <> nsp) and lower(g_or_v)='grant' then-- auto grant schema to target usersql := 'GRANT usage on schema "'||nsp||'" to '||target;execute sql;raise notice '%', sql;end if;tmp_nsp := nsp;if (exp is not null and nsp||'.'||rel = any (exp)) thenraise notice '% excluded % .', g_or_v, nsp||'.'||rel;elseif lower(g_or_v) = 'grant' thensql := g_or_v||' '||priv||' on "'||nsp||'"."'||rel||'" to '||target ;elsif lower(g_or_v) = 'revoke' thensql := g_or_v||' '||priv||' on "'||nsp||'"."'||rel||'" from '||target ;elseraise notice 'you must enter grant or revoke';end if;raise notice '%', sql;execute sql;end if;end loop;
end;$$language plpgsql;  

例子
将digoal用户的所有表(除了'public.test'和'public.abc')的select, update权限赋予给test用户.

postgres=# select g_or_v('grant', 'digoal', 'test', 'r', array['public.test', 'public.abc'], 'select, update');
NOTICE:  GRANT usage on schema "public" to test
NOTICE:  grant select, update on "public"."tb1l" to test
NOTICE:  grant select, update on "public"."new" to testg_or_v
--------(1 row)postgres=# \dp+ public.tb1l Access privilegesSchema | Name | Type  | Access privileges | Column privileges | Policies
--------+------+-------+-------------------+-------------------+----------public | tb1l | table | test=rw/digoal    |                   |
(1 row)
postgres=# \dp+ public.newAccess privilegesSchema | Name | Type  |   Access privileges   | Column privileges | Policies
--------+------+-------+-----------------------+-------------------+----------|      |       | test=rw/digoal        |                   |
(1 row)

从 test 用户回收digoal用户的所有表(除了'public.test'和'public.abc')的update权限.

postgres=# select g_or_v('revoke', 'digoal', 'test', 'r', array['public.test', 'public.abc'], 'update');
NOTICE:  revoke update on "public"."tb1l" from test
NOTICE:  revoke update on "public"."new" from testg_or_v
--------(1 row)postgres=# \dp+ public.tb1l Access privilegesSchema | Name | Type  | Access privileges | Column privileges | Policies
--------+------+-------+-------------------+-------------------+----------public | tb1l | table | test=r/digoal     |                   |
(1 row)postgres=# \dp+ public.newAccess privilegesSchema | Name | Type  |   Access privileges   | Column privileges | Policies
--------+------+-------+-----------------------+-------------------+----------|      |       | test=r/digoal         |                   |
(1 row)

希望这个例子对PostgreSQL的用户有帮助。

PostgreSQL 批量权限 管理方法相关推荐

  1. ssrs批量权限管理_管理SSRS安全性并使用PowerShell自动化脚本

    ssrs批量权限管理 So much has changed with Reporting Services 2016 but in terms of security it's the same u ...

  2. 数据库内核月报 - 2015 / 11-PgSQL · 答疑解惑 · PostgreSQL 用户组权限管理

    背景 RDS上的PG没有开放超级用户,这给很多云上的客户使用PG带来了困难.因此有必要给大家讲讲PG的用户权限管理的一些小知识,它可以很好的帮助用户顺利的从之前的 DB 管理方式过度到云上. PG 的 ...

  3. android 程序root权限管理,手机root之后进行软件程序授权管理 手机root权限管理方法...

    很多智能手机都会进行刷机,获取ROOT权限,但是如果没有进行正确的软件程序授权设置的话,使用起来跟没有ROOT之前是一样的,没办法获得软件程序的最高权限,软件也是没办法使用的.因此,今天,我们就一起来 ...

  4. drwxrwxrwx_你可能不知道的一些linux文件权限管理方法

    为什么需要权限管理? 1.计算机资源有限,我们需要合理的分配计算机资源. 2.Linux是一个多用户系统,对于每一个用户来说,个人隐私的保护是十分重要的 目录的 rwx 权限 当前用户:vagrant ...

  5. shiro教程(1)-基于url权限管理

    一. 权限管理 1.1 什么是权限管理 基本上涉及到用户参与的系统都要进行权限管理,权限管理属于系统安全的范畴,权限管理实现对用户访问系统的控制,按照安全规则或者安全策略控制用户可以访问而且只能访问自 ...

  6. RHCE系列之权限管理----ACL(访问控制列表)

    我们知道,在Linux操作系统中,传统的权限管理分是以三种身份(属主.属組以及其它人)搭配三种权限(可读.可写以及可执行),并且搭配三种特殊权限(SUID,SGID,SBIT),来实现对系统的安全保护 ...

  7. 从政府项目中总结出的B端产品账号权限管理

    工作原因做了一个政府机构的产品,里面涉及账号权限管理,通过做这个项目,总结了一下关于B端产品的账号权限管理方法. 客户需求是建设一个完成政府某些业务流程的一个产品,包括App和Web端, 要求不同单位 ...

  8. 简单的jsp权限管理

    简单权限管理的控制 权限管理 代码 权限管理 在java项目中经常会遇到用户的权限管理,通常有一种方法通过shiro框架来进行权限管理,现在我要说的是一种简单的权限管理方法,可以在jsp页面中添加ja ...

  9. java权限管理+授权与认证_权限管理(认证和授权)

    什么是权限管理 基本涉及到用户参与的系统都要进行权限管理,权限管理属于系统安全的范畴,权限管理实现对用户访问系统的控制,按照安全规则或者安全策略控制用户可以访问而且只能访问自己被授权的资源. 权限管理 ...

最新文章

  1. 听声辨位过时了!这个AI系统仅凭光回声就能得到3D图像
  2. Cisco的相关配置
  3. 网络运维之计算机端口
  4. SQL语言学习(六)分组函数学习
  5. 正则表达式入门及备忘
  6. MySQL 基础 ———— 视图的应用与总结
  7. c语言实现判断两个子图是否同构问题_经典问题-回溯法-最大团问题
  8. 心情的旅行- 让自己慢下来(46)
  9. 给定一个区间寻找三角形_计算给定图片中的三角形数量–程序化解决方案
  10. CentOS7 添加端口
  11. centos7 文件名中文乱码_CentOS 下中文文件名显示乱码问题
  12. 什么是炎症(inflammation)?抗生素?//2021-2-12
  13. 小马激活工具激活系统导致系统崩溃
  14. 串行通信又称为点对点通信(PtP),其中点对点如何理解
  15. 超参数的选择与交叉验证
  16. 【英语:基础高阶_全场景覆盖表达】K9.口语主题陈述——饮食健康类
  17. 怎么在Excel2003版中查找重复值
  18. 清晰度、分辨率、像素、4K、HDR的区别
  19. 圖譜謎宮(2019年6月28日於鄂爾多斯)
  20. 关于C++的数组或者字符串的输入问题

热门文章

  1. java观察者模式_Java设计模式之观察者模式详解
  2. sqlite复制数据主键重复_Flutter 数据库指南
  3. opennre 中文关系抽取_OpenNRE 2.0:可一键运行的开源关系抽取工具包
  4. 山东大学计算机学院预推免,山东大学计算机科学与技术学院(专业学位)计算机技术保研...
  5. π型滤波频率计算_滤波电路的总结
  6. python 列表有几个元素_python怎么向列表中添加多个元素
  7. Java在Quant应用_java – 如何绘制quantil band(在R中)
  8. loadrunner 调用java_LoadRunner调用Java程序—性能测试
  9. 【如何快速的开发一个完整的iOS直播app】(采集篇)
  10. 修改u-charts的点的大小和线的粗细