# ALTER SCHEMA
#### 功能描述
修改模式属性。包括：修改模式的名称、所有者以及模式的防篡改属性等。
#### 注意事项
- 只有模式的所有者和被授予了模式ALTER权限的用户，在拥有当前数据库CREATE权限的情况下，才可以执行ALTER SCHEMA命令。三权分立开关关闭时，系统管理员默认拥有此权限。
- 修改模式的所有者，当前用户必须是该模式的所有者或者系统管理员，且该用户是新所有者角色的成员。
- 仅初始用户可以修改除PUBLIC以外的系统模式（如：pg_catalog、sys等）的所有者。修改系统自带模式的名称可能会导致部分功能不可用，甚至影响数据库正常运行，默认情况下不允许修改系统自带模式的名称。出于前向兼容性问题考虑，仅允许当系统在启动或升级过程中或参数allow_system_table_mods为on时可修改系统自带模式的名称。

- 除初始用户外，其他用户无法将模式的所有者修改为运维管理员。
 
#### 语法格式
- 修改模式的防篡改属性
  ```
  ALTER SCHEMA schema_name { WITH | WITHOUT } BLOCKCHAIN;
  ```
  ![](https://support.huaweicloud.com/distributed-ref-v10-gaussdb/figure/zh-cn_image_0000002793788361.png "点击放大")
  

- 修改模式的名称
  ```
  ALTER SCHEMA schema_name 
      RENAME TO new_name;
  ```
  ![](https://support.huaweicloud.com/distributed-ref-v10-gaussdb/figure/zh-cn_image_0000002764469552.png "点击放大")
  
- 修改模式的所有者
  ```
  ALTER SCHEMA schema_name 
      OWNER TO new_owner;
  ```
  ![](https://support.huaweicloud.com/distributed-ref-v10-gaussdb/figure/zh-cn_image_0000002793788363.png "点击放大")
  
 
- 修改模式的默认字符集和字符序
  ```
  ALTER SCHEMA schema_name 
      [ [DEFAULT] CHARACTER SET | CHARSET [ = ] default_charset ] [ [DEFAULT] COLLATE [ = ] default_collation ];
  ```
  ![](https://support.huaweicloud.com/distributed-ref-v10-gaussdb/figure/zh-cn_image_0000002793708167.png "点击放大")
  

- 修改模式的单节点属性
  ```
  ALTER SCHEMA schema_name
      [ SET NODE GROUP group_name | DROP NODE GROUP ];
  ```
  ![](https://support.huaweicloud.com/distributed-ref-v10-gaussdb/figure/zh-cn_image_0000002764309624.png "点击放大")
  
#### 参数说明
- **schema_name**
  现有模式的名称。
  取值范围：已存在的模式名。
  
- **RENAME TO new_name**
  修改模式的名称。new_name表示模式的新名称。
  取值范围：字符串，要符合[标识符命名规范](https://support.huaweicloud.com/distributed-ref-v10-gaussdb/gaussdb-08-0003.html#ZH-CN_TOPIC_0000002793787739__section14873217506)。
  模式新名称规则如下：
  - 新名称不能和当前数据库里其他的模式重名。
  
  - 新名称不能和当前数据库的初始用户重名。
  
  - 请勿使用"pg_"或"gs_role_"开头或"data_redis"命名新名称。
   
- **OWNER TO new_owner**
  修改模式的所有者。new_owner表示模式的新所有者。
  取值范围：已存在的用户名或角色名。
  ![](https://support.huaweicloud.com/distributed-ref-v10-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
  如果非系统管理员需要改变模式的所有者，则该用户还必须是新的所有角色的直接或间接成员，并且该成员必须在此数据库上有CREATE权限。
  
- **{ WITH \| WITHOUT } BLOCKCHAIN**
  修改模式的防篡改属性。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。
  
  - 具有防篡改属性模式下的普通行存表均为防篡改历史表，不包括外表、临时表以及系统表。
  
  - 仅当模式下不包含任何表时，才可以对模式的防篡改属性进行修改或切换。
  
  - 不支持对临时表模式、toast表模式、dbe_perf模式或blockchain模式修改防篡改属性。
    
- **default_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/notice_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语句 \> A \> ALTER SCHEMA"的内容。
  
  - 未指定默认字符序时，模式的默认字符序为指定的字符集的默认字符序。
    
- **default_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/notice_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语句 \> A \> ALTER SCHEMA"的内容。
  
  - 未指定默认字符集时，模式的默认字符集为指定的字符序对应的字符集。
    

- **SET NODE GROUP group_name \| DROP NODE GROUP**
  - SET NODE GROUP group_name：表示设置模式的单节点属性。group_name表示单节点组Node Group名称，仅支持设置系统预定的类型为's'的单节点组Node Group。
  
  - DROP NODE GROUP：表示删除模式的单节点属性。
  
  
  ![](https://support.huaweicloud.com/distributed-ref-v10-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
  在M-Compatibility模式数据库下（即sql_compatibility = 'M'）不支持该语法。
  
 
#### 示例
- 修改模式的防篡改属性
  ```
  --创建模式test_schema1。
  gaussdb=# CREATE SCHEMA test_schema1;
  --修改模式test_schema1为防篡改模式。
  gaussdb=# ALTER SCHEMA test_schema1 WITH BLOCKCHAIN;
  --查询模式信息，防篡改属性为true。
  gaussdb=# \dn+ test_schema1
                               List of schemas
       Name     | Owner | Access privileges | Description | WithBlockChain 
  --------------+-------+-------------------+-------------+----------------
   test_schema1 | omm   |                   |             | t
  (1 row)
  ```
  
- 修改模式名称
  ```
  --将模式test_schema1重命名为test_sch1。
  gaussdb=# ALTER SCHEMA test_schema1 RENAME TO test_sch1;
  --查询模式信息。
  gaussdb=# \dn+ test*
                             List of schemas
     Name    | Owner | Access privileges | Description | WithBlockChain 
  -----------+-------+-------------------+-------------+----------------
   test_sch1 | omm   |                   |             | t
  (1 row)
  ```
  
- 修改模式所有者
  ```
  --创建用户test_user。
  gaussdb=# CREATE ROLE test_user PASSWORD '********';
  --将模式test_sch1的所有者修改为test_user。
  gaussdb=# ALTER SCHEMA test_sch1 OWNER TO test_user;
  --查询模式信息。
  gaussdb=# \dn+  test_sch1;
                               List of schemas
     Name    |   Owner   | Access privileges | Description | WithBlockChain 
  -----------+-----------+-------------------+-------------+----------------
   test_sch1 | test_user |                   |             | t
  (1 row)
  --删除新建的模式和用户。
  gaussdb=# DROP SCHEMA test_sch1;
  gaussdb=# DROP ROLE test_user;
  ```
  
- 修改默认字符集和默认字符序
  ![](https://support.huaweicloud.com/distributed-ref-v10-gaussdb/public_sys-resources/notice_3.0-zh-cn.png)
  除binary字符集和字符序外，当前仅支持指定与数据库编码相同的字符集。
  ```
  --创建并切换至测试数据库。
  gaussdb=# CREATE DATABASE test1 WITH DBCOMPATIBILITY = 'MYSQL' ENCODING = 'UTF8' LC_COLLATE = 'zh_CN.utf8' LC_CTYPE = 'zh_CN.utf8';
  gaussdb=# \c test1
  --创建模式test_sch2。
  test1=# CREATE SCHEMA test_sch2;
  --修改其默认字符集为utf8mb4，默认字符序修改为utf8mb4_bin。
  test1=# ALTER SCHEMA test_sch2 CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;
  --删除新建的模式。
  test1=# DROP SCHEMA test_sch2;
  --切换至默认数据库（根据实际情况修改数据库名），并删除新建的数据库。
  test1=# \c postgres
  gaussdb=# DROP DATABASE test1;
  ```
  

- 修改模式的单节点属性。
  ```
  --创建模式test_schema1。
  gaussdb=# CREATE SCHEMA test_schema1;
  --修改设置模式test_schema1单节点属性。
  gaussdb=# ALTER SCHEMA test_schema1 SET NODE GROUP sys_single_group1;
  --查询模式test_schema1单节点属性,pg_namespace系统表的nspgroupoid记录单节点属性对应node group的oid。
  gaussdb=# SELECT * FROM pg_namespace WHERE nspname='test_schema1';
     nspname    | nspowner | nsptimeline | nspacl | in_redistribution | nspblockchain | nspcollation | nspgroupoid 
  --------------+----------+-------------+--------+-------------------+---------------+--------------+-------------
   test_schema1 |       10 |           0 |        | n                 | f             |              |       16389
  (1 row)
  --删除模式test_schema1单节点属性。
  gaussdb=# ALTER SCHEMA test_schema1 DROP NODE GROUP;
  --查询模式test_schema1单节点属性。
  gaussdb=# SELECT * FROM pg_namespace WHERE nspname='test_schema1';
     nspname    | nspowner | nsptimeline | nspacl | in_redistribution | nspblockchain | nspcollation | nspgroupoid 
  --------------+----------+-------------+--------+-------------------+---------------+--------------+-------------
   test_schema1 |       10 |           0 |        | n                 | f             |              |            
  (1 row)
  ```
  
 
#### 相关链接
[CREATE SCHEMA](https://support.huaweicloud.com/distributed-ref-v10-gaussdb/gaussdb-08-0266.html)，[DROP SCHEMA](https://support.huaweicloud.com/distributed-ref-v10-gaussdb/gaussdb-08-0317.html)
