[TOC]
## 一、本章背景知识
```
1. 什么是数据库对象?
数据库中的表、视图、索引、图表、缺省值、规则、触发器、语法等,都称为数据库对象,对象分为如下两种:
(1) 模式(schema)对象
可以理解为一个存储目录,包含视图、索引、数据类型、函数和操作符等。
(2) 非模式对象
其他的数据库对象,如数据库、表空间、用户、权限等。
2. 什么是对象权限?
用户或对象访问模式对象和非模式对象的能力称之为对象权限。
```
## 二、对象访问权限概述
```
1. 对象都会有所有者,所有者一般是对象的创建者,所有者也可以被改变。
2. 初始状态下,只有所有者(或超级用户)能够对该对象执行任何操作。
3. 其他用户或角色要使用对象,必须显式为其授予访问该对象的相关权限。
```
## 三、查看对象访问权限的主要方式
```
1. 使用“数据库对象管理工具”查看访问权限
2. 使用“KSQL元命令”查看权限信息
3. 使用“数据字典”查看访问权限
4. 使用“权限查看函数”查看访问权限
```
### 1. 使用“KSQL元命令”查看权限信息
1. 查看数据库的权限
```
可使用元命令:\l+
```
```
test=# \l+
数据库列表
名称 | 拥有者 | 字元编码 | 校对规则 | Ctype | 存取权限 | 大小 | 表空间 | 描述
-----------+--------+----------+-------------+-------------+-------------------+-------+-------------+--------------------------------------------
security | system | UTF8 | zh_CN.UTF-8 | zh_CN.UTF-8 | | 12 MB | sys_default |
template0 | system | UTF8 | zh_CN.UTF-8 | zh_CN.UTF-8 | =c/system +| 12 MB | sys_default | unmodifiable empty database
| | | | | system=CTc/system | | |
template1 | system | UTF8 | zh_CN.UTF-8 | zh_CN.UTF-8 | =c/system +| 12 MB | sys_default | default template for new databases
| | | | | system=CTc/system | | |
test | system | UTF8 | zh_CN.UTF-8 | zh_CN.UTF-8 | | 13 MB | sys_default | default administrative connection database
(4 行记录)
说明:
“存取权限”列解释说明:
=c/system +
system=CTc/system
格式:权限拥有者=权限/权限授予者
+ 表示连接符
若 = 之前为空,则表示权限拥有者是所有人。
若“存储权限”列为空,则表示它继承模板库的权限。
权限:
C --create,(创建对象,针对模式或数据库)
c --connect,(创建连接,针对数据库)
T --temporary,(创建临时表,针对数据库)
```
2. 查看模式的权限
```
可使用元命令:\dn+
```
```
test=# \dn+
架构模式列表
名称 | 拥有者 | 存取权限 | 描述
------------------+--------+------------------+------------------------
dbms_job | system | |
dbms_scheduler | system | |
dbms_sql | system | |
exam | system | |
kdb_schedule | system | |
public | system | system=UC/system+| standard public schema
| | =UC/system |
sysaudit | system | system=UC/system+|
| | sso=UC/system +|
| | sao=UC/system +|
| | =UC/system |
sysmac | system | system=UC/system+|
| | sso=UC/system +|
| | =U/system |
xlog_record_read | system | |
(9 行记录)
说明:
“存取权限”列解释说明:
system=UC/system+
=UC/system
权限:
U --usage,(使用权,针对模式)
C --create,(创建对象,针对模式或数据库)
```
3. 查看具体某一对象的权限
```
可使用元命令:\dp
```
```
test=# \dp
存取权限
架构模式 | 名称 | 类型 | 存取权限 | 列特权 | 策略
----------+---------------------+--------+-----------------------+--------+------
public | sys_stat_statements | 视图 | system=arwdDxt/system+| |
| | | =r/system | |
public | t01 | 数据表 | system=arwdDxt/system+| |
| | | r01=arw/system | |
(2 行记录)
说明:
“存取权限”列解释说明:
system=arwdDxt/system+
=r/system
权限:
a --insert,(插入,针对表或视图)
r --select,(查询,针对表或制图)
w --update,(更新,针对表或视图)
d --delete,(删除,针对表或视图)
D --truncate,(清空记录,针对表)
x --references,(参照引用,针对表)
t --trigger,(创建触发器,针对表)
```
### 2. 使用“权限查看函数”查看访问权限
```
1. 函数 has_table_privilege
说明:
<1>.功能:
检查用户/角色对表的权限,该函数会返回一个布尔值(t/f)表示用户/角色是否具有指定类型的权限;
说明:字母 t 代表有权限,字母 f 代表无权限。
<2>.能检查的访问权限类型:
select、insert、update、delete、truncate、references、trigger、with grant option。
<3>.语法:
has_table_privilege('用户/角色','表名','权限')
<4>.范例:
1)判断exam.course表是否具有select权限。
test=# select has_table_privilege(exam.course','select');
---------------------
t
(1 行记录)
2)判断u01用户对exam.course表是否具有select权限。
test=# select has_table_privilege('u01','exam.course','select');
has_table_privilege
---------------------
f
(1 行记录)
2. 函数 has_sequence_privilege
说明:
<1>.检查一个用户是否可以用某种特定的方式访问一个序列;
<2>.能检查的访问权限类型有:usage、select、update、with grant option。
3. 函数has_any_column_privilege
说明:
<1>.检查一个用户是否能以特定方式访问一个表的任意列;
<2>.能检查的访问权限类型有:select、insert、update或peferences。
4. 函数has_column_privilege
<1>.检查一个用户是否能以特定方式访问一个列;
<2>.能检查的访问权限类型有:select、insert、update或peferences。
5. 函数has_database_privilege
<1>.检查一个用户是否能以特定的方式访问一个数据库;
<2>.能检查的访问呢权限类型有:create、connect、temporary或temp。
6. 函数has_function_privilege
<1>.检查一个用户是否能以特定的方式访问一个函数;
<2>.能检查的访问权限类型有:execute。
7. 函数has_schema_privilege
<1>.检查一个用户是否能以某种特定的方式访问一个模式;
<2>.能检查的访问权限类型有:create或usage
8. 函数has_tablespace_privilege
<1>.检查一个用户是否能以某种特定的方式访问一个表空间;
<2>.能检查的访问权限类型有:create
```
## 四、对象所有权限管理
### 1. 对象创建者默认为对象的所有者
```
1. 使用system用户登录test数据库,在public模式中创建t02表。
test=# \conninfo
以用户 "system" 的身份,通过套接字"/tmp"在端口"54321"连接到数据库 "test"
test=# create table public.t02(id int);
CREATE TABLE
test=# \dt+ public.t02;
关联列表
架构模式 | 名称 | 类型 | 拥有者 | 大小 | 描述
----------+------+--------+--------+---------+------
public | t02 | 数据表 | system | 0 bytes |
(1 行记录)
说明:从上可以看出public.t02的拥有者是system用户。
```
### 2. 改变对象的所有者
```
1. 创建user02用户,将上述创建的t02表的所有者修改为user02。
test=# \conninfo
以用户 "system" 的身份,通过套接字"/tmp"在端口"54321"连接到数据库 "test"
test=# create user user02 with password 'kingbase';
CREATE ROLE
test=# \dt+ public.t02;
关联列表
架构模式 | 名称 | 类型 | 拥有者 | 大小 | 描述
----------+------+--------+--------+---------+------
public | t02 | 数据表 | system | 0 bytes |
(1 行记录)
test=# alter table public.t02 owner to user02;
ALTER TABLE
test=# \dt+ public.t02;
关联列表
架构模式 | 名称 | 类型 | 拥有者 | 大小 | 描述
----------+------+--------+--------+---------+------
public | t02 | 数据表 | user02 | 0 bytes |
(1 行记录)
```
### 3. 拥有者在对象上的特殊权限不能被授予或撤销
```
1. drop、grant、revoke等特殊权限总是隐式地属于拥有者,不能直接查看到这些权限信息,如下所示:
test=# \dt+ public.t02;
关联列表
架构模式 | 名称 | 类型 | 拥有者 | 大小 | 描述
----------+------+--------+--------+---------+------
public | t02 | 数据表 | user02 | 0 bytes |
(1 行记录)
test=# \dp+ public.t02;
存取权限
架构模式 | 名称 | 类型 | 存取权限 | 列特权 | 策略
----------+------+--------+----------+--------+------
public | t02 | 数据表 | | |
(1 行记录)
2. 拥有者的drop、grant、revoke等特殊权不能被授予或撤销。
```
### 4. 拥有者可以撤销其在表中的普通权限
```
1. 撤销user02在public.t02上的所有普通权限,仅授予user02对t02表的查询权限。
test=# \dt+ public.t02
关联列表
架构模式 | 名称 | 类型 | 拥有者 | 大小 | 描述
----------+------+--------+--------+---------+------
public | t02 | 数据表 | user02 | 0 bytes |
(1 行记录)
test=# \dp+ public.t02
存取权限
架构模式 | 名称 | 类型 | 存取权限 | 列特权 | 策略
----------+------+--------+----------+--------+------
public | t02 | 数据表 | | |
(1 行记录)
test=#
test=# revoke all on public.t02 from user02;
REVOKE
test=# grant select on public.t02 to user02;
GRANT
test=# \dp+ public.t02
存取权限
架构模式 | 名称 | 类型 | 存取权限 | 列特权 | 策略
----------+------+--------+-----------------+--------+------
public | t02 | 数据表 | user02=r/user02 | |
(1 行记录)
```
## 五、授予普通用户访问对象
```
1. 实验准备
使用system用户登录test数据库,创建t03表,创建user03用户。
```
### 1. 授予用户访问表的权限
```
1. 授权用户user03可以连接test数据库。
1.1 使用system用户查看exam.score表,发现拥有者是system
test=# \dt exam.score
关联列表
架构模式 | 名称 | 类型 | 拥有者
----------+-------+--------+--------
exam | score | 数据表 | system
(1 行记录)
1.2 使用user02用户查看exam.score表,发现没有权限
test=> table exam.score;
错误: 对模式 exam 权限不够
第1行table exam.score;
1.3 使用system用户给user02授予可查看exam.score表的权限。
test=# grant select on table exam.score to user02;
GRANT
test=# \dp exam.score
存取权限
架构模式 | 名称 | 类型 | 存取权限 | 列特权 | 策略
----------+-------+--------+-----------------------+--------+------
exam | score | 数据表 | system=arwdDxt/system+| |
| | | user02=r/system | |
(1 行记录)
1.4 再次使用user02用户查看exam.score表,仍然无权限。
test=> table exam.score;
错误: 对模式 exam 权限不够
第1行table exam.score;
说明:因为score表是模式对象,此时user02只是对score表有select权限,但是对exam模式没有使用权限,故无法查看。
1.5 使用system用户将exam模式的usage权限授予user02用户。
test=# grant usage on schema exam to user02;
GRANT
1.6 此时可以用user02用户查看exam.score表
test=> table exam.score;
sno | cno | ino | exam_date | score | certificate
------+-----+-----+---------------------+-------+-------------
1001 | 10 | 101 | 2021-03-05 00:00:00 | 85 | t
1001 | 20 | 101 | 2021-06-10 00:00:00 | 88 | t
1001 | 30 | 101 | 2021-08-24 00:00:00 | 83 | t
```
## 六、收回public角色(指所有人)在public模式中的默认权限
```
说明:
public角色(所有人)默认有登录所有数据库、能在public模式中创建对象的权限,
在生产环境中,建议收回public角色在public模式的这些权限。
```
```
1. 查看public模式的信息
test=# \dn+ public
架构模式列表
名称 | 拥有者 | 存取权限 | 描述
--------+--------+------------------+------------------------
public | system | system=UC/system+| standard public schema
| | =UC/system |
(1 行记录)
由“=UC/system”可知,public角色(即所有人)对public模式都有UC权限(使用和创建对象的权限)。
2. 回收public角色在public模式中的所有权限
test=# revoke all on schema public from public;
REVOKE
test=# \dn+ public
架构模式列表
名称 | 拥有者 | 存取权限 | 描述
--------+--------+------------------+------------------------
public | system | system=UC/system | standard public schema
(1 行记录)
说明:由上可看出“=UC/system”已经被回收,之后其他用户就不可以直接在public模式创建对象了。
```
## 七、详解"user01=ar*/SYSTEM"
```
1. "user01=ar*/SYSTEM" 对应于 “被授权用户=权限明细[*]/授权用户”
被授权用户 是 user01
ar 代表 insert 和 select 权限
r* 代表user01用户拥有r(select)权限的转授权。
SYSTEM 代表user01用户的ar*权限是system用户授予的。
* 代表被授权用户拥有该权限的转授权(用于级联授权)。
```
最后修改时间:2025-01-22 11:39:28
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
喜报 | 电科金仓中标新疆移动自主可控替换采购项目
金仓数据库
224次阅读
2025-03-20 09:50:33
哪吒重生启示录:国产数据库 我命由我不由天(二)
JiekeXu
164次阅读
2025-03-25 23:12:26
哪吒重生启示录:国产数据库 我命由我不由天(一)
JiekeXu
132次阅读
2025-03-24 23:14:54
喜报|金仓数据库助力中国医学科学院阜外医院全院超声系统上线
金仓数据库
100次阅读
2025-03-27 09:55:45
哪吒重生启示录:国产数据库 我命由我不由天(四)
JiekeXu
97次阅读
2025-03-27 22:50:21
Kingbase的RWC双主故障处理及集群缩容实操
virvle
94次阅读
2025-03-22 15:08:35
金仓充电站 | KES+Chat2DB,AI助力管理效率大提速!
金仓数据库
86次阅读
2025-03-19 11:21:07
哪吒重生启示录:国产数据库 我命由我不由天(三)
JiekeXu
74次阅读
2025-03-26 23:15:06
夺冠!电科金仓斩获申威赛马-数据库性能大赛第一名
金仓数据库
72次阅读
2025-03-31 10:00:44
Kingbase逻辑备份与恢复标准化实施文档
Digital Observer
55次阅读
2025-04-11 10:11:46