PostgreSQL_通过schema控制用户权限
背景环境
schema的特点
- schema概念像命名空间
- schema下不能再有schema嵌套
- 各个对象比如表,函数等存放在各个schema下
- 同一个schema下不能有重复的对象名字,但在不同schema下可以重复
使用schema的作用
- 方便管理多个用户共享一个数据库,但是又可以互相独立.
- 方便管理众多对象,更有逻辑性
- 方便兼容某些第三方应用程序,创建对象时是有schema的
比如要设计一个复杂系统,由众多模块构成,有时候模块间又需要有独立性。各模块存放单独的数据库显然是不合适的。 这时候使用schema来分类各模块间的对象,再对用户进行适当的权限控制,这样逻辑也非常清晰。
常用数据库中的schema异同
大多数数据库都有schema或者同等意义的概念,但是含义和具体操作不同。
- PostgreSQL中,一个database下可以有多个schema。可以给schema指定一个owner,如果没有指定,那么当前用户就是schema的默认owner。
- 在Oracle数据库中不能直接新建一个schema,系统在创建一个用户的同时为这个用户创建一个同名的schem并作为该用户的缺省shcema。即schema的个数同user的个数相同,而且schema名字同user名字一一 对应并且相同。
- 在MySQL中没有schema,所以创建一个database的效果和建立一个schema是相同的。我们可以简单的理解为,MySQL中的database就是schema。
本次测试软件环境如下
CentOS 7 x64
PostgreSQL 11.1
权限矩阵
我们需要在PostgreSQL中建立一个database,并且在这个db下建立多个schema。每个schema有自己的owner,并且db owner可以操作所有schema。
简单的权限关系矩阵如下
user \ schema | S00 | S01 | S02 |
---|---|---|---|
db_demo_owner (db owner 主用户) | Y | Y | Y |
schema_owner_01(子用户) | N | Y | N |
schema_owner_02(子用户) | N | N | Y |
初始化数据库
Superuser创建用户和数据库
-- 使用superuser登录(admin是提前建立的superuser,避免直接使用postgres)
psql --username=admin --dbname=postgres --password
复制代码
-- 新建用户,这个用户将成为Master用户
drop user if exists db_demo_owner;
create user db_demo_owner with password 'xxx';-- 新建一个子用户
drop user if exists schema_owner_01;
create user schema_owner_01 with password 'xxx';-- 通过设置权限组的方式让主用户拥有子用户的权限
-- db_demo_owner is member of schema_owner_01,即主用户db_demo_owner拥有schema_owner_01的权限
grant schema_owner_01 to db_demo_owner;-- 另一个子用户
drop user if exists schema_owner_02;
create user schema_owner_02 with password 'xxx';
grant schema_owner_02 to db_demo_owner;
复制代码
-- 新建一个测试用DB并分配给主用户
drop database if exists db_demo;
create database db_demo with encoding='utf8' owner=db_demo_owner;
复制代码
主用户创建schema(重点)
-- 主用户登录
psql --username=db_demo_owner --dbname=db_demo --password
复制代码
-- 不指定schema owner,默认是当前用户(主用户)
drop schema s00 cascade;
create schema s00 ; -- 用主用户建立schema并设置子用户为owner
drop schema s01 cascade;
create schema s01 authorization schema_owner_01 ;drop schema s02 cascade;
create schema s02 authorization schema_owner_02 ;
复制代码
主用户建表
-- 主用户登录
psql --username=db_demo_owner --dbname=db_demo --password-- 主用户在每个schema中建表t00
create table s00.t00(id int);
insert into s00.t00 values(1); create table s01.t00(id int);
insert into s01.t00 values(1);create table s02.t00(id int);
insert into s02.t00 values(1);
复制代码
子用户建表
不同子用户在自己的schema中建表
-- 子用户1 登录
psql --username=schema_owner_01 --dbname=db_demo --password create table s01.t01(id int);
insert into s01.t01 values(1);
复制代码
-- 子用户2 登录
psql --username=schema_owner_02 --dbname=db_demo --password create table s02.t02(id int);
insert into s02.t02 values(1);
复制代码
验证Owner
确认db owner
-- 主用户是DB Owner
postgres=# \l db_demoList of databasesName | Owner | Encoding | Collate | Ctype | Access privileges
---------+---------------+----------+-------------+-------------+-------------------db_demo | db_demo_owner | UTF8 | en_US.UTF-8 | en_US.UTF-8 |
(1 row)-- 主用户在子用户组里面,即已经拥有子用户的权限
postgres=# \du *owner*List of rolesRole name | Attributes | Member of
-----------------+------------+-----------------------------------db_demo_owner | | {schema_owner_01,schema_owner_02}schema_owner_01 | | {}schema_owner_02 | | {}
复制代码
确认schema owner
-- 三个schema分属于不同用户
db_demo=> \dn s*List of schemasName | Owner
------+-----------------s00 | db_demo_owners01 | schema_owner_01s02 | schema_owner_02
(3 rows)
复制代码
确认表owner
-- 五张表分属于不同的用户
db_demo=> \dt s*.List of relationsSchema | Name | Type | Owner
--------+------+-------+-----------------s00 | t00 | table | db_demo_owners01 | t00 | table | db_demo_owners01 | t01 | table | schema_owner_01s02 | t00 | table | db_demo_owners02 | t02 | table | schema_owner_02
(5 rows)
复制代码
验证访问权限
子用户
没有单独授权的时候,子用户仅能访问自己的表
-- 子用户1 登录
psql --username=schema_owner_01 --dbname=db_demo --password -- 无权限
db_demo=> select * from s00.t00;
ERROR: permission denied for schema s00db_demo=> select * from s02.t02;
ERROR: permission denied for schema s02-- 有权限
db_demo=> select * from s01.t01;id
----1
(1 row)
复制代码
主用户
主用户能够访问所有表
-- 主用户登录
psql --username=db_demo_owner --dbname=db_demo --password-- 都有权限
db_demo=> select * from s00.t00;id
----1
(1 row)db_demo=> select * from s01.t01;id
----1
(1 row)db_demo=> select * from s02.t02;id
----1
(1 row)
复制代码
变更schema owner
s02原来属于owner02,现在变更为owner01
-- 主用户登录
psql --username=db_demo_owner --dbname=db_demo --password-- 变更前
db_demo-> \dn s02List of schemasName | Owner
------+-----------------s02 | schema_owner_02
(1 row)-- 变更schema的owner到另一个子用户
alter schema s02 owner to schema_owner_01;-- 变更后
db_demo=> \dn s02List of schemasName | Owner
------+-----------------s02 | schema_owner_01
(1 row)
复制代码
重要提示:仅仅变更owner并不能修改已有表的权限,必须通过显式赋权
-- 变更指定表owner
alter table s02.t02 owner to schema_owner_01;-- 或者在不变更owner的情况下,批量赋权schema下的所有表
grant all on all tables in schema s02 to schema_owner_01;
复制代码
只读权限
经过前面的操作,子用户02已经没有任何访问权限了。我们希望这个子用户在所有schema都有只读权限。
-- 主用户登录
psql --username=db_demo_owner --dbname=db_demo --password-- 重要提示:这种方式仅对已经存在的表有效。以后建立的表不会自动有只读权限
grant usage on schema s00, s01, s02 to schema_owner_02;
grant select on all tables in schema s00, s01, s02 to schema_owner_02;
复制代码
如果我们希望以后建立的所有新表都可以自动获得只读权限(对已经存在的表无效),可以使用如下语句。
官方说明在这里
-- 对子用户01,02以后在schema s00,s01,s02下新建的表都有效
alter default privileges for user schema_owner_01, schema_owner_02 in schema s00, s01, s02 grant select on tables to schema_owner_02;
复制代码
转载于:https://juejin.im/post/5cd6a2606fb9a0324c20d970
PostgreSQL_通过schema控制用户权限相关推荐
- jeecg如何控制用户权限_如何为用户定制个性化控制台?
现在很多厂家都打着能"定制"控制台的名义进行宣传.控制台真的谁都能定制吗?定制是轻而易举的吗? 其实,真正能"定制"控制台的厂家所需要的首要条件就是拥有完整的生 ...
- oracle之控制用户权限和练习
- hive的用户和用户权限
hive的用户和用户权限 HiverServer2支持远程多客户端的并发和认证,支持通过JDBC.Beeline等连接操作.hive默认的Derby数据库,由于是内嵌的文件数据库,只支持一个用户的操作 ...
- Hive用户权限管理理解
HiverServer2支持远程多客户端的并发和认证,支持通过JDBC.Beeline等连接操作.hive默认的Derby数据库,由于是内嵌的文件数据库,只支持一个用户的操作访问,支持多用户需用mys ...
- hive 配置用户名_hive的用户和用户权限
HiverServer2支持远程多客户端的并发和认证,支持通过JDBC.Beeline等连接操作.hive默认的Derby数据库,由于是内嵌的文件数据库,只支持一个用户的操作访问,支持多用户需用mys ...
- oracle 如何查看权限,如何查看Oracle的用户权限
ORACLE数据字典视图的种类分别为:USER,ALL 和 DBA. USER_*:有关用户所拥有的对象信息,即用户自己创建的对象信息 ALL_*:有关用户可以访问的对象的信息,即用户自己创建的对象的 ...
- mysql用户控制登录_MySql用户权限控制_MySQL
bitsCN.com MySql用户权限控制 本文将介绍MySql创建帐号,删除帐号,设置和介绍各种帐号的权限 创建用户帐号: www.bitsCN.com [sql] CREATE USER use ...
- (笔记)Mysql命令grant on:增加新用户并控制其权限
grant on命令用于增加新用户并控制其权限. grant on命令格式:grant select on 数据库.* to 用户名@登录主机 identified by "密码" ...
- chmod 是一条在Unix系统中用于控制用户对文件的权限的命令
chmod 是一条在Unix系统中用于控制用户对文件的权限的命令(change mode单词前缀的组合)和函数.只有文件所有者和超级用户可以修改文件或目录的权限.可以使用绝对模式,符号模式指定文件的权 ...
最新文章
- 【网络编程】同步IO、异步IO、阻塞IO、非阻塞IO
- 点击头像单独把图片拉取出来.然后再次点击回到初始效果
- 刷题两个月,从入门到字节跳动offer,这是我的模板 | GitHub 1.2k星
- c怎么调用matlab dll,matlab和c++调用DLL方法(最新整理)
- How to mannuly configure vmtools in VM-Ware?
- 【十三单元】 软件安装 yum源配置
- java 管道流PipedInputStream,PipedInputStream和随机访问文件 RandomAccessFile
- javascript 西瓜一期 14 回顾 字符与编码 进制转换 数据保存
- (37)FPGA三种基本逻辑门(非门)
- 出差一个多星期,买了个肥皂,把衬衫全部洗了一遍
- Java开发之消息队列
- 保存Windows聚焦锁屏壁纸
- 计算机更改为英语,win7如何修改语言 电脑语言改成英文的方法
- Unity - Timeline 自定义剪辑,轨道,混合轨道,Inspector属性显示(使用Default Playables辅助工具)
- python代码测试健康指数计算器_python编写的bmi体重指数计算器、出租车费用计算器、个税计算器、猜数字游戏...
- 怎么用matlab保存音频文件,Matlab用图片和音频藏文件(续)
- 蓝桥杯练习 数的读法
- 解决GoLand上面出现的Couldn‘t copy unpacked SDK问题
- 微信小程序开发实录——每日速递
- C#窗体应用程序之复选框(ComboBox)与进度条(ProgressBar)应用——倒计时器