注:【该篇不考虑三权分立中sso和sao用户相关模式及模式对象】
关于kingbase超级用户
超级用户(supperuser)权限说明:
拥有所有数据库最高权限,可以越过数据库内的所有访问限制
数据库模式及模式对象:
-
- 模式为数据库对象,是数据对象的逻辑集合,一个数据库中包含1个或多个模式,不同库中模式互不影响,同库中模式不能同名,不同库中可以存在同名模式
-
- superuser权限用户连接任意数据库,可以越过数据库内的所有访问限制
-
- 同库不同模式下可存在同名模式对象
-
- public模式默认对所有用户给予UC权限,可创建、操作模式对象,生产环境中一般收回该权限
-
- public收回UC权限对superuser权限用户无效
-
- 普通用户(或具有loggin权限的角色)对于可连接的任意数据库,\dn可以看到所有非系统模式,但以模式存取权限和模式对象存取权限对访问用户做访问控制
-
- 数据库对用户的权限有CTc,模式对用户的权限有UC,模式对象对用户的权限有arwdDxt,根据需求赋予相应权限
-
- 用户访问操作模式对象的条件(以下为顺序必要条件):
(1)可以连接对应库
(2)对模式有相应权限
(3)对模式对象有相应权限
实验测试:
环境说明
redhat 7.7 kingbase V9
对象说明:

