
# CREATE SCHEMA
#### 功能描述
创建Schema。
Schema又称作模式，从逻辑上组织一个数据库中的对象和数据。通过管理Schema，允许多个用户使用同一数据库而不相互干扰，同时便于将第三方应用添加到相应的Schema下而不引起冲突。
Schema的核心作用是：
- **逻辑隔离**：实现数据、功能、租户的隔离。
- **权限控制**：提供细粒度的安全边界。
- **组织管理**：使数据库结构清晰可维护。
- **命名空间**：避免对象命名冲突。
相同的数据库对象名称可以应用在同一数据库的不同Schema中，而没有冲突。例如，a_schema和b_schema都可以包含名为mytable的表。具有所需权限的用户可以访问数据库的多个Schema中的对象。
在当前数据库中创建用户时，系统会在当前数据库中为新用户创建一个同名Schema，例如创建用户user1，默认会创建一个名称为user1的Schema。
#### 注意事项
- 只要用户对当前数据库有CREATE权限，就可以创建模式。
- 系统管理员在普通用户同名Schema下创建的对象，所有者为Schema的同名用户（非系统管理员）。
- 访问命名对象时可以使用模式名作为前缀进行访问，如果无模式名前缀，则访问当前模式下的命名对象。创建命名对象时也可用模式名作为前缀修饰。
- CREATE SCHEMA可以包括在新模式中创建对象的子命令，这些子命令和那些在创建完模式后发出的命令没有任何区别。如果使用了AUTHORIZATION子句，则所有创建的对象都将被该用户所拥有。
 
#### 语法格式
- 根据指定的名字创建模式：
  ```
  CREATE SCHEMA schema_name 
      [ AUTHORIZATION user_name ] [ WITH PERM SPACE 'space_limit'] [ schema_element [ ... ] ];
  CREATE SCHEMA IF NOT EXISTS schema_name 
      [ AUTHORIZATION user_name ] [ WITH PERM SPACE 'space_limit'] ;
  ```
  
- 根据用户名创建模式：
  ```
  CREATE SCHEMA AUTHORIZATION user_name [ WITH PERM SPACE 'space_limit'] [ schema_element [ ... ] ];
  CREATE SCHEMA IF NOT EXISTS AUTHORIZATION user_name [ WITH PERM SPACE 'space_limit'] ;
  ```
  
 
