6-数据库、表空间、模式

时间:2024-11-19 15:22:54

KES存储结构图

其中包含这KES中表空间、数据库、模式、模式对象之间的关系

由下图可以知道一下几个知识点

1、在模式下的对象我们称之为模式对象

2、而表空间实际上是存在我们物理机上的一个位置,系统表空间存在与/data/global,默认表空间存在/data/base;/data目录取决于安装KES时自定义的数据存放目录;如下,我们在/data/base下是存放着缺省表空间,而每一个编号就代表着每一个对象的id编号

image-20241031194542009

3、用户要想访问数据库中的对象,先要依附于一个角色,接着在进行授权或者是成为该对象的owner

737357e8c1c85aed8764cde47754e36

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 行记录)

image-20241105131406106

创建表空间的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

此时,在表空间的内容已经发生了变化,

image-20241105131940925

在数据库视图中查看t05对应表空间的物理路径

test=# select sys_relation_filepath('t01');
             sys_relation_filepath             
-----------------------------------------------
 sys_tblspc/16387/SYS_12_202211151/12259/16388
(1 行记录)

image-20241105132214728

修改表空间的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+

image-20241105135702950

3、使用数据字典查看表空间信息

test=# select oid,spcname from sys_tablespace;

image-20241105135910870

4、查看数据库的默认表空间信息

test=# \l+

image-20241105160616113

注意:

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  | 

image-20241105165755958

新建表空间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

image-20241105165928789

改------修改表空间

修改表空间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 行记录)

image-20241105170357698

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 行记录)

image-20241105173239584

2、查看test数据库中t01表当前所在的表空间

test=# \d+ t01
                         数据表 "public.t01"
 栏位 |  类型   | 校对规则 | 可空的 | 预设 | 存储  | 统计目标 | 描述 
------+---------+----------+--------+------+-------+----------+------
 id   | integer |          |        |      | plain |          | 
表空间:"tbs10"
访问方法 heap

image-20241105173110814

3、查看新表空间的名称、属主等信息

test=# \db+ tbs10
                        表空间列表
 名称  | 拥有者 | 所在地 | 存取权限 | 选项 | 大小  | 描述 
-------+--------+--------+----------+------+-------+------
 tbs10 | user01 | /dir01 |          |      | 13 MB | 
(1 行记录)

image-20241105173827698

删-----删除表空间

删除表空间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 行记录)

image-20241105174204221

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 行记录)

image-20241105174509276

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+

image-20241105193835644

2、解除数据库与tbs10的关联

test=# alter database db01 set tablespace sys_default;
ALTER DATABASE

image-20241105194046283

再次尝试删除表空间tbs10

2、删除表空间tbs10成功

test=# drop tablespace tbs10;
DROP TABLESPACE

再次查看表空间,会发现

image-20241105194351607

实验2:数据库的增删查改

查-----列出集簇中现有数据库的清单

test=# \l 

image-20241105200218871

各种数据库解释:

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+

image-20241106150754835

注:

模式 作用
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 行记录)

image-20241106152952666

改-----修改模式

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 行记录)

image-20241106153205918

删-----删除模式

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

image-20241106153431044

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 行记录)

image-20241106183816771

$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

image-20241106194523420

有$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

image-20241106204003697

更改系统优先级别

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 行记录)