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

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 行记录)
相关推荐
夜泉_ly2 小时前
MySQL -安装与初识
数据库·mysql
qq_529835353 小时前
对计算机中缓存的理解和使用Redis作为缓存
数据库·redis·缓存
月光水岸New5 小时前
Ubuntu 中建的mysql数据库使用Navicat for MySQL连接不上
数据库·mysql·ubuntu
狄加山6755 小时前
数据库基础1
数据库
我爱松子鱼5 小时前
mysql之规则优化器RBO
数据库·mysql
chengooooooo6 小时前
苍穹外卖day8 地址上传 用户下单 订单支付
java·服务器·数据库
Rverdoser7 小时前
【SQL】多表查询案例
数据库·sql
Galeoto7 小时前
how to export a table in sqlite, and import into another
数据库·sqlite
人间打气筒(Ada)7 小时前
MySQL主从架构
服务器·数据库·mysql
leegong231117 小时前
学习PostgreSQL专家认证
数据库·学习·postgresql