数据库权限说明
通过ksql元命令\l+ [db_name]查询
| 权限 | 说明 | 标志 |
|---|---|---|
| ALL | CTc全部权限 | |
| CREATE | 允许在数据库中创建新的schema table index | C |
| TEMPORARY|TEMP | 允许在使用指定数据库时创建临时表|允许在使用指定数据库时间创建临时表 | T |
| CONNECT | 允许用户连接到指定的数据库 | c |
注:(注意数据库存取权限列为空时,数据库对用户的权限可能有区别)
(1)PUBLIC权限不收回时:
- 当数据库存取权限列为空(无显式权限)时,该对象所有可登录权限用户默认均有连接权限
- 除了超级用户,其他具有createdb权限的用户只能对owner为自己的数据库进行权限操作
- CONNECT权限被收回后,用户依然可以连接该库,且权限为Tc,用户权限小于PUBLIC的权限
- 创建的除超级用户的其他用户,初始对数据库权限均为Tc
(2)PUBLIC权限收回时:
- 数据库存取权限列不为空时,除超级用户外其他用户(包括属主用户)在数据库上的权限与存取权限显示一致
- 当数据库存取权限列为空(无显式权限)时,除超级用户外,所有用户均不可以登陆
实验测试:
环境说明
redhat 7.7 kingbase V9
/*******************************************************
测试准备
********************************************************/
\c test system
-- 创建普通用户
create user utyxl01 with password '123456';
create user utyxl02 with password '123456';
-- 创建超级用户
create user dbadmin with password '123456' superuser;
-- 创建数据库管理用户
create user dbopra with password '123456' createdb;
-- 由dbadmin创建数据库
\c - dbadmin
create database db01;
-- 由dbopra创建数据库
\c - dbopra
create database db02;
测试一、PUBLIC权限不收回
test=> \l+ db* -- db01,db02数据库存取权限为空
数据库列表
名称 | 拥有者 | 字元编码 | 校对规则 | Ctype | 存取权限 | 大小 | 表空间 | 描述
------+---------+----------+-------------+-------------+----------+-------+-------------+------
db01 | dbadmin | UTF8 | zh_CN.UTF-8 | zh_CN.UTF-8 | | 14 MB | sys_default |
db02 | dbopra | UTF8 | zh_CN.UTF-8 | zh_CN.UTF-8 | | 14 MB | sys_default |
(2 行记录)
test=> \c db01 utyxl01
You are now connected to database "db01" as userName "utyxl01". -- utyxl01可以访问db01
db01=> \c db02 utyxl01
You are now connected to database "db02" as userName "utyxl01". -- utyxl01可以访问db02
/*******************************************************************
不同用户操作数据库
********************************************************************/
test=> drop database db01;
错误: 必须是数据库 db01 的属主 -- db01属主为dbadmin, dbopra无法删除db01
test=> revoke CONNECT on DATABASE db02 from utyxl01;
警告: 不能撤销授权 -- db01属主为dbadmin, dbopra无法对db01数据库进行权限操作
REVOKE
test=> drop database db02; -- db02属主为dbopra,可以删除db01
DROP DATABASE
test=> create database db02;
CREATE DATABASE
test=> \c - dbadmin
You are now connected to database "test" as userName "dbadmin".
test=# drop database db01;
DROP DATABASE
test=# drop database db02; -- 超级用户可以对任何库操作
DROP DATABASE
/*******************************************************************
connect权限测试
********************************************************************/
-- 恢复db01,db02
test=> \c - dbadmin
You are now connected to database "test" as userName "dbadmin".
test=# drop database db01;
test=# \c - dbopra
You are now connected to database "test" as userName "dbopra".
test=> create database db02;
CREATE DATABASE
-- dbopra变更db02数据库对utyxl01用户权限
-- 1. 数据库存取权限列为空,测试数据库连接
test=> \l+ db02
数据库列表
名称 | 拥有者 | 字元编码 | 校对规则 | Ctype | 存取权限 | 大小 | 表空间 | 描述
------+--------+----------+-------------+-------------+----------+-------+-------------+------
db02 | dbopra | UTF8 | zh_CN.UTF-8 | zh_CN.UTF-8 | | 14 MB | sys_default |
(1 行记录)
test=> \c db02 utyxl01 -- db02存取权限为空,无显式权限,utyxl01可以连接db02
You are now connected to database "db02" as userName "utyxl01".
-- 显式赋权,测试连接
test=> grant CONNECT on DATABASE db02 to utyxl01; -- 授予utyxl01对db02的连接权限
GRANT
test=> \l+ db02
数据库列表
名称 | 拥有者 | 字元编码 | 校对规则 | Ctype | 存取权限 | 大小 | 表空间 | 描述
------+--------+----------+-------------+-------------+-------------------+-------+-------------+------
db02 | dbopra | UTF8 | zh_CN.UTF-8 | zh_CN.UTF-8 | =Tc/dbopra +| 14 MB | sys_default |
| | | | | dbopra=CTc/dbopra+| | |
| | | | | utyxl01=c/dbopra | | |
(1 行记录)
test=> \c db02 utyxl01 -- utyxl01=c/dbopra, utyxl01可以连接db02
You are now connected to database "db02" as userName "utyxl01".
-- 回收connect,测试连接
db02=> \c db02 dbopra
You are now connected to database "db02" as userName "dbopra".
db02=> revoke CONNECT on DATABASE db02 from utyxl01 ; -- 回收utyxl01对db02的连接权限
REVOKE
db02=> \l+ db02
数据库列表
名称 | 拥有者 | 字元编码 | 校对规则 | Ctype | 存取权限 | 大小 | 表空间 | 描述
------+--------+----------+-------------+-------------+-------------------+-------+-------------+------
db02 | dbopra | UTF8 | zh_CN.UTF-8 | zh_CN.UTF-8 | =Tc/dbopra +| 14 MB | sys_default |
| | | | | dbopra=CTc/dbopra | | |
(1 行记录)
db02=> \c - utyxl01 -- =Tc/dbopra,utyxl01可以连接db02
You are now connected to database "db02" as userName "utyxl01".
db02=> grant CREATE on DATABASE db02 to utyxl01; -- 授予utyxl01对db02的CREATE权限
GRANT
db02=> \l+ db02
数据库列表
名称 | 拥有者 | 字元编码 | 校对规则 | Ctype | 存取权限 | 大小 | 表空间 | 描述
------+--------+----------+-------------+-------------+-------------------+-------+-------------+------
db02 | dbopra | UTF8 | zh_CN.UTF-8 | zh_CN.UTF-8 | =Tc/dbopra +| 14 MB | sys_default |
| | | | | dbopra=CTc/dbopra+| | |
| | | | | utyxl01=C/dbopra | | |
(1 行记录)
db02=> \c - utyxl01 -- =Tc/dbopra,utyxl01=C/dbopra utyxl01可以连接db02
You are now connected to database "db02" as userName "utyxl01".
/**************************************************************************
综上:
PUBLIC权限不收回时:
1. 当数据库存取权限列为空(无显式权限)时,该对象所有可登录权限用户默认均有连接权限
2. 除了超级用户,其他具有createdb权限的用户只能对owner为自己的数据库进行权限操作
3. CONNECT权限被收回后,用户依然可以连接该库,且权限为Tc,用户权限小于PUBLIC的权限
4. 创建的除超级用户的其他用户,初始对数据库权限均为Tc
***************************************************************************/
测试二、PUBLIC权限收回
db02=> revoke ALL on DATABASE db02 from PUBLIC ; -- 回收public在db02上的所有权限
REVOKE
db02=> \l+ db02
数据库列表
名称 | 拥有者 | 字元编码 | 校对规则 | Ctype | 存取权限 | 大小 | 表空间 | 描述
------+--------+----------+-------------+-------------+-------------------+-------+-------------+------
db02 | dbopra | UTF8 | zh_CN.UTF-8 | zh_CN.UTF-8 | dbopra=CTc/dbopra+| 14 MB | sys_default |
| | | | | utyxl01=C/dbopra | | |
(1 行记录)
db02=# \c db02 utyxl02; -- utyxl02用户连接db02失败
致命错误: 访问数据库"db02"的权限不够
描述: 用户没有CONNECT权限.
Previous connection kept
db02=# \c db02 utyxl01; -- utyxl01用户连接db02失败
致命错误: 访问数据库"db02"的权限不够
描述: 用户没有CONNECT权限.
Previous connection kept
-- 回收拥有者连接权限
db02=> \l+ db02
数据库列表
名称 | 拥有者 | 字元编码 | 校对规则 | Ctype | 存取权限 | 大小 | 表空间 | 描述
------+--------+----------+-------------+-------------+------------------+-----------+-------------+------
db02 | dbopra | UTF8 | zh_CN.UTF-8 | zh_CN.UTF-8 | dbopra=CT/dbopra+| No Access | sys_default |
| | | | | utyxl01=C/dbopra | | |
(1 行记录)
db02=> \c db02 dbopra -- 数据库属主dbopra不能连接数据库
致命错误: 访问数据库"db02"的权限不够
描述: 用户没有CONNECT权限.
Previous connection kept
-- 回收数据库所有显式权限
db02=> revoke ALL on DATABASE db02 from dbopra;
REVOKE
db02=> revoke ALL on DATABASE db02 from utyxl01;
REVOKE
db02=> \l+ db02 -- db02数据库存取权限为空,无显式权限
数据库列表
名称 | 拥有者 | 字元编码 | 校对规则 | Ctype | 存取权限 | 大小 | 表空间 | 描述
------+--------+----------+-------------+-------------+----------+-----------+-------------+------
db02 | dbopra | UTF8 | zh_CN.UTF-8 | zh_CN.UTF-8 | | No Access | sys_default |
(1 行记录)
db02=> \c db02 dbopra
致命错误: 访问数据库"db02"的权限不够
描述: 用户没有CONNECT权限.
Previous connection kept
db02=> \c db02 utyxl02
致命错误: 访问数据库"db02"的权限不够
描述: 用户没有CONNECT权限.
Previous connection kept
db02=> \c - dbadmin -- 除超级用户,其他用户均不可以连接(包括sso,sao)
You are now connected to database "db02" as userName "dbadmin".
/*************************************************************************
综上:
PUBLIC权限收回时:
1. 数据库存取权限列不为空时,除超级用户外其他用户(包括属主用户)在数据库上的权限与存取权限显示一致
2. 当数据库存取权限列为空(无显式权限)时,除超级用户外,所有用户均不可以登陆
**************************************************************************/
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




