# ALTER DATABASE
#### 功能描述
修改数据库的属性，包括：数据库名称、所有者、连接数限制以及对象隔离属性等。
#### 注意事项
- 仅数据库的所有者或者被授予了数据库ALTER权限的用户可以执行ALTER DATABASE命令，系统管理员默认拥有此权限。针对所要修改属性的不同，存在以下权限约束：
  - 修改数据库名称：必须拥有CREATEDB权限。
  
  - 修改数据库所有者：当前用户必须是该数据库的所有者或者系统管理员，必须拥有CREATEDB权限，且该用户是新所有者角色的成员。
  
  - 修改数据库默认表空间：该用户必须拥有新表空间的CREATE权限。进行该操作会从物理上将一个数据库原来缺省表空间上的表和索引移至新的表空间。注意不在缺省表空间的表和索引不受此影响。
   
- 不能直接对当前使用的数据库进行重命名，如果需要重新命名，请连接至其他数据库之后对原数据库进行重命名。
- 不允许将其他模式重命名为templatem，不允许将templatem模式重命名为其他名称，不允许将templatea模板重命名为其他名称。
 
#### 语法格式
- 修改数据库名称。
  ```
  ALTER DATABASE database_name 
      RENAME TO new_name;
  ```
  ![](https://support.huaweicloud.com/distributed-ref-v10-gaussdb/figure/zh-cn_image_0000002793788339.png "点击放大")
  
- 修改数据库所有者。
  ```
  ALTER DATABASE database_name 
      OWNER TO new_owner;
  ```
  ![](https://support.huaweicloud.com/distributed-ref-v10-gaussdb/figure/zh-cn_image_0000002793708143.png "点击放大")
  
- 修改数据库的最大连接数。
  ```
  ALTER DATABASE database_name 
      [ WITH ] CONNECTION LIMIT connlimit;
  ```
  ![](https://support.huaweicloud.com/distributed-ref-v10-gaussdb/figure/zh-cn_image_0000002764469530.png "点击放大")
  
- 修改数据库默认表空间。
  ```
  ALTER DATABASE database_name
      SET TABLESPACE new_tablespace;
  ```
  ![](https://support.huaweicloud.com/distributed-ref-v10-gaussdb/figure/zh-cn_image_0000002793708145.png "点击放大")
  ![](https://support.huaweicloud.com/distributed-ref-v10-gaussdb/public_sys-resources/notice_3.0-zh-cn.png)
  如果数据库中的某些表或对象已经创建在new_tablespace下，则无法将该数据库的默认表空间修改为new_tablespace，执行会报错。
  
 
- 修改数据库指定会话参数值。当前版本不支持设置数据库级别参数。
  ```
  ALTER DATABASE database_name 
      SET configuration_parameter { { TO | = } { value | DEFAULT } | FROM CURRENT };
  ```
  ![](https://support.huaweicloud.com/distributed-ref-v10-gaussdb/figure/zh-cn_image_0000002764469532.png "点击放大")
  
- 数据库配置参数重置。当前版本不支持设置数据库级别参数。
  ```
  ALTER DATABASE database_name RESET 
      { configuration_parameter | ALL };
  ```
  ![](https://support.huaweicloud.com/distributed-ref-v10-gaussdb/figure/zh-cn_image_0000002793788341.png "点击放大")
  
- 修改数据库对象隔离属性。修改数据库的对象隔离属性时须连接至该数据库，否则无法更改。
  ```
  ALTER DATABASE database_name [ WITH ] { ENABLE | DISABLE } PRIVATE OBJECT;
  ```
  ![](https://support.huaweicloud.com/distributed-ref-v10-gaussdb/figure/zh-cn_image_0000002764309604.png "点击放大")
  ![](https://support.huaweicloud.com/distributed-ref-v10-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
  新创建的数据库，对象隔离属性默认关闭。当开启该属性，数据库会为系统表PG_CLASS、PG_ATTRIBUTE、PG_PROC、PG_NAMESPACE、PGXC_SLICE、PG_DATABASE和PG_PARTITION自动添加行级访问控制策略，普通用户仅支持查看系统表中有权访问的对象（表、函数、视图、字段等）；管理员用户不受该属性的影响，当开启该属性后，管理员仍可查看全量的数据库对象。
  

- 修改数据库时区。
  ```
  ALTER DATABASE database_name SET DBTIMEZONE = time_zone;
  ```
  ![](https://support.huaweicloud.com/distributed-ref-v10-gaussdb/figure/zh-cn_image_0000002764309600.png "点击放大")
  

- 为创建hashbucket表绑定node group，确定bucketmap映射关系。
  ```
  ALTER DATABASE database_name
      TO GROUP group_name ;
  ```
  ![](https://support.huaweicloud.com/distributed-ref-v10-gaussdb/figure/zh-cn_image_0000002764469534.png "点击放大")
  
- 将指定的bucket从一个datanode迁移至另一个datanode。
  ```
  ALTER DATABASE database_name
      MOVE BUCKETS(bucketlist) FROM datanode_name TO datanode_name;
  ```
  ![](https://support.huaweicloud.com/distributed-ref-v10-gaussdb/figure/zh-cn_image_0000002793708147.png "点击放大")
  ![](https://support.huaweicloud.com/distributed-ref-v10-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
  该语句仅支持在hashbucket扩容期间调用，是hashbucket库级重分布命令，例如：
  ```
  ALTER DATABASE testdb MOVE BUCKETS (0，1，2，3) FROM datanode1 TO datanode3;
  ```
  

- 开启或者关闭数据库ILM特性。
  ```
  ALTER DATABASE set ilm = { on | off };
  ```
  ![](https://support.huaweicloud.com/distributed-ref-v10-gaussdb/figure/zh-cn_image_0000002793788343.png)
  
#### 参数说明
- **database_name**
  需要修改属性的数据库名称。
  取值范围：字符串，要符合[标识符命名规范](https://support.huaweicloud.com/distributed-ref-v10-gaussdb/gaussdb-08-0003.html#ZH-CN_TOPIC_0000002793787739__section14873217506)。
  
- **new_name**
  数据库的新名称。
  取值范围：字符串，要符合[标识符命名规范](https://support.huaweicloud.com/distributed-ref-v10-gaussdb/gaussdb-08-0003.html#ZH-CN_TOPIC_0000002793787739__section14873217506)且最大长度不超过63个字符。
  - 当数据库名称超过63个字符时，数据库会截断并保留前63个字符当作数据库名称。
  
  - 当数据库名称中包含大写字母时，数据库会自动转换为小写字母。
  
  - 如果需要创建包含大写字母的数据库名称，则需要使用双引号进行包裹。
   
- **new_owner**
  数据库的新所有者。
  取值范围：字符串，有效的用户名。
  
- **connlimit**
  数据库可以接收的最大并发连接数（管理员用户连接除外）。
  取值范围：\[-1, 2^31^-1\]的整数。默认值为-1，表示不限制数据库的最大并发连接数，建议设置为1\~50的整数。
  
- **new_tablespace**
  数据库新的默认表空间，该表空间为数据库中已经存在的表空间。
  取值范围：字符串，有效的表空间名。默认表空间为pg_default。
  ![](https://support.huaweicloud.com/distributed-ref-v10-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
  修改数据库默认表空间，会将旧表空间中的所有表和索引转移到迁移至新表空间中，该操作不会影响其他非默认表空间中的表和索引。
  
- **time_zone**
  设置数据库的时区值，需要拥有数据库的操作权限。
  取值范围：字符串，当前支持设置的时区值为：
  - 系统支持的时区和其相应的缩写。
  
  - -15:59\~+15:00。
  
  
  ![](https://support.huaweicloud.com/distributed-ref-v10-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
  该参数仅在连接数据库为ORA兼容模式数据库且已设置a_format_version='10c'以及a_format_dev_version='s2'时支持指定。
  

- **group_name**
  hashbucket表绑定的node group名称，普通用户只支持绑定到installation node group上且不支持修改。
  
 
- **bucketlist**
  重分布涉及的bucketlist
  取值范围：字符串，每个bucket的取值范围为\[0, 1023\]。
  
- **datanode_name**
  迁移bucket操作涉及的节点名称。
  取值范围：字符串，要符合[标识符命名规范](https://support.huaweicloud.com/distributed-ref-v10-gaussdb/gaussdb-08-0003.html#ZH-CN_TOPIC_0000002793787739__section14873217506)。
  
- **configuration_parameter**
  需要修改属性的数据库会话参数。
  ![](https://support.huaweicloud.com/distributed-ref-v10-gaussdb/public_sys-resources/notice_3.0-zh-cn.png)
  当前版本不支持设置数据库级别参数。
  - **value**
    将指定的数据库会话参数值设置为给定的值。
    取值范围：字符串。
    - DEFAULT：在新的会话中使用系统的缺省设置。
    
    - OFF：关闭设置。
    
    - RESET：在新的会话中使用系统的缺省设置。
    
    - 用户指定的值：需要满足修改参数的取值限制。
     
  
  - **FROM CURRENT**
    取当前会话中的值设置为configuration_parameter的值。
    
   
- **RESET configuration_parameter**
  重置指定的数据库会话参数值。
  ![](https://support.huaweicloud.com/distributed-ref-v10-gaussdb/public_sys-resources/notice_3.0-zh-cn.png)
  当前版本不支持重置数据库级别参数。
  
- **RESET ALL**
  重置全部的数据库会话参数值。
  ![](https://support.huaweicloud.com/distributed-ref-v10-gaussdb/public_sys-resources/notice_3.0-zh-cn.png)
  当前版本不支持重置数据库级别参数。
  
#### 示例
- 修改数据库名称
  ```
  --创建数据库testdb。
  gaussdb=# CREATE DATABASE testdb;
  --将testdb重命名为test_db1。
  gaussdb=# ALTER DATABASE testdb RENAME TO test_db1;
  ```
  
- 修改数据库最大连接数
  ```
  --修改test_db1最大连接数为100。
  gaussdb=# ALTER DATABASE test_db1 WITH CONNECTION LIMIT 100;
  --查看test_db1信息。
  gaussdb=# SELECT datname,datconnlimit FROM pg_database WHERE datname = 'test_db1';
   datname  | datconnlimit 
  ----------+--------------
   test_db1 |          100
  (1 row)
  ```
  
- 修改数据库所有者
  ```
  --创建用户scott。
  gaussdb=# CREATE USER scott PASSWORD '********';
  --将test_db1的所有者修改为scott。
  gaussdb=# ALTER DATABASE test_db1 OWNER TO scott;
  --查看test_db1信息。
  gaussdb=# SELECT t1.datname, t2.usename 
            FROM pg_database t1, gs_user t2 
            WHERE t1.datname='test_db1' AND t1.datdba=t2.usesysid;
   datname  | usename 
  ----------+---------
   test_db1 | scott
  (1 row)
  ```
  
- 修改数据库默认表空间
  ```
  --创建表空间。
  gaussdb=# CREATE TABLESPACE tbs_data1 RELATIVE LOCATION 'tablespace1/tbs_data1';
  --修改test_db1默认表空间。
  gaussdb=# ALTER DATABASE test_db1 SET TABLESPACE tbs_data1;
  --查看test_db1信息。
  gaussdb=# SELECT t1.datname AS database, t2.spcname AS tablespace 
            FROM pg_database t1, pg_tablespace t2 
            WHERE t1.dattablespace = t2.oid AND 
                  t1.datname = 'test_db1';
   database | tablespace 
  ----------+------------
   test_db1 | tbs_data1
  (1 row)
  ```
  
- 修改数据库时区
  前提条件：当前连接数据库为ORA兼容模式数据库且已设置a_format_version='10c'以及a_format_dev_version='s2'。
  ```
  --创建ORA兼容性数据库，默认为PRC时区。
  gaussdb=# CREATE DATABASE testdb2 DBCOMPATIBILITY = 'ORA';
  --查看数据库testdb2时区。
  gaussdb=# SELECT datname,datcompatibility,dattimezone FROM pg_database WHERE datname = 'testdb2';
   datname | datcompatibility | dattimezone 
  ---------+------------------+-------------
   testdb2 | ORA              | PRC
  (1 row)
  --切换至数据库testdb2，修改数据库时区为'+08:00'。
  gaussdb=# \c testdb2
  testdb2=# SET a_format_version='10c';
  testdb2=# SET a_format_dev_version='s2';
  testdb2=# ALTER DATABASE testdb2 SET DBTIMEZONE = '+08:00';
  --查看数据库时区。
  testdb2=# SELECT datname,datcompatibility,dattimezone FROM pg_database WHERE datname = 'testdb2';
   datname | datcompatibility | dattimezone 
  ---------+------------------+-------------
   testdb2 | ORA              | +08:00
  (1 row)
  ```
  
- 修改数据库对象隔离属性
  ```
  --创建用户jack。
  gaussdb=# CREATE USER jack PASSWORD '********';
  --在test_db1创建表test_tbl1。
  gaussdb=# \c test_db1
  test_db1=# CREATE TABLE test_tbl1(c1 int,c2 int);
  --切换至jack用户查看pg_tables。
  test_db1=# SET ROLE jack PASSWORD '********';
  test_db1=> SELECT tablename FROM pg_tables WHERE tablename = 'test_tbl1';
   tablename 
  -----------
   test_tbl1
  (1 row)
  --修改对象隔离属性。
  test_db1=> SET ROLE scott PASSWORD '********';              
  test_db1=> ALTER DATABASE test_db1 ENABLE PRIVATE OBJECT;
  --切换至jack用户查看pg_tables。
  test_db1=> SET ROLE jack PASSWORD '********';
  --由于隔离属性的原因，该查询只能查出0条数据。
  test_db1=> SELECT tablename FROM pg_tables WHERE tablename = 'test_tbl1';
   tablename 
  -----------
  (0 rows)
  --切换至默认用户删除。
  test_db1=> RESET ROLE;
  test_db1=# DROP TABLE public.test_tbl1;
  --切换至默认数据库，请根据实际情况修改数据库名字。
  test_db1=# \c postgres
  gaussdb=# DROP DATABASE test_db1;
  gaussdb=# DROP DATABASE testdb2;
  gaussdb=# DROP TABLESPACE tbs_data1;
  gaussdb=# DROP USER jack;
  gaussdb=# DROP USER scott;
  ```
  
 
#### 相关链接
[CREATE DATABASE](https://support.huaweicloud.com/distributed-ref-v10-gaussdb/gaussdb-08-0243.html)，[DROP DATABASE](https://support.huaweicloud.com/distributed-ref-v10-gaussdb/gaussdb-08-0294.html)
