KES存储结构图
其中包含这KES中表空间、数据库、模式、模式对象之间的关系
由下图可以知道一下几个知识点
1、在模式下的对象我们称之为模式对象
2、而表空间实际上是存在我们物理机上的一个位置,系统表空间存在与/data/global,默认表空间存在/data/base;/data目录取决于安装KES时自定义的数据存放目录;如下,我们在/data/base下是存放着缺省表空间,而每一个编号就代表着每一个对象的id编号
3、用户要想访问数据库中的对象,先要依附于一个角色,接着在进行授权或者是成为该对象的owner
1、在一个数据集簇中可以创建多个数据库,如我们在Kylin系统中安装了KES数据库,但是使用ksql进入数据库时,还是有多个数据库选择进入
2、在一个数据库集簇中可以创建多个表空间,表空间是用来存放我们在数据库中所创建的表的,而这些表有不同类型的,有的是系统自带的表,有的是我们自己创建的表,所以就需要不同类型的表空间来存放这些不同类型的表
3、多个数据库可以共同使用多个表空间(库与表空间的关系:多对多)
4、一个数据库可以创建和拥有多个模式(模式是数据库相关对象的集合),当我们登录到数据库test上后,可以使用元命令"\dn+",可以看到是有多个模式的
5、用户被授予权限后可以登录数据库。其实当用户被创建的那一刻,该用户是默认属于public角色的,而public角色是对大部分数据库和模式都存在一定的权限的
6、用户被授予权限后可以访问多个模式下的对象
数据库
数据库集簇和数据库实例
1、与oracle数据库不同的是,KES是一个由多个数据库组成的数据集簇;而数据集簇是指由单个KES实例管理的数据库的集合
2、KES集簇中的库使用相同的全局配置文件和监听端口(54321),并且共享相关的进程和内存结构
3、而数据库实例就是同一数据库集簇中的进程和相关的内存结构
数据库
1、数据库是一个长期存储在计算机内的、由组织的、可共享的、统一管理的大量数据的集合
2、从物理结构来说:数据库由一系列位于文件系统上的文件组成
3、从逻辑结构来说:数据库内部通过表空间、模式、表/索引等对象与文件系统上的文件关联
创建数据库的SQL语法;但是只用超级用户或具有createdb权限的用户才能创建数据库
创建数据库
CREATE DATABASE database_name 参数;
参数 | 简介 |
---|---|
name | 数据库的名称,在同一个KES集簇下不能同名 |
user_name | 指定该数据库的属主,默认属主是建库的执行者 |
template | 所建数据库模板的名称,即是服务哪一个数据库模板的,默认是数据库模板template0 |
encoding | 数据库字符集 |
lc_collate | 数据库的排序规则,默认参照模板方式 |
lc_ctype | 数据库的字符分类,莫瑞诺参照模板方式 |
tablespace_name | 数据库关联的表空间。该库的相关对象存储空间将使用该表空间 |
allowconn | 假,不允许用户连接;真,允许用户连接 |
connlimit | 数据库允许的连接数,默认-1为无限制 |
istemplate | 真,具有createdb权限的用户可以从模板克隆;假,超级用户或库的所有者可以从模板克隆 |
注意:只有超级用户或具有createdb权限的用户才能创建数据库
更改数据库
语法大纲:
ALTER DATABASE name RENAME TO new_name; //将数据库重命名,name为旧名字,new_name为新名字
ALTER DATABASE name OWNER TO (new_name | CURRENT_USER | SESSION_USER );//表示更改数据库的所有者,new_name为用户名,CURRENT_USER为当前之心SQL语句的用户,SESSION_USER表示当前会话的用户
ALTER DATABASE name SET TABLESPACE new_tablespace; //将数据库name的表空间更改为new_tablespace
ALTER DATABASE name SET configuration_paratmeter { TO | = } { value | DEFAULT }; //修改数据库的配置参数
ALTER DATABASE name SET configuration_paratmeter FROM CURRENT; //将当前会话的配置参数保存为数据库的默认值
ALTER DATABASE name RESET configuration_parameter;
ALTER DATABASE name RESET ALL;
参数 | 简介 |
---|---|
rename | 修改非当前连接数据库的名称、 |
owner | 更改数据库的所有者 |
set tablespace | 修改数据库的默认表空间 |
ser/reset configuration_parameter | 修改/重置该数据库的参数配置 |
注意:修改数据库属性,需要具备createdb权限,或是超级管理员,或是库的所有者
删除数据库
语法:
DROP DATABASE [ IF EXIXTS ] name
参数 | 简介 |
---|---|
if exists | 若删除的库存在则直接删除;若删除的库不存在,显示提示信息而不是报错信息 |
注意:1、删除数据库时会移除磁盘上对应的文件夹及文件
2、删除库要由库的所有者或数据库管理员进行操作
3、删除当前使用的库会报错
4、创建和删除数据库的操作不能再一个事务中进行,但创建表这个操作可以在事务中进行
5、创建和删除数据库的操作不可回滚
表空间
表空间的概念
1、表空间是数据库分配的逻辑结构
2、数据库对象都存放在表空间中,对象的组成主要是表,所以称作表空间
3、表空间实际上就是给数据库对象指定一个操作系统文件夹,即存放表的文件夹叫做表空间
4、表空间是不能被附加到一个不同的数据库集簇或者单独备份,另外表空间中文件损坏或丢失,数据库集簇可能会变成不可读或则无法启动
表空间的好处
1、当表空间所在的地方存储不够且无法扩展时,可以在不同存储设备上创建新表空间
2、频繁使用的表可以放在高速磁盘上,性能要求不高的表可以存储在慢速磁盘上
查看当前数据库的表空间
test=# \db+
表空间列表
名称 | 拥有者 | 所在地 | 存取权限 | 选项 | 大小 | 描述
-------------+--------+----------------------+----------+------+---------+------
sys_default | system | | | | 64 MB |
sys_global | system | | | | 658 kB |
sysaudit | system | | | | 24 kB |
tbs01 | system | /home/kingbase/dir01 | | | 0 bytes |
(4 行记录)
创建表空间的SQL语句
语法:
CREATE TABLESPACE teblespace_name
[ OWNER { new_owner | CURRENT_USER | SESSION_USER } ]
LOCATION 'directory'
[ WITH ( tablespace_option = value [,.....] ) ]
参数 | 简介 |
---|---|
owner | 指定该表空间的属主;如果省略。默认为执行该命令的用户为表空间的属主 |
directory | 与表空间关联的文件系统的绝对路径 |
tablespace_option | 设置或重置表空间的1/0参数 |
创建表空间tbs01放在/home/kingbase/dir01下
test=# create tablespace tbs01 location '/home/kingbase/dir01';
CREATE TABLESPACE
创建表t01使其表空间为tbs01
test=# create table t01(id int) tablespace tbs01;
CREATE TABLE
此时,在表空间的内容已经发生了变化,
在数据库视图中查看t05对应表空间的物理路径
test=# select sys_relation_filepath('t01');
sys_relation_filepath
-----------------------------------------------
sys_tblspc/16387/SYS_12_202211151/12259/16388
(1 行记录)
修改表空间的SQL语法
语法:
ALTER TABLESPACE name RENAME TO new_name
ALTER TABLESPACE name OWNER TO { new_owner | CURRENT_USER | SESSION_USER }
ALTER TABLESPACE name SET ( tablespace_option = value [,.....] )
ALTER TABLESPACE name RESET ( tablespace_option [,.....] )
参数 | 简介 |
---|---|
rename | 重命名表空间。只有超级用户或表空间的所有者才有权限修改 |
owner to | 修改表空间的属主,只有超级用户或表空间所有者才有修改权限 |
set | 设置表空间的相关参数 |
reset | 重置表空间的相关参数到默认值 |
注意:
1、在创建表/模式时未指定表空间时,则该对象将自动存入该库对应的默认表空间(sys_default),如果指定了表空间,则存入指定的表空间内
2、一个库可以使用多个表空间,一个表可以被多个库使用
3、KES可以使用参数temp_tablespace配置临时表空间用户存储SQL指定时产生的临时数据
删除表空间
语法:
DROP TABLESPACE [ IF EXISTS ] name
参数 | 简介 |
---|---|
if exists | 如果删除的表空间存在,则直接删除;如果删除的表空间不存在,则提示信息,但不会报错 |
注意:
1、一个表空间只能被超级用户或拥有者删除
2、表空间删除前不能存在任何对象,否则删除失败
查询表空间的物理路径
test=#select sys_relation_filepath('tablespace_name'); //tablespace_name表示表空间的名字
实验1:表空间的增删查改
查-----列出表空间的清单
1、使用管理员system连接到数据库test
[kingbase@node1 ~]$ ksql -dtest -Usystem
2、使用元命令查看表空间信息
test=# \db+
3、使用数据字典查看表空间信息
test=# select oid,spcname from sys_tablespace;
4、查看数据库的默认表空间信息
test=# \l+
注意:
1、sys_default表空间,用来存储系统目录对象,用户表,用户表索引、临时表、临时表索引、内部临时表的默认空间,对应存储目录/base/;
2、sys_global表空间,用来存放系统字典表,对应存储目录/global;
增-----创建表空间
规划表空间对应的文件系统目录
在根目录下新建目录dir01
[root@node1 ~]# mkdir /dir01
设定目录dir01的属主、属组、权限
[root@node1 ~]# chown kingbase.kingbase /dir01
[root@node1 ~]# chmod 700 /dir01
检查目录dir01的定义信息
[root@node1 ~]# ll /dir01/ -d
drwx------ 2 kingbase kingbase 6 11月 5 16:54 /dir01/
新建表空间tbs01
查看表空间信息
test=# \db+
表空间列表
名称 | 拥有者 | 所在地 | 存取权限 | 选项 | 大小 | 描述
-------------+--------+--------+----------+------+--------+------
sys_default | system | | | | 64 MB |
sys_global | system | | | | 658 kB |
sysaudit | system | | | | 24 kB |
新建表空间tbs01,关联目录/dir01,表空间属主默认
test=# create tablespace tbs01 location '/dir01'
test-# ;
CREATE TABLESPACE
查看表空间tbs01的信息
test=# \db
表空间列表
名称 | 拥有者 | 所在地
-------------+--------+--------
sys_default | system |
sys_global | system |
sysaudit | system |
tbs01 | system | /dir01
改------修改表空间
修改表空间tbs01的属主和名称
2、修改表空间tbs01的属主为user01
test=# alter tablespace tbs01 owner to user01;
ALTER TABLESPACE
3、修改表空间tbs01的名称为tbs10
test=# alter tablespace tbs01 rename to tbs10;
ALTER TABLESPACE
修改数据库db01默认表空间为tbs01
2、修改数据库db01默认表空间为tbs10
test=# alter database db01 set tablespace tbs10;
ALTER DATABASE
移动表到新的表空间
2、查看现有表空间
test=# \db+
表空间列表
名称 | 拥有者 | 所在地 | 存取权限 | 选项 | 大小 | 描述
-------------+--------+--------+----------+------+--------+------
sys_default | system | | | | 64 MB |
sys_global | system | | | | 658 kB |
sysaudit | system | | | | 24 kB |
tbs10 | user01 | /dir01 | | | 13 MB |
(4 行记录)
3、在表空间sys_default中创建表t01并插入1行数据
test=# create table t01(id int) tablespace sys_default;
CREATE TABLE
test=# insert INTO t01 values (100);
INSERT 0 1
4、移动表t01到表空间tbs01中
test=# alter table t01 set tablespace tbs10
test-# ;
ALTER TABLE
查-----检查表空间修改结果
1、查看db01数据库当前的默认表空间
test=# \l+ db01
数据库列表
名称 | 拥有者 | 字元编码 | 校对规则 | Ctype | 存取权限 | 大小 | 表空间 | 描述
------+--------+----------+-------------+-------------+----------+-------+--------+------
db01 | system | UTF8 | zh_CN.UTF-8 | zh_CN.UTF-8 | | 13 MB | tbs10 |
(1 行记录)
2、查看test数据库中t01表当前所在的表空间
test=# \d+ t01
数据表 "public.t01"
栏位 | 类型 | 校对规则 | 可空的 | 预设 | 存储 | 统计目标 | 描述
------+---------+----------+--------+------+-------+----------+------
id | integer | | | | plain | |
表空间:"tbs10"
访问方法 heap
3、查看新表空间的名称、属主等信息
test=# \db+ tbs10
表空间列表
名称 | 拥有者 | 所在地 | 存取权限 | 选项 | 大小 | 描述
-------+--------+--------+----------+------+-------+------
tbs10 | user01 | /dir01 | | | 13 MB |
(1 行记录)
删-----删除表空间
删除表空间tbs10
2、删除表空间tbs10失败,提示表空间非空
test=# drop tablespace tbs10;
错误: 表空间 "tbs10" 不是空的
排插tbs10表空间中有哪些对象并移动或删除这些对象
注意:1、表空间存在对象时,则删除该表空间会报错;2、表空间被设置为数据库的默认表空间时,则删除会报错
1、查看tbs10表空间的OID
test=# select * from sys_tablespace where spcname='tbs10'; //在sys_tablespace视图中查找关于表空间名称为tbs10的视图,并记录oid
oid | spcname | spcowner | spcacl | spcoptions
-------+---------+----------+--------+------------
16384 | tbs10 | 16385 | |
(1 行记录)
sys_tablespace是数据库中的一个系统视图,该视图包含着数据库中表空间的信息,对应着文件系统上的一个或多个物理文件
2、通过表空间的OID查找改表空间中存在对象的数据库列表
查询oid内是否有"select sys_tablespace_databases(16384)"的结果
test=# select datname from sys_database where oid in (select sys_tablespace_databases(16384));
datname
---------
test
db01
(2 行记录)
3、根据上一步获取的数据库列表登录每个数据库并查找放在tbs10表空间中的对象
sys_class是一个非常重要的表,记录着表和几乎所有具有列或者像表的东西的元数据,其中relname为表、索引、视图等名字,reltablespace为表空间的OID
test=# select relname from sys_class where reltablespace=16384;
relname
---------
t01
(1 行记录)
4、移动所有在表空间tbs10中的对象到其他表空间
test=# alter table t01 set tablespace sys_default;
ALTER TABLE
test=# select relname from sys_class where reltablespace=16384;
relname
---------
(0 行记录)
排查tbs10表空间被设置为哪些数据库的默认表空间并解除关联
1、查看默认表空间为tbs10的数据库信息
test=# \l+
2、解除数据库与tbs10的关联
test=# alter database db01 set tablespace sys_default;
ALTER DATABASE
再次尝试删除表空间tbs10
2、删除表空间tbs10成功
test=# drop tablespace tbs10;
DROP TABLESPACE
再次查看表空间,会发现
实验2:数据库的增删查改
查-----列出集簇中现有数据库的清单
test=# \l
各种数据库解释:
1、TEST:自带的测试数据库,可以在其中创建数据库对象用于学习、做实验
2、SECURITY:存储入侵检测日志和检测结果
3、TEMPLATE0:自带的干净的模块库,用来创建纯净的数据库,不允许用户连接和删除
4、TEMPLATE1:自带的模板库,可以连接和修改和删除
增-----创建数据库
创建数据库
1、创建数据库db01,属主为user01,编码为UTF8,参照模板template0,连接数为10
test=# create database db01 owner user01
test-# encoding 'UTF8' template template0
test-# connection limit 10;
2、检查数据库的定义信息
test=# \x
扩展显示已打开.
test=# \l+ db01
数据库列表
-[ RECORD 1 ]---------
名称 | db01
拥有者 | user01
字元编码 | UTF8
校对规则 | zh_CN.UTF-8
Ctype | zh_CN.UTF-8
存取权限 |
大小 | 13 MB
表空间 | sys_default
描述 |
改-----修改数据库的属主和名称
1、数据库db01属主修改为system
test=# alter database db01 owner to system
test-# ;
ALTER DATABASE
2、修改数据库db01名称为db10
test=# alter database db01 rename to db10;
ALTER DATABASE
查-----确认数据库的属主和名称
test=# \l+ db10
数据库列表
-[ RECORD 1 ]---------
名称 | db10
拥有者 | system
字元编码 | UTF8
校对规则 | zh_CN.UTF-8
Ctype | zh_CN.UTF-8
存取权限 |
大小 | 13 MB
表空间 | sys_default
描述 |
删-----非属主/非超级用户或库正在使用不能删除
不允许删除正在使用的数据库
test=# \c db10 system
您现在已经连接到数据库 "db10",用户 "system".
db10=# drop database db10;
错误: 无法删除当前使用的数据库
1、删除数据库db10,提示无法删除当前使用的数据库
正常删除数据库
1、切换到数据库test
db10=# \c test system
您现在已经连接到数据库 "test",用户 "system".
2、删除数据库db10,提示删除完成
test=# drop database db10;
DROP DATABASE
重复执行DROP DATABASE,理解IF EXISTS选项
1、再次删除数据库db10,提示"数据库不存在"
test=# drop database db10;
错误: 数据库 "db10" 不存在
2、添加IF EXISTS选项后,继续删除数据库db10,提示"数据库不存在,删除完成"
test=# drop database if exists db10;
注意: 数据库 "db10" 不存在,跳过
DROP DATABASE
表空间不足的解决办法
1、表空间的不足,在KES中表空间与文件夹相对应,表空间不足就代表着文件系统不足
2、根据不同的场景,可以采取不同措施
①让系统+存储工程师在线扩大对应的逻辑卷、文件系统
②让系统+存储工程师挂载新的lun存储、并且dba创建新的表空间
③紧急情况下可迁移走alert日志,清理大表的历史数据并收缩表
模式(schema)
模式(schema)
1、模式就是数据库对象的集合,即由多个数据库对象组成模式(schema)
2、一个数据库内包含着一个或多个模式
3、由于数据库对象的多样,我们需要给数据库对象进行分类,而分类的依据就是将数据库对象的集合起一个名字,这个名字就是"模式(schema)"
4、在不同模式下可以创建相同名称的对象,也就是说模式与模式的内部是互不干扰的,例如scott模式和hr模式都可以包含名为emp表
模式对象(schema object)
1、模式对象就是在模式下所存储或引用数据的相关对象,包括表、索引、视图、序列、函数等
2、一个数据库中同一个模式下的对象不能重名
3、一个数据库中不同模式下的对象可以重名,即模式与模式之间是独立的
创建模式的SQL语法
语法:
CREATE SCHEMA schema_name [AUTHORIZATION role_specification ] [ schema_element [.....] ]
CREATE SCHEMA AUTHORIZATION role_specification [ schema_element [.....] ]
CREATE SCHEMA IF NOT EXISTS schema_name [ AUTHORIZATION role_specification ]
CREATE SCHEMA IF NOT EXISTS AUTHORIZATION role_specification
参数 | 简介 |
---|---|
role_specificaton | 该模式的属主;如果省略,默认属主是执行该命令的角色/用户 |
schema_element | 创建模式时,嵌套的创建的对象的sql语句 |
authorization | 创建一个与用户同名的模式 |
if not exists | 创建模式时,如果模式不存在则创建,如果模式已存在则显示提示信息,而不是显示报错信息 |
修改模式的SQL语法
语法:
ALTER SCHEMA name RENAME TO new_name
ALTER SCHEMA name OWNER TO { new_owner | CURRENT_USER | SESSION_USER }
参数 | 简介 |
---|---|
rename | 修改模式的名称 |
owner | 修改模式的所有者 |
删除模式的SQL语法
语法:
DROP SCHEMA [ IF EXISTS ] name [,...] [ CASADE | RESTRICT ]
参数 | 简介 |
---|---|
if exists | 删除模式时,若模式存在则进行删除,若模式不存在则显示提示信息 |
cascade | 删除模式时级联删除其中的对象 |
restrict | 默认,如果模式下包含对象,则拒绝删除 |
注意:删除模式需要模式所有者或超级用户权限,在orcale下是drop user…而不是drop schema…
search_path
KES中的search_path
search_path,寻找的路径,寻找什么?寻找sechma
如在public下有个t01表,在schema01下也有一个t01表,那么我们查看t01的时候,应该查找到哪个t01呢?这个就是由search_path来决定的
search_path是一个用于对象搜索的模式列表,它类似于Linux中的path环境变量
比如执行"SELECT * FROM t01"语句来引用t01表,需要执行者满足一定的条件才能成功
①数据库会沿着search_path指定的模式列表依次查找
②用户需拥有模式的USAGE权限,否则跳过该模式;就是说用户能够进入到模式(文件夹)下
③用户需拥有对象的SELECT权限,否则报错;用户拥有如表这一类的对象的查询权限
④返回命中的第一个t01表的数据
⑤如果遍历search_path变量中的模式列表后仍未找到t01,则报错(“找不到对象”)
如果用户自定义的对象于系统内置的数据字典同名,则优先访问数据字典对象
修改模式名可能会影响search_path
显式指定模式名前缀(比如:schema1.t01),数据库会忽略search_path
sys_catalog模式总是被搜索,不管它是否在搜索路径中被提及
1、如果它在路径中被提及,那么它将被按照路径指定的顺序搜索
2、如果sys_catalog不在路径中,则它将在任何路径项之前被搜索
实验1:模式的增删查改
查-----列出test库中的模式清单
test=# \dn+
注:
模式 | 作用 |
---|---|
PUBLIC | 创建数据库时会默认创建的模式,默认情况下允许所有用户写入 |
SYSAUDIT | 该模式下存储会话像审计日志记录、对象审计日志记录 |
XLOG_RECORD_READ | 该模式保存XLOG事务日志相关的信息 |
增-----创建模式
1、创建用户user01,密码设置为kingbase
test=# create user user01 password 'kingbase';
CREATE ROLE
2、新建模式user01,属主为user01
test=# create schema user01 authorization user01;
CREATE SCHEMA
3、检查模式定义信息
test=# \dn+ user01
架构模式列表
名称 | 拥有者 | 存取权限 | 描述
--------+--------+----------+------
user01 | user01 | |
(1 行记录)
改-----修改模式
1、修改模式user01的属主为system
test=# alter schema user01 owner to system;
ALTER SCHEMA
2、修改模式user01的名称为schema01
test=# alter schema user01 rename to schema01;
ALTER SCHEMA
查-----检查模式修改结果
test=# \dn+ user01
架构模式列表
名称 | 拥有者 | 存取权限 | 描述
------+--------+----------+------
(0 行记录)
test=# \dn+ schema01
架构模式列表
名称 | 拥有者 | 存取权限 | 描述
----------+--------+----------+------
schema01 | system | |
(1 行记录)
删-----删除模式
1、在schema01下创建t01表
test=# create table schema01.t01(id int);
CREATE TABLE
2、删除模式schema01,提示"有对象依赖于模式、无法删除"
test=# drop schema schema01;
错误: 无法删除 模式 schema01 因为有其它对象倚赖它
描述: 表 schema01.t01 倚赖于 模式 schema01
提示: 使用 DROP .. CASCADE 把倚赖对象一并删除.
3、检查模式schema01中的对象信息
test=# \d+ schema01.*
数据表 "schema01.t01"
栏位 | 类型 | 校对规则 | 可空的 | 预设 | 存储 | 统计目标 | 描述
------+---------+----------+--------+------+-------+----------+------
id | integer | | | | plain | |
访问方法 heap
4、通过cascade删除模式schema01,cascade表示采用递归删除的方式来模式schema01下的对象
test=# drop schema schema01 cascade ;
注意: 递归删除 表 schema01.t01
DROP SCHEMA、
实验2:search_path变量
查看当前的search_path和$USER的值
test=# show search_path;
search_path
-----------------
"$user", public
(1 行记录)
$user为当前登录用户
可以看到search_path(搜索路径)为public
$user和search_path=public结合起来就是优先搜索当前用户的同名的模式
其次再去搜索public模式
有$USER.t01,无public.t01
,这时去select一下t01,返回值因为$USER.t01的数据
准备有$USER.t01表,无public.t01表的实验环境
创建用户user01
test=# create user user01;
CREATE ROLE
创建模式user01,属主设为user01
test=# create schema user01 authorization user01;
CREATE SCHEMA
使用user01用户身份登录到test01库,这一步目的是为了等下创建的表的所有者为user01,使得user01针对指定表有全部的权限
test=# \c - user01
您现在已经连接到数据库 "test",用户 "user01".
在模式user01下创建表t01,并录入数据。t01字段为(id int,name text),录入的数据为(1,‘user01.t01’)
test=> create table t01(id int,name text);
CREATE TABLE
test=> insert into
test=> insert into t01 values(1,'user01.t01');
INSERT 0 1
此时,执行"SELECT * FROM t01",确认返回的是user01.t01表的数据
这个时候应该查看的表示属于user01.t01,因为不存在public.t01,所以返回public.t01是会产生报错
test=> select * from t01;
id | name
----+------------
1 | user01.t01
(1 行记录)
无$USER.t02,有public.t02
这个时候去select t02,返回值应该为public.t02
准备$USER.t02,有public.t02的实验环境
1、创建用户user02
test=# create user user02 password 'kingbase';
CREATE ROLE
2、创建模式user02,属主设为user02
test=# create schema user02 authorization user02;
CREATE SCHEMA
3、以user02用户身份登录到test库,这一步目的是为了等下创建的表的所有者为user02,使得user02针对指定表有全部的权限
test=# \c - user02
您现在已经连接到数据库 "test",用户 "user02".
4、在模式public下创建表t02并录入数据
test=> create table public.t02(id int);
CREATE TABLE
查询t02
这个时候显示出来的数据应该时public.t02的数据
test=> select * from t02;
id
----
(0 行记录)
同时使用元命令也可以看到public模式下存在表t02
有$USER.t03,有public.t03
因为在search_path中优先查询的是与该用户同名的模式,所以查询t03时,返回的应该是user03.t03的数据
实验准备
1、创建用户user03
test=# create user user03 password 'kingbase';
CREATE ROLE
2、创建模式user03,属主设为user03
test=# create schema user03 authorization user03;
CREATE SCHEMA
3、以user03用户身份登录到test库
test=# \c - user03
您现在已经连接到数据库 "test",用户 "user03".
4、在模式user03下创建表t03并录入数据
test=> create table t03(id int,name text);
CREATE TABLE
test=> insert into t03 values(1,'user03.t03');
INSERT 0 1
5、在模式public下创建表t03并录入数据
test=> create table public.t03(id int,name text);
CREATE TABLE
test=> insert INTO public.t03 values(2,'public.t03');
INSERT 0 1
查询t03
查询的数据应是user03.t03的数据
test=> select * from t03;
id | name
----+------------
1 | user03.t03
(1 行记录)
出现与系统重名的表
如,当创建一个sys_catalog的表时,如果要查询它,还是查询的是关于系统的那个表
修改优先级别
这时,我们就需要去修改系统的优先级别
原查询sys_settings
更改系统优先级别
test=> set search_path = public,sys_catalog;
SET
创建模式public下sys_settings
test=> create table sys_settings(id int);
CREATE TABLE
再次查询sys_settings,表示修改优先级别生效
test=> select * from sys_settings;
id
----
(0 行记录)