
# 模式（Schema）
#### 简介
模式（Schema）是数据库的对象之一，用于组织数据库中的表、视图、索引、函数和操作符等对象，其作用如下：
- 逻辑隔离：将数据库对象组织成易于管理的逻辑组，不同的模式可以包含同名的对象而不冲突。
- 权限控制：通过模式可以更细粒度地控制用户对数据库的访问权限。可以在模式级别授予或撤销权限，确保数据的安全性和隔离性。
- 便于管理：模式使得数据库对象管理更加方便灵活，特别是在多应用、多用户的环境中。
 
#### 创建和管理模式
如下仅介绍一些常用的语法，详情见[CREATE SCHEMA](https://support.huaweicloud.com/distributed-devg-v8-gaussdb/gaussdb-12-0562.html#ZH-CN_TOPIC_0000002558946021)、[ALTER SCHEMA](https://support.huaweicloud.com/distributed-devg-v8-gaussdb/gaussdb-12-0503.html#ZH-CN_TOPIC_0000002559105881)、[DROP SCHEMA](https://support.huaweicloud.com/distributed-devg-v8-gaussdb/gaussdb-12-0612.html#ZH-CN_TOPIC_0000002559105937)。
- 创建Schema
  ```
  gaussdb=# CREATE SCHEMA sch1 ;
  CREATE SCHEMA
  --查看Schema信息。
  gaussdb=# \dn sch1
  List of schemas
   Name | Owner 
  ------+-------
   sch1 | omm
  (1 row)
  ```
  
- 修改Schema
  ```
  --前置操作，创建用户。
  gaussdb=# CREATE USER u1 PASSWORD '********';
  CREATE ROLE
  --修改模式的名称。
  gaussdb=# ALTER SCHEMA sch1 RENAME TO sch2;
  ALTER SCHEMA
  --修改模式的拥有者。
  gaussdb=# ALTER SCHEMA sch2 OWNER TO u1;
  ALTER SCHEMA
  --查看Schema信息。
  gaussdb=# \dn sch*
  List of schemas
   Name | Owner 
  ------+-------
   sch2 | u1
  (1 row)
  ```
  
- 删除Schema
  ```
  gaussdb=# DROP SCHEMA sch2;
  DROP SCHEMA
  --删除用户。
  gaussdb=# DROP USER u1;
  DROP ROLE
  ```
  
 
#### 搜索路径
搜索路径用于确定在解析数据库对象名称时，数据库将按照什么顺序去对应的模式下查找。搜索路径的设置可以影响SQL查询的解析和执行。当用户使用一个对象（表、视图、索引、函数等）而没有指定Schema时，数据库会按照搜索路径中定义的顺序依次查找，直到找到该对象时结束。
- 查询搜索路径。
  如下示例中查询结果：在没有指定模式名的情况下，数据库在查找对象时首先在与用户名同名的模式下查找，然后再去public模式下查找。
  ```
  --查询当前搜索路径。
  gaussdb=# SHOW search_path;
    search_path   
  ----------------
   "$user",public
  (1 row)
  ```
  
- 设置搜索路径。
  - 搜索路径的设置只在当前会话中生效，不会影响到其他会话。
  
  - 创建对象时，如果没有指定Schema，对象将默认创建在搜索路径中第一个Schema中。
  
  
  ```
  --创建模式。
  gaussdb=# CREATE SCHEMA sch1;
  CREATE SCHEMA
  gaussdb=# CREATE SCHEMA sch2;
  CREATE SCHEMA
  --分别在两个模式下创建名称相同的表并插入数据。
  gaussdb=# CREATE TABLE sch1.tb_test(c1 int);
  CREATE TABLE
  gaussdb=# INSERT INTO sch1.tb_test VALUES (1);
  INSERT 0 1
  gaussdb=# CREATE TABLE sch2.tb_test(c1 int);
  CREATE TABLE
  gaussdb=# INSERT INTO sch2.tb_test VALUES (2);
  INSERT 0 1
  --设置搜索路径sch1顺序在前查看表数据。
  gaussdb=# SET search_path = sch1,sch2,public;
  SET
  gaussdb=# SELECT * FROM tb_test;
   c1 
  ----
    1
  (1 row)
  --设置搜索路径sch2顺序在前查看表数据。
  gaussdb=# SET search_path = sch2,sch1,public;
  SET
  gaussdb=# SELECT * FROM tb_test;
   c1 
  ----
    2
  (1 row)
  --重置search_path并删除模式和表。
  gaussdb=# RESET search_path;
  RESET
  gaussdb=# DROP TABLE sch1.tb_test;
  DROP TABLE
  gaussdb=# DROP TABLE sch2.tb_test;
  DROP TABLE
  gaussdb=# DROP SCHEMA sch1;
  DROP SCHEMA
  gaussdb=# DROP SCHEMA sch2;
  DROP SCHEMA
  ```
  
 
