# CREATE SCHEMA
#### 功能描述
创建模式。
#### 注意事项
- 数据库中拥有CREATE权限的用户可以创建模式。
- 系统管理员在普通用户同名的Schema下创建的对象，其所有者为Schema的同名用户（非系统管理员）。
- 访问命名对象时可以使用模式名作为前缀进行具体访问，如果无模式名前缀，则访问当前模式下的命名对象。创建命名对象时也可用模式名作为前缀进行具体指定。
- CREATE SCHEMA可以包括在新模式中创建对象的子命令，这种子命令和先进行创建模式再执行子命令的方式没有区别。如果使用了AUTHORIZATION子句，则所有创建的对象都将被该用户所拥有。
 
#### 语法格式
- 根据指定模式名称创建模式
  ```
  CREATE SCHEMA schema_name
      [ AUTHORIZATION user_name ] [SET NODE GROUP group_name] [WITH BLOCKCHAIN] [ schema_element [ ... ] ];
  ```
  ![](https://support.huaweicloud.com/distributed-ref-v10-gaussdb/figure/zh-cn_image_0000002764309516.jpg "点击放大")
  
- 根据用户名创建模式
  ```
  CREATE SCHEMA AUTHORIZATION user_name [SET NODE GROUP group_name] [ schema_element [ ... ] ];
  ```
  ![](https://support.huaweicloud.com/distributed-ref-v10-gaussdb/figure/zh-cn_image_0000002793708059.jpg "点击放大")
  

- 创建模式并指定默认字符集和字符序
  ```
  CREATE SCHEMA schema_name [SET NODE GROUP group_name]
      [ [DEFAULT] CHARACTER SET | CHARSET [ = ] default_charset ] [ [DEFAULT] COLLATE [ = ] default_collation ];
  ```
  ![](https://support.huaweicloud.com/distributed-ref-v10-gaussdb/figure/zh-cn_image_0000002793788255.jpg "点击放大")
  
 
#### 参数说明
- **schema_name**
  模式名称。
  取值范围：字符串，要符合[标识符命名规范](https://support.huaweicloud.com/distributed-ref-v10-gaussdb/gaussdb-08-0003.html#ZH-CN_TOPIC_0000002793787739__section14873217506)。
  模式新名称规则如下：
  - 新名称不能和当前数据库里其他的模式重名。
  
  - 新名称不能和当前数据库的初始用户重名。
  
  - 请勿使用"pg_"或"gs_role_"开头或"data_redis"命名新名称。
   
- **AUTHORIZATION user_name**
  指定模式的所有者。当不指定schema_name时（即[根据用户名创建模式]的方式），将user_name作为模式名，此时user_name只能是角色名。
  取值范围：已存在的用户名/角色名。
  
- **SET NODE GROUP group_name**
  设置模式的单节点属性。group_name表示单节点组Node Group名称，仅支持设置系统预定的类型为's'的单节点组Node Group，其名称前缀为"sys_single_group"。
  ![](https://support.huaweicloud.com/distributed-ref-v10-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
  - 在M-Compatibility模式数据库下（即sql_compatibility = 'M'）不支持该语法。
  
  - CREATE SCHEMA语法包含CREATE TABLE子句的复合SQL语句不支持单节点表相关功能，既不支持单节点表创建，也不支持模式设置单节点表属性。
    
- **WITH BLOCKCHAIN**
  指定模式的防篡改属性。
  ![](https://support.huaweicloud.com/distributed-ref-v10-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
  - 将普通模式修改为防篡改模式，需将GUC参数enable_ledger设置为on。该参数默认值为off，级别为SIGHUP。
  
  - 防篡改模式下的行存普通用户表将自动扩展为防篡改用户表。
    
- **schema_element**
  在模式里创建对象的SQL语句。
  当前仅支持CREATE TABLE、CREATE VIEW、CREATE INDEX、CREATE TABLE PARTITION、CREATE SEQUENCE、CREATE TRIGGER以及GRANT子句。
  ![](https://support.huaweicloud.com/distributed-ref-v10-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
  - schema_element所创建的对象都被AUTHORIZATION user_name子句指定的user_name所拥有。
  
  - 如果当前搜索路径内的模式存在同名对象时，需要明确指定引用对象所在的模式。可以通过命令SHOW search_path查看当前搜索路径上的模式。
    
 
- **default_charset**
  指定模式的默认字符集。未指定该选项时，模式的默认字符集为指定的字符序COLLATE的默认字符集。
  取值范围：支持设置的字符集请参见[表1](https://support.huaweicloud.com/distributed-ref-v10-gaussdb/gaussdb-08-0271.html#ZH-CN_TOPIC_0000002764308858__table8163190152)。
  ![](https://support.huaweicloud.com/distributed-ref-v10-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
  仅在MYSQL模式数据库或M-Compatibility模式数据库下（即sql_compatibility = 'MYSQL'或sql_compatibility = 'M'）支持该语法。以上行为是在sql_compatibility = 'MYSQL'时的表现，sql_compatibility = 'M'的行为请参见《M-Compatibility开发指南》中"SQL参考 \> SQL语法 \> SQL语句 \> C \> CREATE SCHEMA"的内容。
  
- **default_collation**
  指定模式的默认字符序。未指定该选项时，模式的默认字符序为指定的字符集CHARSET的默认字符序。
  取值范围：支持设置的字符集请参见[表1](https://support.huaweicloud.com/distributed-ref-v10-gaussdb/gaussdb-08-0271.html#ZH-CN_TOPIC_0000002764308858__table8163190152)。
  ![](https://support.huaweicloud.com/distributed-ref-v10-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
  仅在MYSQL模式数据库或M-Compatibility模式数据库下（即sql_compatibility = 'MYSQL'或sql_compatibility = 'M'）支持该语法。以上行为是在sql_compatibility = 'MYSQL'时的表现，sql_compatibility = 'M'的行为请参见《M-Compatibility开发指南》中"SQL参考 \> SQL语法 \> SQL语句 \> C \> CREATE SCHEMA"的内容。
  
#### 示例
```
--创建一个角色role1。
gaussdb=# CREATE ROLE role1 IDENTIFIED BY '********';
CREATE ROLE
--为用户role1创建一个同名Schema，schema_element子命令创建的表films和winners的拥有者为role1。
gaussdb=# CREATE SCHEMA AUTHORIZATION role1
     CREATE TABLE films (title text, release date, awards text[])    
     CREATE VIEW winners AS SELECT title, release FROM films WHERE awards IS NOT NULL;
CREATE SCHEMA
--创建新角色role2。
gaussdb=# CREATE ROLE role2 IDENTIFIED BY '********';
CREATE ROLE
--根据名称创建schema1并指定所有者role2。
gaussdb=# CREATE SCHEMA schema1 AUTHORIZATION role2;
CREATE SCHEMA
--根据名称创建schema2并显示设置单节点表属性。
gaussdb=# CREATE SCHEMA schema2 SET NODE GROUP sys_single_group1;
CREATE SCHEMA
--修改防篡改属性。
--防篡改属性修改前，需要将GUC参数enable_ledger设置为on，enable_ledger默认为off，需要通过gs_guc进行设置。
gs_guc reload -Z coordinator -Z datanode -N all -I all -c "enable_ledger=on";
--设置完成后，查看enable_ledger状态是否为on。
gaussdb=# SHOW enable_ledger;
 enable_ledger 
---------------
 on
(1 row)
--创建Schema并指定防篡改属性。
gaussdb=# CREATE SCHEMA ledgernsp WITH BLOCKCHAIN;
CREATE SCHEMA
--删除Schema。
gaussdb=# DROP SCHEMA role1 CASCADE;
gaussdb=# DROP SCHEMA schema1 CASCADE;
gaussdb=# DROP SCHEMA schema2 CASCADE;
gaussdb=# DROP SCHEMA ledgernsp CASCADE;
--删除用户。
gaussdb=# DROP USER role1 CASCADE;
gaussdb=# DROP USER role2 CASCADE;
```
#### 相关链接
[ALTER SCHEMA](https://support.huaweicloud.com/distributed-ref-v10-gaussdb/gaussdb-08-0205.html)，[DROP SCHEMA](https://support.huaweicloud.com/distributed-ref-v10-gaussdb/gaussdb-08-0317.html)
