场景:test1库下有多个模式(cms、bmn、englo),想要创建普通用户,使得用户只能读对应模式下的表。对其他模式的表无法访问。(示例默认创建与模式名同名的用户名)

1、创建模式以及用户

--新建模式
test1=# create schema cms;
CREATE SCHEMA
test1=# create schema bmn;
CREATE SCHEMA
test1=# create schema englo;
CREATE SCHEMA
test1=#
test1=#

--新建用户
test1=# create user cms with password '123456';
CREATE ROLE
test1=# create user bmn with password '123456';
CREATE ROLE
test1=# create user englo with password '123456';
CREATE ROLE

2、授予该用户对指定模式下的表的select权限

--grant select on all tables in schema 模式名 to 用户名;

test1=# grant select on all tables in schema cms to cms;
GRANT
test1=# grant select on all tables in schema bmn to bmn;
GRANT
test1=# grant select on all tables in schema englo to englo;
GRANT

3、执行该命令授予模式权限

---grant USAGE on SCHEMA 模式名 to 用户名 ;

test1=# grant USAGE on SCHEMA cms to cms ;
GRANT
test1=# grant USAGE on SCHEMA bmn to bmn ;
GRANT
test1=# grant USAGE on SCHEMA englo to englo ;
GRANT

4、执行该命令可以对之后创建的新表也有查询权限,不配置则只能查看已有的表

-- alter default privileges in schema 模式名 grant select on tables to 用户名;

test1=# alter default privileges in schema cms grant select on tables to cms;
ALTER DEFAULT PRIVILEGES
test1=# alter default privileges in schema bmn grant select on tables to bmn;
ALTER DEFAULT PRIVILEGES
test1=# alter default privileges in schema englo grant select on tables to englo;
ALTER DEFAULT PRIVILEGES

5、测试

在三个模式中分别建表并插入数据,分别使用不同而用户访问表数据

test1=# create table cms.cmst1(id int,name varchar(100));
CREATE TABLE
test1=#
test1=# create table bmn.bmnt1(id int,name varchar(100));
CREATE TABLE
test1=# create table englo.englot1(id int,name varchar(100));
CREATE TABLE
test1=#
test1=# insert into cms.cmst1 values(1,'石家庄'),(2,'秦皇岛'),(3,'北京'),(4,'青岛');
INSERT 0 4
test1=#
test1=# insert into bmn.bmnt1 values(1,'成都'),(2,'重庆'),(3,'济南'),(4,'西安');
INSERT 0 4
test1=# insert into englo.englot1 values(1,'长沙'),(2,'武汉'),(3,'新疆'),(4,'苏州');
INSERT 0 4

5.1 使用cms用户:
--cms用户访问查询:

test1=# \c test1 cms
用户 cms 的口令:
您现在以用户名"cms"连接到数据库"test1"。
test1=>
test1=>
test1=> select * from cms.cmst1 ;
 ID |  NAME
----+--------
  1 | 石家庄
  2 | 秦皇岛
  3 | 北京
  4 | 青岛
(4 行记录)

test1=>
test1=> select * from bmn.bmnt1 ;
ERROR:  permission denied for schema bmn
第1行select * from bmn.bmnt1 ;
                   ^
test1=> select * from englo.englot1 ;
ERROR:  permission denied for schema englo
第1行select * from englo.englot1 ;
test1=>
test1=>
test1=>
test1=>

5.2 使用bmn用户:
---bmn用户访问查询

test1=>
test1=> \c test1 bmn
用户 bmn 的口令:
您现在以用户名"bmn"连接到数据库"test1"。
test1=>
test1=>
test1=>
test1=> select * from bmn.bmnt1 ;
 ID | NAME
----+------
  1 | 成都
  2 | 重庆
  3 | 济南
  4 | 西安
(4 行记录)

test1=> select * from cms.cmst1 ;
ERROR:  permission denied for schema cms
第1行select * from cms.cmst1 ;
                   ^
test1=> select * from englo.englot1 ;
ERROR:  permission denied for schema englo
第1行select * from englo.englot1 ;
                   ^
test1=>
5.3 使用englo用户:
---englo用户访问查询

test1=>
test1=> \c test1 englo
用户 englo 的口令:
您现在以用户名"englo"连接到数据库"test1"。
test1=>
test1=>
test1=>
test1=> select * from englo.englot1 ;
 ID | NAME
----+------
  1 | 长沙
  2 | 武汉
  3 | 新疆
  4 | 苏州
(4 行记录)

test1=>
test1=> select * from cms.cmst1 ;
ERROR:  permission denied for schema cms
第1行select * from cms.cmst1 ;
                   ^
test1=> select * from bmn.bmnt1 ;
ERROR:  permission denied for schema bmn
第1行select * from bmn.bmnt1 ;
                   ^
test1=>

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