PostgreSQL对现有,新建的表和视图授权给用户

由于开发提出需求:

(1)在多个PostgreSQL的instacne上面创建一个readonly用户,仅对数据库里面的表或者视图(包括物化视图)有仅有select权限,并且对以后新建的表和视图也要有select权限,我们知道PostgreSQL

在schema下新建的表,对于一个已经存在的用户不会自动赋予select的权限的,需要我们使用grant select...手动去执行,这样就比较麻烦,总不能每次新建表,我们就赋权一次,要知道我们有很多实例,总不能把时间都放在这样没有       意义的事情上,再说了我们也不能时刻监督有哪些PostgreSQL有新建的表,所以我们需要对未来的表提前授权,查看了一下PostgreSQL网站,发现命令alter default privileges...可以实现这个功能.

(2)alter default privileges没有对已经存在的表和视图授权的功能,所以想要对现在和未来的对象都赋权,还需要使用grant select对现有的表赋权.

(3)由于需要执行的db/schenma非常多,一条一条命令执行的话不太现实,需要编写脚本,批量执行.

(4)具体如何实现可以参考测试过程:

http://blog.51cto.com/darrenmemos/2086198

脚本如下:


#!/bin/ksh -x

# ###########################################################################

#       Name:            postgreSQL_grant_readonly_privileges.sh

#       Location:

#       Function:        PostgreSQL grant readonly privileges

#       Author:

#       Create Date:

#       update Date:

#############################################################################

/usr/local/pgsql/bin/psql -d postgres -q -t -c "select datname from pg_catalog.pg_database where datname not in('postgres','template1','template0');" | grep -v "^$" > /tmpb_list.log

while read db_name

do

/usr/local/pgsql/bin/psql -d ${db_name} -q -t -c "select schema_name from information_schema.schemata where schema_name not in pg_catalog','information_schema','pg_toast','pg_temp_1','pg_toast_temp_1');" | grep -v "^$" > /tmp/schema_list.log

while read schema_name

do

/usr/local/pgsql/bin/psql -d ${db_name} -q -t -c "grant select on all tables in schema ${schema_name} to readonly;"

/usr/local/pgsql/bin/psql -d ${db_name} -q -t -c "grant usage on schema ${schema_name} to readonly;"

/usr/local/pgsql/bin/psql -d ${db_name} -q -t -c "alter default privileges in schema ${schema_name} grant select on tables to readonly;"

done < /tmp/schema_list.log

done < /tmp/db_list.log

exit 0

然后就可以在服务器上批量执行了。

参考链接:

https://www.postgresql.org/docs/9.3/static/sql-grant.html

https://www.postgresql.org/docs/9.4/static/sql-alterdefaultprivileges.html

原文地址:http://blog.51cto.com/darrenmemos/2090666

时间: 2024-10-11 02:40:38

PostgreSQL对现有,新建的表和视图授权给用户的相关文章

PostgreSQL对现有的未来的表和视图授权给用户

由于开发提出需求: (1)在多个PostgreSQL的instacne上面创建一个readonly用户,仅对数据库里面的表或者视图(包括物化视图)有仅有select权限,并且对以后新建的表和视图也要有select权限,我们知道PostgreSQL 在schema下新建的表,对于一个已经存在的用户不会自动赋予select的权限的,需要我们使用grant select...手动去执行,这样就比较麻烦,总不能每次新建表,我们就赋权一次,要知道我们有很多实例,总不能把时间都放在这样没有意义的事情上,再说

Case: 一个read-only 角色对某个schema下的新建的表,无需单独授权,直接拥有只读权

Case: 一个read-only 角色对某个schema下的新建的表,无需单独授权,直接拥有只读权限 首先,你要知道PostgreSQL默认schema下新建的表,对于一个普通用户不会有select的权限的,所以我需要修改PostgreSQl默认的权限,把select提前赋予普通用户,需要使用到alter default privileges这个命令 Session1 (user:postgres): #psql create role role1 password '123456' logi

PostgreSQL使用函数的多表关联视图在排序时的性能问题

