环境
系统平台:中标麒麟(海光)7
版本:4.3.4.7
文档用途
本文主要介绍在安全版HGDB中,如何通过对用户、模式、表等数据库对象授权管理,实现表的跨模式访问,本次主要介绍以下规则:
1、数据库的默认搜索模式为$user,public,在没有创建跟用户同名的模式的情况下,默认表都创建在public下;
2、通过角色继承的方式创建的用户a跟b,a用户创建的表,将表a的属主改为b用户后,ab用户同时拥有drop该表的权限;
3、安全版数据库下用户可以将自建的模式赋予给其他用户,根据使用情况赋予create、usage等权限,不推荐使用all privilege参数;
4、如果一个b用户想访问a用户下自建模式下的表,需要a用户将模式、表的权限都赋给b用户才可以实现,单独授予任何一个的情况下,在添加了search_path参数后,可以看到表,但是无法查询表的内容。
详细信息
1、创建数据库用户a ,数据库a,属主为用户a,通过角色继承的方式创建用户b
highgo=# create user a with password 'highgo123';
CREATE ROLE
highgo=# create database a with owner=a;
CREATE DATABASE
highgo=# create user b inherit user a password'highgo123';
2、通过用户a 登录数据库a,创建测试表a,并插入数据
[root@node1 ~]# psql -U a -d a
psql (4.3.4.7)
输入 "help" 来获取帮助信息.
a=> create table a (id int);
CREATE TABLE
a=> insert into a values(1);
INSERT 0 1
3、通过用户b登录数据库a ,可以看到public下的表a,但是没有权限访问
[root@node1 ~]# psql -U b -d a
用户 b 的口令:
注意:
Login User: b
Login time: 2020-01-08 11:22:49.58514+08
Login Address: [local]
Last Login Status: SUCCESS
Login Failures: 0
Valied Until: 2020-01-15 11:15:50+08
psql (4.3.4.7)
输入 "help" 来获取帮助信息.
a=>
a=>
a=> \dt+
关联列表
架构模式 | 名称 | 类型 | 拥有者 | 大小 | 描述
----------+------+--------+--------+------------+------
public | a | 数据表 | a | 8192 bytes |
(1 行记录)
a=> select * from a;
错误: 对关系 a 权限不够
4、登录数据库,把表a的增删改查权限赋予用户b,再次查询成功
[root@node1 ~]# psql -U a -d a
用户 a 的口令:
注意:
Login User: a
Login time: 2020-01-08 11:23:34.17439+08
Login Address: [local]
Last Login Status: SUCCESS
Login Failures: 0
Valied Until: 2020-01-15 11:14:29+08
psql (4.3.4.7)
输入 “help” 来获取帮助信息.
a=> grant select,insert,update,delete,truncate on table a to b;
GRANT
a=> \q
[root@node1 ~]# psql -U b -d a;
用户 b 的口令:
注意:
Login User: b
Login time: 2020-01-08 11:27:08.566743+08
Login Address: [local]
Last Login Status: SUCCESS
Login Failures: 0
Valied Until: 2020-01-15 11:15:50+08
psql (4.3.4.7)
输入 “help” 来获取帮助信息.
a=> select * from a;
id
1
(1 行记录)
5、将表a的属主改为用户b,此时用户a,用户b均可以对表a进行drop操作
[root@node1 ~]# psql -U a -d a
用户 a 的口令:
注意:
Login User: a
Login time: 2020-01-08 11:28:44.451+08
Login Address: [local]
Last Login Status: SUCCESS
Login Failures: 0
Valied Until: 2020-01-15 11:14:29+08
a=> alter table a owner to b;
ALTER TABLE
a=> \dt+
关联列表
架构模式 | 名称 | 类型 | 拥有者 | 大小 | 描述
----------+------+--------+--------+------------+------
public | a | 数据表 | b | 8192 bytes |
(1 行记录)
a=>
a=> insert into a values(2);
INSERT 0 1
a=> select * from a;
id
----
1
2
(2 行记录)
a=> begin
a-> ;
BEGIN
a=> drop table a;
DROP TABLE
a=> rollback;
ROLLBACK
a=>
a=>
a=> select * from a
a-> ;
id
----
1
2
(2 行记录)
a=> end;
警告: 没有事物在运行中
COMMIT
6、用户a创建同名模式a,创建表f,同时把模式a下所有表的查询权限赋给b
[root@node1 ~]# psql -U a -d a
用户 a 的口令:
注意:
Login User: a
Login time: 2020-01-08 11:28:44.451+08
Login Address: [local]
Last Login Status: SUCCESS
Login Failures: 0
Valied Until: 2020-01-15 11:14:29+08
a=> create schema a;
CREATE SCHEMA
a=> create table f(id int);
CREATE TABLE
a=>
a=>
a=>
a=> \dt
关联列表
架构模式 | 名称 | 类型 | 拥有者
----------+------+--------+--------
a | f | 数据表 | a
public | a | 数据表 | b
a=> grant select on all tables in schema a to b;
GRANT
a=>
a=>
a=>
a=> \q
7、此时用户b仍然无法查询到模式a下的表f
[root@node1 ~]# psql -U b -d a
用户 b 的口令:
注意:
Login User: b
Login time: 2020-01-08 17:24:22.295389+08
Login Address: [local]
Last Login Status: SUCCESS
Login Failures: 0
Valied Until: 2020-01-15 11:15:50+08
psql (4.3.4.7)
输入 “help” 来获取帮助信息.
a=> select * from a.f;
错误: 对模式 a 权限不够
第1行select * from a.f;
8、将模式a的使用权限赋给用户b
[root@node1 ~]# psql -U a -d a
用户 a 的口令:
注意:
Login User: a
Login time: 2020-01-08 17:29:23.407098+08
Login Address: [local]
Last Login Status: SUCCESS
Login Failures: 0
Valied Until: 2020-01-15 11:14:29+08
psql (4.3.4.7)
输入 “help” 来获取帮助信息.
a=> grant usage on schema a to b;
GRANT
9、再次使用用户b登录就可以查询模式a下的表
[root@node1 ~]# psql -U b -d a
用户 b 的口令:
注意:
Login User: b
Login time: 2020-01-08 17:31:12.875106+08
Login Address: [local]
Last Login Status: SUCCESS
Login Failures: 0
Valied Until: 2020-01-15 11:15:50+08
psql (4.3.4.7)
输入 “help” 来获取帮助信息.
a=> select * from a.f;
id
----
(0 行记录
10、在会话级更改模式搜索路径参数,可临时解决其他模式下表的可见问题
a=> \dt
关联列表
架构模式 | 名称 | 类型 | 拥有者
----------+------+--------+--------
public | a | 数据表 | b
public | b | 数据表 | a
public | c | 数据表 | a
public | d | 数据表 | a
(4 行记录)
a=> set search_path to a,'$user',public;
SET
a=> \dt
关联列表
架构模式 | 名称 | 类型 | 拥有者
----------+------+--------+--------
a | f | 数据表 | a
public | a | 数据表 | b
public | b | 数据表 | a
public | c | 数据表 | a
public | d | 数据表 | a
(5 行记录)
1430

被折叠的 条评论
为什么被折叠?