实验测试:
测试准备:
回收test库all users在public模式上的UC权限,创建superuser权限用户dbadmin
-- 以system用户连接test数据库
test=# \c
You are now connected to database "test" as userName "system".
-- 检查public架构模式信息及权限
test=# \dn+ public
架构模式列表
名称 | 拥有者 | 存取权限 | 描述
------------------+--------+------------------+------------------------
public | system | system=UC/system+| standard public schema -- system=UC/system system用户对public模式有UC权限
| | =UC/system | -- =UC/system 所有用户对public模式有UC权限
test=# revoke CREATE,USAGE on SCHEMA public from PUBLIC ; -- 回收all users(除超级用户)在public模式上的UC权限
REVOKE
test=# \dn+ public
架构模式列表
名称 | 拥有者 | 存取权限 | 描述
--------+--------+------------------+------------------------
public | system | system=UC/system | standard public schema -- 已收回非超级用户对public模式对的UC权限
(1 行记录)
-- 创建超级用户
test=# create user dbadmin with password '123456' superuser;
CREATE ROLE
-- 检查dbadmin用户信息及权限
test=# \du+ dbadmin
角色列表
角色名称 | 属性 | 成员属于 | 描述
----------+----------+----------+------
dbadmin | 超级用户 | {} |
/***revoke语句中的public解释说明:
revoke CREATE,USAGE on SCHEMA public from PUBLIC ;
两个public,分别为一个大写和一个小写。
public:模式,可以被替换为数据库中其他任意有效的模式名。
PUBLIC:特殊的关键字,代表了all users(除superuser权限用户)。可以被替换为一个特定的角色名或者以逗号分隔的角色名列表
***/
/***模式权限说明:
模式权限信息的格式包含三部分,从左到右为:接受权限者、权限、权限授予者
对于模式来说,只有两种可能被授予的权限:USAGE和CREATE,对应存取权限中的U和C。
USAGE:允许角色查询模式对象,例如包含在模式中的表和视图。
CREATE:允许角色在模式中创建数据库对象。
***/
测试实验
1. superuser权限用户对public模式对象操作
-- 对象准备
test=# \c
You are now connected to database "test" as userName "system".
test=# create table tbsys(id int); -- system用户默认模式(public)下创建表tbsys
CREATE TABLE
test=# \c - dbadmin -- 连接dbadmin用户
You are now connected to database "test" as userName "dbadmin".
test=# create table tbsup(id int); -- dbadmin用户默认模式(public)下创建表tbsup
CREATE TABLE
-- 查看public模式存取权限
test=# \dn+ public
架构模式列表
名称 | 拥有者 | 存取权限 | 描述
--------+--------+------------------+------------------------
public | system | system=UC/system | standard public schema
(1 行记录)
test=# \c - dbadmin -- 连接dbadmin用户
You are now connected to database "test" as userName "dbadmin".
test=# show search_path ; -- 查看用户默认查找路径
search_path
-----------------
"$user", public
(1 行记录)
test=# \dt+ tb* -- 查看表对象拥有者
关联列表
架构模式 | 名称 | 类型 | 拥有者 | 大小 | 描述
----------+-------+--------+---------+---------+------
public | tbsup | 数据表 | dbadmin | 0 bytes | -- tbsup为dbadmin用户在public模式下创建
public | tbsys | 数据表 | system | 0 bytes | -- tbsys为system用户在public模式下创建
(2 行记录)
-- 查看模式对象权限
test=# \dp+ public.tbs*
存取权限
架构模式 | 名称 | 类型 | 存取权限 | 列特权 | 策略
----------+-------+--------+----------+--------+------
public | tbsup | 数据表 | | | -- tbsup表对非owner用户无存取权限
public | tbsys | 数据表 | | | -- tbsys表对非owner用户无存取权限
(2 行记录)
-- 对象操作
-- 用dbadmin用户对public模式下的表操作
test=# \c - dbadmin -- 连接dbadmin用户
You are now connected to database "test" as userName "dbadmin".
test=# insert into tbsys values(1);
INSERT 0 1
test=# insert into tbsup values(2);
INSERT 0 1
-- 查看public模式对象
test=# select id from tbsys;
id
----
1
(1 行记录)
test=# select id from tbsup;
id
----
2
(1 行记录)
/***
条件:
1. public模式存取权限为system=UC/system,对dbadmin用户无UC权限
2. tbsys表为system用户在public模式下创建的表对象,且对其他用户无存取权限
结果:
1. superuser权限用户dbadmin默认模式依然为public,且可在public模式下做查询,创建对象等操作
2. superuser权限用户dbadmin对owner非自己的用户在public模式下的对象具有操作权限
***/
2. superuser权限用户对同库但非自属模式对象操作
-- 对象准备
test=# \c
You are now connected to database "test" as userName "system".
test=# create schema tsysshm; -- system用户在test数据库上创建模式tsysshm
CREATE SCHEMA
test=# create table tsysshm.tbtsysshm(flg nvarchar(20)); -- system用户在模式tsysshm下创建tbtsysshm表
CREATE TABLE
-- 对象属性权限信息查询
test=# \du+ dbadmin -- 查看用户dbadmin属性权限信息
角色列表
角色名称 | 属性 | 成员属于 | 描述
----------+--------------------------------------------+----------+------
dbadmin | 超级用户 | {} |
test=# \du+ system -- 查看用户system属性权限信息
角色列表
角色名称 | 属性 | 成员属于 | 描述
----------+--------------------------------------------+----------+------
system | 超级用户, 建立角色, 建立 DB, 复制, 绕过RLS | {} |
test=# \dn+ tsysshm -- 查看模式system属性权限信息
架构模式列表
名称 | 拥有者 | 存取权限 | 描述
---------+--------+----------+------
tsysshm | system | | -- system用户所有,且对其他用户无显式权限
(1 行记录)
test=# \dp+ tsysshm.tbtsysshm -- 查看表tsysshm.tbtsysshm属性权限信息
存取权限
架构模式 | 名称 | 类型 | 存取权限 | 列特权 | 策略
----------+-----------+--------+----------+--------+------
tsysshm | tbtsysshm | 数据表 | | | -- 对其他用户无显式权限
(1 行记录)
test=# \dt+ tsysshm.tbtsysshm -- 查看表tsysshm.tbtsysshm所属用户
关联列表
架构模式 | 名称 | 类型 | 拥有者 | 大小 | 描述
----------+-----------+--------+--------+---------+------
tsysshm | tbtsysshm | 数据表 | system | 0 bytes | -- owner为system用户
(1 行记录)
-- 对象操作
test=> \c - dbadmin
You are now connected to database "test" as userName "dbadmin".
test=# create table tsysshm.tbtssup(flg nvarchar(20)); -- 可以在非自己所属的模式下创建对象
CREATE TABLE
-- 查询tsysshm模式下的对象用户及权限
test=# \dp+ tsysshm.*
存取权限
架构模式 | 名称 | 类型 | 存取权限 | 列特权 | 策略
----------+-----------+--------+----------+--------+------
tsysshm | tbtssup | 数据表 | | |
tsysshm | tbtsysshm | 数据表 | | |
(2 行记录)
test=# \dt+ tsysshm.*
关联列表
架构模式 | 名称 | 类型 | 拥有者 | 大小 | 描述
----------+-----------+--------+---------+------------+------
tsysshm | tbtssup | 数据表 | dbadmin | 8192 bytes |
tsysshm | tbtsysshm | 数据表 | system | 8192 bytes |
(2 行记录)
-- 数据操作
-- 用dbadmin用户对public模式下的表操作
test=# \c - dbadmin
You are now connected to database "test" as userName "dbadmin".
test=# insert into tsysshm.tbtssup values('该表由dbadmin创建');
INSERT 0 1
test=# insert into tsysshm.tbtsysshm values('该条数据由dbadmin插入');
INSERT 0 1
test=# select * from tsysshm.tbtsysshm ;
flg
-----------------------
该条数据由dbadmin插入
(1 行记录)
test=# select * from tsysshm.tbtssup;
flg
-------------------
该表由dbadmin创建
(1 行记录)
test=# truncate tsysshm.tbtsysshm ;
TRUNCATE TABLE
/***
条件:
1. tsysshm模式存取权限无显式权限,属于system用户
2. tbtsysshm所属用户表为system用户在tsysshm模式下创建的表对象,且对其他用户无存取权限
结果:
1. superuser权限用户dbadmin可在tsysshm模式下对对象操作。
2. superuser权限用户dbadmin对owner非自己的用户在非public模式下的对象具有操作权限。
***/
3. superuser权限用户对非同库对象操作
-- 对象准备
test=# \c - dbadmin
You are now connected to database "test" as userName "dbadmin".
test=# create user tyxl01 with password '123456' createdb createrole;
CREATE ROLE
test=> \du+ tyxl01
角色列表
角色名称 | 属性 | 成员属于 | 描述
----------+-------------------+----------+------
tyxl01 | 建立角色, 建立 DB | {} |
test=# \c - tyxl01
You are now connected to database "test" as userName "tyxl01".
test=> create database db01;
CREATE DATABASE
test=> \c db01
You are now connected to database "db01" as userName "tyxl01".
db01=> create schema shm01;
CREATE SCHEMA
db01=> create table shm01.tb01(flg nvarchar(20));
CREATE TABLE
-- 对象权限查询
test=> \l+ db01
数据库列表
名称 | 拥有者 | 字元编码 | 校对规则 | Ctype | 存取权限 | 大小 | 表空间 | 描述
------+--------+----------+-------------+-------------+----------+-------+-------------+------
db01 | tyxl01 | UTF8 | zh_CN.UTF-8 | zh_CN.UTF-8 | | 14 MB | sys_default |
db01=> \dn+ shm01
架构模式列表
名称 | 拥有者 | 存取权限 | 描述
-------+--------+----------+------
shm01 | tyxl01 | |
(1 行记录)
db01=> \dt+ shm01.tb01
关联列表
架构模式 | 名称 | 类型 | 拥有者 | 大小 | 描述
----------+------+--------+--------+---------+------
shm01 | tb01 | 数据表 | tyxl01 | 0 bytes |
(1 行记录)
db01=> \dp+ shm01.tb01
存取权限
架构模式 | 名称 | 类型 | 存取权限 | 列特权 | 策略
----------+------+--------+----------+--------+------
shm01 | tb01 | 数据表 | | |
(1 行记录)
-- 对象操作
-- 用dbadmin用户对db01库shm01模式下的表操作
-- 1.dbadmin用户连接db01库
db01=# \c db01 dbadmin -- dbadmin用户连接db01库
You are now connected to database "db01" as userName "dbadmin".
db01=# revoke CREATE,USAGE on SCHEMA public from PUBLIC ; -- dbadmin回收非超级用户对public模式对的UC权限
db01=# create schema dbadmshm; -- dbadmin用户创建数据库模式对象
CREATE SCHEMA
db01=# create table dbadmshm.test(id int); -- dbadmin用户可操作数据库模式对象
CREATE TABLE
db01=# create table test(id int); -- dbadmin用户默认使用public模式
CREATE TABLE
-- 查看对象权限信息
db01=# \dt
关联列表
架构模式 | 名称 | 类型 | 拥有者
----------+--------+--------+---------
public | tbtyxl | 数据表 | tyxl01
public | test | 数据表 | dbadmin
(2 行记录)
db01=# \dt+ shm01.tb01
关联列表
架构模式 | 名称 | 类型 | 拥有者 | 大小 | 描述
----------+------+--------+--------+---------+------
shm01 | tb01 | 数据表 | tyxl01 | 0 bytes |
(1 行记录)
db01=# \dt+ dbadmshm.test
关联列表
架构模式 | 名称 | 类型 | 拥有者 | 大小 | 描述
----------+------+--------+---------+---------+------
dbadmshm | test | 数据表 | dbadmin | 0 bytes |
(1 行记录)
db01=# \dp+ public.t*
存取权限
架构模式 | 名称 | 类型 | 存取权限 | 列特权 | 策略
----------+--------+--------+----------+--------+------
public | tbtyxl | 数据表 | | |
public | test | 数据表 | | |
(2 行记录)
db01=# \dp+ shm01.t*
存取权限
架构模式 | 名称 | 类型 | 存取权限 | 列特权 | 策略
----------+------+--------+----------+--------+------
shm01 | tb01 | 数据表 | | |
(1 行记录)
-- superuser权限用户对其他模式对象操作
db01=> \c - dbadmin
You are now connected to database "db01" as userName "dbadmin".
db01=# select * from SYS_HM.PARAM ;
type_name | support_offline | type | name | defval
-----------------------+-----------------+---------+-------------+--------
All Datafiles Check | t | | |
Single Datafile Check | t | INTEGER | RELFILENODE |
(2 行记录)
db01=# insert into dbadmshm.test values (5);
INSERT 0 1
db01=# insert into test values (6);
INSERT 0 1
db01=# insert into shm01.tb01 values (4);
INSERT 0 1
-- 用tyxl01用户对db01库中操作
db01=> create schema testshm; -- tyxl01用户有createdb权限,可以创建模式
CREATE SCHEMA
db01=> create table test01(id int); -- tyxl01用户非superuser权限用户,不能操作未授权的或owner不是自己的模式对象
错误: 创建中没有选择模式
第1行create table test01(id int);
^
db01=> create table public.test01(id int);
错误: 对模式 public 权限不够
第1行create table public.test01(id int);
-- 用tyxl01用户对test库中模式下的表操作
db01=> \c test tyxl01 -- 以tyxl01用户连接test数据库
You are now connected to database "test" as userName "tyxl01".
test=> select * from tsysshm.tbtssup ; -- 非superuser权限用户tyxl01不能访问未授权模式对象
错误: 对模式 tsysshm 权限不够
第1行select * from tsysshm.tbtssup ;
^
test=> create table test(id int); -- 非superuser权限用户tyxl01不能在未授权模式操作模式对象
错误: 创建中没有选择模式
第1行create table test(id int);
/***
条件:
1. db01数据库,shm01模式,tb01表均为tyxl01用户创建,依次包含
2. shm01,tb01对象owner均为tyxl01用户,且对其他用户无存取、操作显式权限
结果:
1. superuser权限用户dbadmin可以在db01数据库中对模式对象操作
2. superuser权限用户dbadmin对owner非自己的用户在非public模式下的对象具有操作权限
3. superuser权限用户dbadmin在db01中默认模式public模式,可直接操作其模式对象
4. 非superuser权限用户不能操作未授权模式对象或owner不是自己的模式对象
***/
最后修改时间:2023-12-14 18:56:54
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




