1.概念

1.schema是每个database中特有的。 schema概念有点像命名空间,这个逻辑空间包含若干表对象。

在DB里面,有了schema才可以创建对象,对象需要依赖于schema,默认为schema为 public

2.user是cluster级别的,它的逻辑架构位于数据库之上。可以在DB里创建与user同名的schema ,指定search_path

3.查询表时需要指定schema.tablename,表存在于某个特定schema中。

4.每个DB有自己的owner,默认为超级用户TEST

注意事项:

1.用户创建的所有对象都被创建在指定的schema(或namespace)中。其他用户可以被授予、也可以限制访问这些对象,甚至通过权限控制都不能在对应的schema中创建对象。

2.用户(或角色)是全局对象,不是定义在数据库中,而是定义在实例的级别。schema是用户在指定的数据库中创建的,其中包含数据库对象。

3.KingbaseES数据库默认有一个public schema,如果没有为对象显式地指定schema,默认使用public schema。

4.db owner不一定能操作其下面的某个schema (db里的 schema 的owner 可以指定其它user),但一般会将schema与同名的owner相关联,这就很像oracle的架构。

5.schema owner授权完成后, 不一定能操作其下面的某张表 (需要再授予表的相关权限)

6、授予某个用户select on all tables in schema XX时,需要先对用户授权usage访问schema XX,否则会出现报错Invalid operation: permission denied for schema XX;

grant usage on schema ce to owner_2;

grant select on all tables in schema ce to owner_2;

7、以上第6项用户只能查询该schema下已经存在的表,无法查询该schema下新建的表. 如果想对该schema下新建的表也获得权限,需要将该schema的owner授权给用户

如:

alter default privileges for user ce_owner in schema ce grant select on tables to owner_2;

--以后schema ce的owner ce_owner在schema ce下新建的表,用户owner_2都可以访问

alter default privileges in schema ce grant select on tables to owner_2;

--当前用户执行如上语句后,此用户在ce下新建的任何表,owner_2都可以访问(其他用户创建的表,owner_2不能访问)

alter default privileges for user user1,user2 in schema ce grant select on tables to owner_2;

--以后user1,user2在schema ce下新建的表,用户owner_2都可以访问

备注:目前没有一种方法,可以使以后任何用户在ce下新建的表,owner_2都可以访问。

2.测试

2.1 测试search_path对schema下创建对象的影响

