人大金仓KCA | 对象访问权限入门
- 一、知识预备
- 1. 对象的分类
- 2. 对象访问权限概述
- 3. 级联授权
- 4. 权限描述符
- 5. 使用EasyKStudio查看用户权限
- 二、案例实施
- 1. 用户授权综合案例
- 2. 对象的创建者默认就是对象的所属主
- 3. 该表对象的所属主
- 4. 对象属主的权限设置
- 5. 授权普通用户访问对象
- 6. public角色
OS版本:CentOS-7-x86_64-Everything-2009
KES版本:KingbaseES_V008R006C008B0014_Lin64
许可证版本:license_39893_0.dat(开发版)
一、知识预备
1. 对象的分类
数据库的表、索引、视图、缺省值、规则、触发器等都称为数据库对象,对象分为两类:
- 模式对象:可以理解为一个存储目录,包含视图、索引、数据类型、函数和操作符等
- 非模式对象:其它的数据库对象,如数据库、表空间、用户
2. 对象访问权限概述
- 对象都会有一个所有者,所有者一般是对象的创建者,所有者也可以被改变,类似于Linux中的文件权限。
- 初始状态下,只有所有者和超级用户能够对该对象执行任何操作
- 其它用户和角色要使用该对象,必须显式的为其授予访问该对象的相关权限
- 不同的对象类型所支持权限类似是不一样的
3. 级联授权
数据库中的级联授权(Cascading Authorization)是一种权限传递机制,它允许一个用户(或角色)将其所拥有的权限授予另一个用户(或角色),并且这种授权关系可以逐级传递下去。
4. 权限描述符
在KES中制定了一种类似于Linux权限掩码的权限描述符,在查询相关对象的权限时,仅显式权限描述符,减少打印空间。
常见权限描述符
权限描述符 | 完整单词 | 针对对象 | 说明 |
---|---|---|---|
a | INSERT | 针对表或视图 | 插入 |
w | UPDATE | 针对表或视图 | 更新 |
D | TRUNCATE | 针对表 | 清空记录 |
t | TRIGGER | 针对表 | 创建触发器 |
U | USAGE | 针对模式 | 使用权 |
c | CONNECT | 针对数据库 | 创建连接 |
r | SELECT | 针对表或视图 | 查询 |
d | DELETE | 针对表或视图 | 参照引用 |
x | REFERENCES | 针对表 | 删除 |
X | EXECUTE | 针对存储过程 | 执行 |
C | CREATE | 针对模式或数据库 | 创建对象 |
T | TEMPORARY | 针对数据库 | 创建临时表 |
查看student表中各用户拥有的权限
\dp student
具体权限说明
system=arwdDxt/system+
- 语法格式:[ 被授权用户 ]=权限明细[ * ]/授权用户
- system:代表被授权的用户
- arwdDxt:具体权限明细
- /system:被授权的用户
- +:类似于间隔符
user01=ar*/system
- user01:被授权的用户
- ar:代表insert和select权限
- r*:代表user01可以向其它用户授予select权限
- /system:代表是system用户向user01用户授予的权限
5. 使用EasyKStudio查看用户权限
[Step1]:
通过编辑用户,可以查看用户对数据库的权限
权限 | 说明 |
---|---|
ALL | 授予所有权限 |
CREATE | 允许创建表、模式、索引 |
TEMPORARY | 允许创建临时表 |
TEMP | 允许创建临时表 |
CONNECT | 允许连接数据库 |
[Step2]:
通过编辑用户,可以查看用户对模式的权限
权限 | 说明 |
---|---|
ALL | 授予全部权限 |
USAGE | 允许访问指定模式中的对象,如果是序列则允许使用currval和nextval函数 |
CREATE | 允许在模式中创建对象 |
[Step3]:
通过编辑用户,可以查看用户对指定表的权限
权限 | 说明 |
---|---|
ALL | 授予全部权限 |
SELECT | 授予读取权限 |
INSERT | 授予插入权限 |
UPDATE | 授予更新权限 |
DELETE | 授予删除权限 |
TRUNCATE | 允许对表进行截断清空 |
REFERENCES | 允许创建外键约束 |
TRIGGER | 允许在表上创建触发器 |
二、案例实施
1. 用户授权综合案例
- 使用 system 用户登录 test 数据库
- 创建 user01 用户,在public模式下创建 tb01 表
- 向 tb01 表中插入数据,授予 user01 用户可查询 tb01 表
- 授予 user01 用户拥有对 tb01 表的查询转授权限
- 授予 user01 用户可以在 tb01 表中插入数据
[Step1]:
使用system用户登录test数据库
ksql -Usystem -d test
[Step2]:
创建user01用户,新建tb01表
create user user01 password 'kingbase';
create table tb01 (id int,name varchar(100));
[Step3]:
往tb01表中插入数据
insert into tb01 values(1001,'Mike'),(1002,'Jack');
[Step4]:
授予user01用户查询和转授权限,授予user01用户插入权限
grant select on public.tb01 to user01 with grant option;
grant insert on public.tb01 to user01;
[Step5]:
验证:查看tb01表中所有用户权限
\dp tb01
2. 对象的创建者默认就是对象的所属主
[Step1]:
使用 system 用户创建 tb02 表
create table tb02 (id int,name varchar(10));
\dt tb02
3. 该表对象的所属主
[Step1]:
修改 tb02 的所属主为 user01
alter table tb02 owner to user01;
\dt tb02
4. 对象属主的权限设置
[Step1]:
查看 user01 在tb02上的隐式权限
select * from information_schema.table_privileges
where table_catalog='test'
and table_schema='public'
and table_name='tb02';
[Step2]:
属主的特殊权限不可被授予或移除
grant drop to tb02 to user01;
grant grant to tb02 to user01;
grant revoke to tb02 to user01;
revoke drop on table tb02 from user01;
revoke grant on table tb02 from user01;
revoke revoke on table tb02 from user01;
[Step3]:
管理员和属主可以撤销所有者在表中普通权限
revoke select on table tb02 from user01;
5. 授权普通用户访问对象
[Step1]:
创建新用户 user03
create user user03 password 'kingbase';
[Step2]:
授予用户访问数据库的权限
grant connect on database test to user03;
[Step2]:
授予用户访问模式的权限
grant usage on schema public to user03;
[Step3]:
授予用户访问表的权限
grant select on table db01 to user03;
[Step4]:
验证:使用 tb01 用户登录
\c - user03
select * from public.tb01;
6. public角色
public角色默认拥有登录所有数据库、在public模式下创建对象的权限,默认情况下所有用户属于public角色。
[Step1]:
查看public角色在test数据库、public模式中的权限
\l test
\dn+ public
[Step2]:
创建一个用户 pub_user,可以发现 pub_user 默认可以登录 test 数据库,可以在public模式中创建对象
create user pub_user password 'kingbase';
\c - pub_user
create table pub_tb (id int,name varchar(10));
[Step3]:
回收 public 角色的所有默认权限
revoke all on database test from public;
[Step4]:
验证:pub_user已经无法在test数据库中登录
\c - db_user