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

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

- 修改模式的名称。
  ```
  ALTER SCHEMA schema_name 
      RENAME TO new_name;
  ```
  ![](https://support.huaweicloud.com/distributed-devg-v8-gaussdb/figure/zh-cn_image_0000002558216961.png "点击放大")
  
- 修改模式的所有者。
  ```
  ALTER SCHEMA schema_name 
      OWNER TO new_owner;
  ```
  ![](https://support.huaweicloud.com/distributed-devg-v8-gaussdb/figure/zh-cn_image_0000002558216959.png "点击放大")
  
 
- 修改模式的默认字符集和字符序。
  ```
  ALTER SCHEMA schema_name 
      [ [DEFAULT] CHARACTER SET | CHARSET [ = ] default_charset ] [ [DEFAULT] COLLATE [ = ] default_collation ];
  ```
  ![](https://support.huaweicloud.com/distributed-devg-v8-gaussdb/figure/zh-cn_image_0000002558056995.png "点击放大")
  
#### 参数说明
- **schema_name**
  现有模式的名称。
  取值范围：已存在的模式名。
  
- **RENAME TO new_name**
  修改模式的名称。
  new_name：模式的新名称。
  ![](https://support.huaweicloud.com/distributed-devg-v8-gaussdb/public_sys-resources/notice_3.0-zh-cn.png)
  - 模式名不能和当前数据库里其他的模式重名。
  
  - 模式名不能和当前数据库的初始用户重名。
  
  - 模式的名称不可以"pg_"开头。
  
  - 模式的名称不可以"gs_role_"开头。
   
  取值范围：字符串，要符合[标识符命名规范](https://support.huaweicloud.com/distributed-devg-v8-gaussdb/gaussdb-12-0322.html#ZH-CN_TOPIC_0000002559105775__zh-cn_topic_0000002558056023_section14873217506)。
  
- **OWNER TO new_owner**
  修改模式的所有者。非系统管理员要改变模式的所有者，该用户还必须是新的所有角色的直接或间接成员， 并且该成员必须在此数据库上有CREATE权限。
  new_owner：模式的新所有者。
  取值范围：已存在的用户名/角色名。
  
- **{ WITH \| WITHOUT } BLOCKCHAIN**
  修改模式的防篡改属性，使用WITH选项为防篡改模式。具有防篡改属性模式下的普通行存表均为防篡改历史表，不包括外表，临时表，系统表。当该模式下不包含任何表时才可修改防篡改属性。另外，不支持临时表模式、toast表模式、dbe_perf模式、blockchain模式修改防篡改属性。只有模式中不包含任何表的情况下，才能使用该语法在普通模式和防篡改模式中互转。
  ![](https://support.huaweicloud.com/distributed-devg-v8-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
  修改普通模式为防篡改模式，需设置GUC参数enable_ledger为on，该参数默认值为off，级别为SIGHUP。
  
- **default_charset**
  修改模式的默认字符集。单独指定时会将模式的默认字符序设置为指定的字符集的默认字符序。
  仅在MYSQL模式数据库下（即sql_compatibility = 'MYSQL'）支持该语法。支持字符集参见[表1](https://support.huaweicloud.com/distributed-devg-v8-gaussdb/gaussdb-12-0567.html#ZH-CN_TOPIC_0000002527826214__zh-cn_topic_0000002527056482_table8163190152)。
  
- **default_collate**
  修改模式的默认字符序。单独指定时会将模式的默认字符集设置为指定的字符序对应的字符集。
  仅在MYSQL模式数据库下（即sql_compatibility = 'MYSQL'）支持该语法。支持字符序参见[表1](https://support.huaweicloud.com/distributed-devg-v8-gaussdb/gaussdb-12-0567.html#ZH-CN_TOPIC_0000002527826214__zh-cn_topic_0000002527056482_table8163190152)。
  
 
#### 示例
- 修改模式的防篡改属性。
  修改普通模式为防篡改模式，需设置GUC参数enable_ledger，用于控制是否启用账本数据库功能。参数使用请联系管理员处理。
  ```
  --创建模式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;
  ```
  
- 修改默认字符集和字符序。 仅在MYSQL模式数据库下（即sql_compatibility = 'MYSQL'）支持该语法。
  除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;
  ```
  
 
#### 相关链接
[CREATE SCHEMA](https://support.huaweicloud.com/distributed-devg-v8-gaussdb/gaussdb-12-0562.html#ZH-CN_TOPIC_0000002558946021)，[DROP SCHEMA](https://support.huaweicloud.com/distributed-devg-v8-gaussdb/gaussdb-12-0612.html#ZH-CN_TOPIC_0000002559105937)