一.问题描述 近日PostgreSQL的某个表的记录数由万级增加到一百万级(设计能力是一亿)时,建立在该表之上的某个多表关联VIEW的查询性能急剧变慢(大约从10ms级跃升到100s级).经分析查询计划,发现瓶颈在于排序用时很长:而排序用时的诱因是什么?在排除掉一个个其它因素后,发现是VIEW定义中使用了函数(非内部函数,特此说明).在将自定义函数更改为等效的子查询或连接查询时,性能得到很好的改善. 因为实际的表.VIEW.函数都过于复杂,为描述及重现问题的关键,以下将表.VIEW.函数等都进行

oracle新建用户执行sql查询语句出现错误ORA-00942:表或视图不存在

oracle创建新用户后客户端执行SQL查询后出现错误提示如下: 执行查询语句如下: select * from sm_sales_order; ORA-00942:表或视图不存在 创建新用户并指定表空间和临时表空间 CREATE USER xxx IDENTIFIED BY xxxx DEFAULT TABLESPACE LMS TEMPORARY TABLESPACE TEMP; 授予系统权限connect grant connect to xxx; 授予对象权限,只限查询 grant se

《spring boot》8.2章学习时无法正常启动,报“ORA-00942: 表或视图不存在 ”

在学习<spring boot>一书的过程中,由于原书作者难免有一些遗漏的的地方,或者系统.软件版本不一致.框架更新等各种因素,完全安装书中源码页不能实现项目的正常启动 在8.2章节,演示JPA对oracle的支持时,配置文件中设置了如下代码,正常情况下应该支持数据库自动创建序列和表,但实际启动时却报错"ORA-00942: 表或视图不存在 " spring.datasource.driverClassName=oracle.jdbc.OracleDriver spring

转://Oracle A用户给B用户授权查询指定表或视图权限方案

用DNINMSV31账户登录数据库进行如下操作: CREATE USER NORTHBOUND IDENTIFIED BY NORTHBOUND DEFAULT TABLESPACE "TBS_DNINMSV31" TEMPORARY TABLESPACE "TEMP2" QUOTA UNLIMITED ON "TBS_DNINMSV31"; GRANT "CONNECT" TO NORTHBOUND;ALTER USER N

ORACLE授权用户查询另一个用户下的表与视图

实际应用中,会遇到在某个用户下需要查询另一个用户下的表数据或视图的情况,然而在没有授权时,会提示无权限操作的错误.那就需要通过授权处理后,再能进行查询操作,下面我们来看看是怎么处理的. 一.系统权限说明: 1.用户权限 CREATE SESSIOIN 连接到数据库 CREATE TABLE    在用户的方案中创建表 CREATE SEQUENCE 在用户的方案中创建序列 CREATE VIEW     在用户的方案中创视图 CREATE PROCEDURE在用户的方案中创建存储过程,函数或包

SQL Server根据表或视图批量生成插入语句并BCP导出成文本

--声明变量 DECLARE @TableName VARCHAR(100),@RunStr VARCHAR(MAX),@RunRC VARCHAR(MAX),@FinalRun VARCHAR(MAX) --在master库创建数据载体,也可以建立在其他数据库,但一定要是实体表,因为BCP导出不支持临时表 IF OBJECT_ID('master.dbo.tempinsertstr') IS NOT NULL DROP TABLE master.dbo.tempinsertstr CREATE

Oracle中关联表的视图创建

这几天的工作基本上没有了比较的新的技术点,就是反反复复的修改需求,修改Bug--当然,也是到了此刻,自己猜觉得在一个庞大的项目中,需求分析的重要性,以及需求说明书的重要性.我们在需求模糊.文档缺乏的条件下,反复修改功能已经成了家常便饭,今天领导说这个功能应该这样,我们就要立刻改到这样,第二天领导说又要原来的那样,我们只能再改回去了--有时候,我们也曾调侃自己是典型的面向领导开发-- 今天没有什么比较新的技术点来总结了,自己回顾了一下,这几天的工作,发现在关联表中创建视图的时候对于连接不是特别熟悉