[](javascript:void(0)

#创建wy用户,2个db 

TEST=#CREATE USER wy WITH PASSWORD 'wy';
TEST=#CREATE DATABASE wydb OWNER wy;
TEST=#GRANT ALL PRIVILEGES ON DATABASE wydb TO wy; TEST=#CREATE DATABASE wydb2 OWNER wy;
TEST=#GRANT ALL PRIVILEGES ON DATABASE wydb2 TO wy; TEST=# \l
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
-----------+--------+----------+-------------+-------------+-------------------
security | system | UTF8 | en_US.UTF-8 | en_US.UTF-8 |
template0 | system | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/system +
| | | | | system=CTc/system
template1 | system | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/system +
| | | | | system=CTc/system
test | system | UTF8 | en_US.UTF-8 | en_US.UTF-8 |
test1 | system | GBK | zh_CN.GBK | zh_CN.GBK |
wydb | wy | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =Tc/wy +
| | | | | wy=CTc/wy
wydb2 | wy | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =Tc/wy +
| | | | | wy=CTc/wy
(7 rows) ksql -U wy -d wydb wydb=> create table t1(a int); wydb=> \dt
List of relations
Schema | Name | Type | Owner
--------+------+-------+-------
public | t1 | table | wy
(1 row) #创建和用户同名的schema wy
wydb=> create schema wy;
CREATE SCHEMA
wydb=> create table t2(a int);
CREATE TABLE wydb=> \dt
List of relations
Schema | Name | Type | Owner
--------+------+-------+-------
public | t1 | table | wy
wy | t2 | table | wy
(2 rows) #因为search_path的设置如下,所以创建的表t2默认在schema wy下
wydb=> show search_path;
search_path
-----------------
"$user", public
(1 row) #创建新的schema为wysc, 我们发现新创建的schema, owner默认是我们的username
create schema wysc;
wydb=> \dn
List of schemas
Name | Owner
--------+----------
wy | wy
wysc | wy
public | system
(3 rows) #设置search_path
set search_path = 'wysc',"$user",public;
wydb=> show search_path ;
search_path
-------------------------
wysc, "$user", public
(1 row) #创建T3表 指定wysc
wydb=> create table wysc.t3(a int);
CREATE TABLE
wydb=> \dt
List of relations
Schema | Name | Type | Owner
--------+------+-------+-------
public | t1 | table | wy
wy | t2 | table | wy
wysc | t3 | table | wy
(3 rows) #由于设置了search_path,此时即使创建表不加模式名前缀,新表的所属schema也是wysc
wydb=> create table t4(a int );
CREATE TABLE
wydb=> \dt
List of relations
Schema | Name | Type | Owner
--------+------+-------+-------
public | t1 | table | wy
wy | t2 | table | wy
wysc | t3 | table | wy
wysc | t4 | table | wy

[](javascript:void(0)

2.2测试不同user之间的对象访问权限

[](javascript:void(0)

#新创建用户wy2,新把wydb2授权给wy2;即wydb2同时授权给wy,wy2两个用户

TEST=#  CREATE USER wy2 WITH PASSWORD 'wy2';
CREATE ROLE
TEST=#
TEST=# GRANT ALL PRIVILEGES ON DATABASE wydb2 TO wy2;
GRANT TEST=# \l
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
-----------+--------+----------+-------------+-------------+-------------------
wydb | wy | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =Tc/wy +
| | | | | wy=CTc/wy
wydb2 | wy | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =Tc/wy +
| | | | | wy=CTc/wy +
| | | | | wy2=CTc/wy
(7 rows) #以wy2 用户在wydb2中创建schema testsc指定owner 为wy
TEST=# GRANT "wy" to wy2;
GRANT ROLE #授权后,wy2在wy的member里
TEST=# \du
List of roles
Role name | Attributes | Member of
-----------+------------------------------------------------------------+------------
wy | | {}
wy2 | | {wy} ksql -U wy2 -d wydb2 wydb2=> create schema testsc AUTHORIZATION wy;
CREATE SCHEMA wydb2=> \dn
List of schemas
Name | Owner
--------+----------
public | system
testsc | wy
(2 rows) set search_path = 'testsc',"$user",public; #创建T5表指定testsc wydb2=> create table testsc.t5(a int);
CREATE TABLE
wydb2=> \dt
List of relations
Schema | Name | Type | Owner
--------+------+-------+-------
testsc | t5 | table | wy2
(1 row) wydb2=> select user;
user
------
wy2
(1 row) wydb2=> select * from testsc.t5;
a
---
(0 rows) #可以看到,这时虽然Schema的Owner是wy ,但table的owner还是wy2,所以用wy是查不到t5的
ksql -U wy -d wydb2 wydb2=> select * from testsc.t5;
ERROR: permission denied for table t5 #更改t5表的owner为wy后可以查询
ksql -U wy2 -d wydb2 wydb2=> alter table testsc.t5 OWNER TO wy;
ALTER TABLE
wydb2=> \dt testsc.t5
List of relations
Schema | Name | Type | Owner
--------+------+-------+-------
testsc | t5 | table | wy
(1 row) #再次以wy用户登录可以查询
ksql -U wy -d wydb2 wydb2=> select * from testsc.t5;
a
---
(0 rows) #现在无论用wy用户,还是wy2用户都可查询,因为wydb2库里面,wy2里有wy信息的Member
wydb2=> \du
List of roles
Role name | Attributes | Member of
-----------------+------------------------------------------------------------+-----------------------
wy | | {}
wy2 | | {wy} #当回收wy2用户里的 wy的member 信息时,就没有权限 TEST=# revoke "wy" from wy2;
REVOKE ROLE
TEST=# \q
ksql -U wy2 -d wydb2 wydb2=> select * from testsc.t5;
ERROR: permission denied for schema testsc #这时只要同时授权这2个权限, wy2可以又访问t5这张表了 ksql -U wy -d wydb2 grant USAGE on SCHEMA testsc to wy2 ; --授权完成后,testsc既和wy用户关联,又和wy2用户关联 grant SELECT on testsc.t5 to wy2 ; ksql -U wy2 -d wydb2 wydb2=> select * from testsc.t5;
a
---
(0 rows)

[](javascript:void(0)

KingbaseES中不同user之间的权限关系的更多相关文章

  1. 06 (OC)* iOS中UI类之间的继承关系

    iOS中UI类之间的继承关系 此图可以更好的让你去理解iOS中一些底层的关系.你能够了解以及理解UI类之间的继承关系,你会更加明白苹果有关于底层的东西,更有助于你的项目开发由它们的底层关系,就能更加容 ...

  2. wemall app商城源码中基于JAVA的绑定和处理fragments和viewpager之间的逻辑关系代码

    wemall doraemon是Android客户端程序,服务端采用wemall微信商城,不对原商城做任何修改,只需要在原商城目录下上传接口文件即可完成服务端的配置,客户端可随意定制修改.本文分享其中 ...

  3. Hibernate中的Entity类之间的继承关系之一MappedSuperclass

    在hibernate中,Entity类可以继承Entity类或非Entity类.但是,关系数据库表之间不存在继承的关系.那么在Entity类之间的继承关系,在数据库表中如何表示呢? Hibernate ...

  4. 斯坦福大学公开课机器学习: advice for applying machine learning | regularization and bais/variance(机器学习中方差和偏差如何相互影响、以及和算法的正则化之间的相互关系)

    算法正则化可以有效地防止过拟合, 但正则化跟算法的偏差和方差又有什么关系呢?下面主要讨论一下方差和偏差两者之间是如何相互影响的.以及和算法的正则化之间的相互关系 假如我们要对高阶的多项式进行拟合,为了 ...

  5. fleet中service之间的依赖关系

    最近有人在topcoder上提出使用fleet在集群上部署service时有时候会发现,当启动依赖于整个集群服务的service时,只会检查那个service所在机器的依赖关系,这样就会造成一些问题, ...

  6. ALSA声卡驱动中的DAPM详解之五:建立widget之间的连接关系

    前面我们主要着重于codec.platform.machine驱动程序中如何使用和建立dapm所需要的widget,route,这些是音频驱动开发人员必须要了解的内容,经过前几章的介绍,我们应该知道如 ...

  7. 在VS中建立.aspx,.cs,.designer.cs之间的级联关系

    <Compile Include="..\Admin\Actions.aspx.cs"> <DependentUpon>Actions.aspx</D ...

  8. Android中的安全与访问权限控制

    Android是一个多进程系统,在这个系统中,应用程序(或者系统的部分)会在自己的进程中运行.系统和应用之间的安全性是通过Linux的facilities(工具,功能)在进程级别来强制实现的,比如会给 ...

  9. 关于如何在你的Web项目中实现对空间数据访问权限的控制(一)

    Wednesday, 23 JUNE 近来一直在研究关于如何在我的WebGIS项目中实现对空间数据(已发布在GeoServer上)进行权限管理的问题.虽然到目前为止没能找到一个完美的解决方案,但通过这 ...

  10. vue3,后台管理列表页面各组件之间的状态关系

    技术栈 vite2 vue 3.0.5 vue-router 4.0.6 vue-data-state 0.1.1 element-plus 1.0.2-beta.39 前情回顾 表单控件 查询控件 ...

随机推荐

  1. Seata的分布式事务实现原理

    Seata分布式事务方案 简介 Seata是阿里开源的分布式事务解决方案中间件,对业务侵入小,在应用中Seata整体事务逻辑基于两阶段提交的模型,核心概念包含三个角色: TM:事务发起者.用来告诉TC ...

  2. Swoole从入门到入土(5)——TCP服务器[异步任务]

    无论对于B/S还是C/S,程序再怎么变,唯一不变的是用户不想等太久的躁动心情.所以服务端对于客户的请求,能有多快就多快.如果服务端需要执行很耗时的操作,就需要异步任务处理机制,保证当前的响应速度不受影 ...

  3. 利用javax.validation实现对bean属性校验

    1.使用场景介绍 controller层对传入的bean的属性进行非空.属性长度等合法性的校验. 传统的方式是我们要自己写if-else-去判断,比较麻烦. 2.实现效果 3.代码介绍 代码结构: p ...

  4. Java集合框架学习(五) ArrayList详解

    Arraylist介绍 Arraylist类实现了List接口. public class ArrayList<E> extends AbstractList<E> imple ...

  5. SpringCloud SpringBoot 组件使用:使用Nacos作为服务的注册中心和配置中心

    基础篇 一.什么是Nacos? 官方介绍是这样的: Nacos 致力于帮助您发现.配置和管理微服务.Nacos 提供了一组简单易用的特性集,帮助您实现动态服务发现.服务配置管理.服务及流量管理. Na ...

  6. 面试官:你知道Comparable 和 Comparator 的区别吗?我:巴拉巴拉

    写在开头 面试官:"我们在Java的集合和数据结构中都离不开比较器,请你聊一聊Comparable 和 Comparator 这两种的区别吧" 内心活动:"上来就这么直接 ...

  7. 用Taro写一个微信小程序——渲染 HTML

    在taro小程序里面渲染一段html代码,具体可查看文档https://docs.taro.zone/docs/html 一.渲染 HTML 文档推荐使用 dangerouslySetInnerHTM ...

  8. 异常处理try...except...finally---day26

    1.认识异常处理 # ### 认识异常处理 #IndexError 索引超出序列范围 #lst = [1,2,3,4] #print(lst[10]) #KeyError 字典中查找一个不存在的关键字 ...

  9. del,str,repr,call,bool,add,len等魔术方法以及与类相关的魔术属性---day23

    1.__del__ # ### __del__魔术方法(析构方法) ''' 触发时机:当对象被内存回收的时候自动触发(1.页面执行完毕回收所有变量2.所有对象被del的时候) 功能:对象使用完毕后资源 ...

  10. 【LeetCode二叉树#10】从中序与后序(或者前序)遍历序列构造二叉树(首次构造二叉树)

    从中序与后序遍历序列构造二叉树 力扣题目链接(opens new window) 根据一棵树的中序遍历与后序遍历构造二叉树. 注意: 你可以假设树中没有重复的元素. 例如,给出 中序遍历 inorde ...