#### 参数说明
表1CREATE SCHEMA参数说明 
| 参数                            | 描述                                                                                                                                                                                                                                                                                                                                 | 取值范围                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
|:---|:---|:---|
| schema_name                   | 模式名称。                                                                                                                                                                                                                                                                                                                              | 字符串，要符合标识符的命名规范。参见[标识符命名规范](https://support.huaweicloud.com/sqlreference-911-dws/dws_06_0007.html#ZH-CN_TOPIC_0000002202094021__section1475018612353)。 须知： - 模式名不能和当前数据库里其他的模式重名。  - 模式的名字不可以"pg_"开头。   |
| AUTHORIZATION user_name       | 指定模式的所有者。当不指定schema_name时，把user_name当作模式名，此时user_name只能是角色名。                                                                                                                                                                                                                                                                       | 取值范围：已存在的用户名/角色名。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |
| WITH PERM SPACE 'space_limit' | 指定模式的永久表存储空间上限。当不指定space_limit时，则不限制。                                                                                                                                                                                                                                                                                              | 取值范围：字符串格式为正整数+单位，单位当前支持K/M/G/T/P。解析后的数值以K为单位，且范围不能够超过64比特表示的有符号整数，即1KB\~9007199254740991KB。 **示例** 请参见[示例：创建一个设置了永久存储空间的Schema]。                                                                                                                                                                                                                                                                      |
| schema_element                | 在模式里创建对象的SQL语句。目前仅支持CREATE TABLE、CREATE VIEW、CREATE INDEX、CREATE PARTITION、GRANT子句。 子命令所创建的对象都被AUTHORIZATION子句指定的用户所拥有。                                                                                                                                          | -                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |
| IF NOT EXISTS                 | 指定IF NOT EXISTS时，若不存在同名SCHEMA，则可以成功创建SCHEMA。若已存在同名SCHEMA，创建时不会报错，仅会提示该SCHEMA已存在，且不执行任何操作。当使用该参数时，不能包括Schema_element子命令。 **IF NOT EXISTS参数仅9.1.0及以上版本支持**。 如果当前搜索路径上的模式中存在同名对象时，需要明确指定引用对象所在的模式。可以通过命令SHOW SEARCH_PATH来查看当前搜索路径上的模式。 | -                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |
   
#### 示例：基础示例
创建一个角色role1：
```
DROP ROLE IF EXISTS role1;
CREATE ROLE role1 IDENTIFIED BY '{password}';
```
为用户role1创建一个同名schema，子命令创建的表films和winners的拥有者为role1：
```
DROP TABLE IF EXISTS role1.films;
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;
```
 #### 示例：创建一个设置了永久存储空间的Schema
以下模拟一个示例，创建一个名为testsche的schema，并设置永久存储空间为10MB，当数据超过该设置值，系统报错。
除了通过SQL语句设置永久存储空间之外，您也可以通过控制台界面进行Schema永久存储空间设置，详情参见[配置DWS数据库的Schema存储空间](https://support.huaweicloud.com/mgtg-dws/dws_01_72366.html)章节。
1. 创建一个名为testsche的schema，并设置永久存储空间为10MB。 
   ```
   DROP SCHEMA IF EXISTS testsche;
   CREATE SCHEMA testsche  WITH PERM SPACE '10M';
   ```
   
   
2. 使用系统表[PG_NAMESPACE](https://support.huaweicloud.com/devg-dws/dws_04_0600.html)查询Schema的存储空间大小，其中permspace为永久存储空间限额，usedspace为已使用永久存储空间大小。
   
   ```
   SELECT permspace,usedspace FROM PG_NAMESPACE WHERE nspname = 'testsche';
   ```
   ![](https://support.huaweicloud.com/sqlreference-911-dws/figure/zh-cn_image_0000002534524658.png "点击放大")
   
   
3. 创建一张测试表，并导入数据。 
   ```
   DROP TABLE IF EXISTS testsche.src;
   DROP TABLE IF EXISTS testsche.t1;
   CREATE TABLE testsche.src AS SELECT 1;
   CREATE TABLE testsche.t1(a int, b numeric(15,2)) WITH(orientation=column);
   INSERT INTO testsche.t1 SELECT generate_series(1,20000000) % 1000,generate_series(1,20000000) FROM testsche.src;
   ```
   回显报错信息，超过该schema的永久存储空间大小。
   ![](https://support.huaweicloud.com/sqlreference-911-dws/figure/zh-cn_image_0000002565444465.png "点击放大")
   
   
4. 调大Schema的永久存储空间大小为10GB，再次导入，显示成功。 
   ```
   ALTER SCHEMA testsche WITH PERM SPACE '10G';
   INSERT INTO testsche.t1 SELECT generate_series(1,20000000) % 1000,generate_series(1,20000000) FROM testsche.src;
   ```
   ![](https://support.huaweicloud.com/sqlreference-911-dws/figure/zh-cn_image_0000002534528002.png "点击放大")
   
   
5. 查看已用空间。 
   ```
   SELECT permspace,usedspace FROM PG_NAMESPACE WHERE nspname = 'testsche';
   ```
   ![](https://support.huaweicloud.com/sqlreference-911-dws/figure/zh-cn_image_0000002565527825.png "点击放大")
   
   
 
#### 相关链接
[ALTER SCHEMA](https://support.huaweicloud.com/sqlreference-911-dws/dws_06_0136.html)，[DROP SCHEMA](https://support.huaweicloud.com/sqlreference-911-dws/dws_06_0204.html)
[创建和管理schema](https://support.huaweicloud.com/devg-dws/dws_04_0036.html)
[配置DWS数据库的Schema存储空间](https://support.huaweicloud.com/mgtg-dws/dws_01_72366.html)
