PostgreSQL创建只读账户
目前PostgreSQL并不能像MySQL一样直接对某个数据库赋予只读权限,现实中有研发需要新建一个用户然后赋予对某个数据库只读权限。
举例说明如何创建
用edbstore用户连接edbstore数据库,并创建一个测试schema
$ psql -U edbstore edbstore
psql (9.6.4)
Type "help" for help. edbstore=> create schema ota_data;
CREATE SCHEMA
edbstore=> \dn ota_data
List of schemas
Name | Owner
----------+----------
ota_data | edbstore
(1 row)
在测试schema下创建一张测试表并插入部分数据
edbstore=> set search_path to ota_data ;
SET
edbstore=> show search_path ;
search_path
-------------
ota_data
(1 row) edbstore=> create table tb1(name varchar,age int);
CREATE TABLE
edbstore=> insert into tb1 values('chris',23);
INSERT 0 1
edbstore=> insert into tb1 values('tonny',25);
INSERT 0 1
edbstore=> select * from tb1;
name | age
-------+-----
chris | 23
tonny | 25
(2 rows)
现在新建一个readonly用户并尝试访问edbstore用户下新建的测试数据
postgres=# create role readonly password 'readonly' login;
CREATE ROLE
$ export PGPASSWORD=readonly
$ psql -h 172.16.101.66 -U readonly edbstore
psql (9.6.)
Type "help" for help. edbstore=> set search_path to ota_data ;
SET
edbstore=> \d
No relations found.
可以看到默认情况下新用户readonly是无法看到edbstore用户下的数据的,现在赋予用户readonly查看schema对象的权限
edbstore=> GRANT USAGE ON SCHEMA ota_data TO readonly;
GRANT
readonly用户再次查看
edbstore=> \d
List of relations
Schema | Name | Type | Owner
----------+------+-------+----------
ota_data | tb1 | table | edbstore
(1 row) edbstore=> select * from tb1 ;
ERROR: permission denied for relation tb1
可以看到虽然用户可以查看到该对象,但是没用select权限,现在进行赋权
edbstore=> \dp
Access privileges
Schema | Name | Type | Access privileges | Column privileges | Policies
----------+------+-------+-------------------+-------------------+----------
ota_data | tb1 | table | | |
(1 row) edbstore=> GRANT SELECT ON ALL TABLES IN SCHEMA ota_data TO readonly;
GRANT
edbstore=> \dp
Access privileges
Schema | Name | Type | Access privileges | Column privileges | Policies
----------+------+-------+---------------------------+-------------------+----------
ota_data | tb1 | table | edbstore=arwdDxt/edbstore+| |
| | | readonly=r/edbstore | |
(1 row)
readonly用户再次查看
edbstore=> select * from tb1 ;
name | age
-------+-----
chris | 23
tonny | 25
(2 rows) edbstore=> insert into tb1 values('tina',19);
ERROR: permission denied for relation tb1
该命令只能对已经存在的对象(表,视图等)赋权,新建立的表,readonly用户是无法查看的,新建一张表
edbstore=> create table tb2 as select * from tb1;
SELECT 2
edbstore=> \dp
Access privileges
Schema | Name | Type | Access privileges | Column privileges | Policies
----------+------+-------+---------------------------+-------------------+----------
ota_data | tb1 | table | edbstore=arwdDxt/edbstore+| |
| | | readonly=r/edbstore | |
ota_data | tb2 | table | | |
(2 rows)
readonly用户再次查看
edbstore=> \d
List of relations
Schema | Name | Type | Owner
----------+------+-------+----------
ota_data | tb1 | table | edbstore
ota_data | tb2 | table | edbstore
(2 rows) edbstore=> select * from tb2;
ERROR: permission denied for relation tb2
为了让readonly用户可以有权限继续查看新建的表,需要为该新建的schema指定default权限
edbstore=> ALTER DEFAULT PRIVILEGES IN SCHEMA ota_data GRANT SELECT ON TABLES TO readonly;
ALTER DEFAULT PRIVILEGES
edbstore=> \ddp
Default access privileges
Owner | Schema | Type | Access privileges
----------+----------+-------+---------------------
edbstore | ota_data | table | readonly=r/edbstore
(1 row) edbstore=> create table tb3 as select * from tb1;
SELECT 2
edbstore=> \dp
Access privileges
Schema | Name | Type | Access privileges | Column privileges | Policies
----------+------+-------+---------------------------+-------------------+----------
ota_data | tb1 | table | edbstore=arwdDxt/edbstore+| |
| | | readonly=r/edbstore | |
ota_data | tb2 | table | | |
ota_data | tb3 | table | edbstore=arwdDxt/edbstore+| |
| | | readonly=r/edbstore | |
(3 rows)
可以看到新建的表tb3会自动继承我们给该schema下的表预定义的select权限。
edbstore=> select * from information_schema.role_table_grants where grantee='readonly';
grantor | grantee | table_catalog | table_schema | table_name | privilege_type | is_grantable | with_hierarchy
----------+----------+---------------+--------------+------------+----------------+--------------+----------------
edbstore | readonly | edbstore | ota_data | tb1 | SELECT | NO | YES
edbstore | readonly | edbstore | ota_data | tb3 | SELECT | NO | YES
(2 rows)
如何取消该权限
alter default privileges in schema public revoke select on tables from readonly ;
关于如何对整个输几局所有schema添加权限可以参考如下命令:
select 'grant usage on schema '|| schema_name || ' to readonly ;' from information_schema.schemata; select 'GRANT SELECT ON ALL TABLES IN SCHEMA '|| schema_name || ' TO readonly ;' from information_schema.schemata; select 'ALTER DEFAULT PRIVILEGES IN SCHEMA '|| schema_name || ' GRANT SELECT ON TABLES TO readonly ;' from information_schema.schemata;
PostgreSQL创建只读账户的更多相关文章
- Mysql 创建只读账户
mysql 创建只读账户: 1.查询所有账号信息 SELECT DISTINCT a.`User`,a.`Host`,a.password_expired,a.password_last_change ...
- PostgreSQL创建只读权限的用户
1.创建只读角色 CREATE ROLE readaccess; 2.授予对现有表的访问权限 GRANT USAGE ON SCHEMA public TO readaccess; GRANT SEL ...
- PostgreSQL创建只读用户
创建用户及指定密码: CREATE USER readonly WITH ENCRYPTED PASSWORD 'ropass'; 设置用户默认事务只读: alter user readonly se ...
- K8S dashboard 创建只读账户
1.创建名字为“Dashboard-viewonly“的Cluster Role,各种资源只给予了list,get,watch的权限.dashboard-viewonly.yaml --- apiVe ...
- Azure SQL Database (25) Azure SQL Database创建只读用户
<Windows Azure Platform 系列文章目录> 本文将介绍如何在Azure SQL Database创建只读用户. 请先按照笔者之前的文章:Azure SQL Databa ...
- 如何在PostgreSQL中建只读账号
转: 如何在PostgreSQL中建只读账号 Posted on 2014-01-21 22:00:15 by osdba 在PostgreSQL中并没有CREATE TABLE权限名称,这是与其它数 ...
- ORACLE权限管理—创建只读账号
创建只读用户:grant connect to user; grant create session to user; 1.创建角色 CREATE ROLE SELECT_ROLE 2.给角色分配权限 ...
- 给你的Kubernetes集群建一个只读账户(防止高管。。。后)
给你的Kubernetes集群建一个只读账户 需求:我们知道搭完k8s集群会创建一个默认的管理员kubernetes-admin用户该用户拥有所以权限,有一天开发或测试的同学需要登录到k8s集群了解业 ...
- postgresql 设置只读用户
postgresql 设置只读用户 ` CREATE USER readonly WITH ENCRYPTED PASSWORD 'ropass'; alter user readonly set d ...
随机推荐
- Python CGI编程Ⅹ
检索Cookie信息 Cookie信息检索页非常简单,Cookie信息存储在CGI的环境变量HTTP_COOKIE中,存储格式如下: 以下是一个简单的CGI检索cookie信http://www.we ...
- redis过期策略、内存淘汰策略、持久化方式、主从复制
原文链接:https://blog.csdn.net/a745233700/article/details/85413179 一.Redis的过期策略以及内存淘汰策略:1.过期策略:定期删除+惰性删除 ...
- [Linux系统] (4)脚本编程
一.bash shell 可以理解为一种解释器和启动器,解释命令文本,并执行命令. 命令来源: 用户交互输入 文本文件输入 1.示例,写一个最简单的文本 vi test.txt 写入以下内容: ech ...
- 使用word2vec对中文维基百科数据进行处理
一.下载中文维基百科数据https://dumps.wikimedia.org/zhwiki/并使用gensim中的wikicorpus解析提取xml中的内容 二.利用opencc繁体转简体 三.利用 ...
- Spring boot之使用thymeleaf
操作步骤 (1)在pom.xml中引入thymeleaf; (2)如何关闭thymeleaf缓存 (3)编写模板文件.html (4)编写访问模板文件controller 在pom.xml中引入thy ...
- java栈和队列
栈 可变长数组实现 链表实现 数组与链表的对比队列 链表实现 栈 下压栈(简称栈)是一种基于后进后出(LIFO)策略的集合类型.这里学习分别用数组和链表这两种基础数据结构来实现 ...
- linux挂载本地镜像
//创建挂载目录 mkdir /media/cdrom //挂载镜像 mount -t iso9660 /dev/cdrom /media/cdrom 提示:mount:block device /d ...
- centos6 yum安装mysql 5.6 (完整版)
使用源代码编译安装mysql还是比较麻烦,一般来说设备安装时请网络同事临时开通linux上网,通过yum网络实现快速安装,或配置yum仓库进行内网统一安装. 通过网络快速安装过程如下 一.检查系统是否 ...
- 用Python将二进制文件转化为数组并以文件形式存储
最近在学习Python,发现Python语言非常适合文件的批处理操作.本文将介绍一下用Python如何实现将一个二进制bin文件转化为一个常量数组的.c文件存储起来.这为我们在一些没有文件系统不能调用 ...
- golang 开源项目: 配置解析模块--config
在golang中,配置文件经常使用json格式.json格式的语法,有些繁琐,尤其是出现嵌套的时候,每一块都需要大括号包裹,看起来很臃肿. 本着简单易用的原则,个人开发了一个配置解析模块config, ...