华为云用户手册

  • 参数说明 user_name 该映射的用户名。 CURRENT_USER和USER匹配当前用户的名称。PUBLIC被用来匹配系统中所有当前以及未来的用户名。 server_name 该用户映射的服务器名。 OPTIONS 为该用户映射更改选项。新选项会覆盖任何之前指定的选项。ADD、 SET和DROP指定要被执行的动作。如果没有显式地指定操作,将假定为ADD。选项名称必须为唯一,该服务器的外部数据包装器也会验证选项。 用户的密码会加密后保存到系统表PG_USER_MAPPING中,加密时需要使用usermapping.key.cipher和usermapping.key.rand作为加密密码文件和加密因子。首次使用前需要通过如下命令创建这两个文件,并将这两个文件放入各节点的$GAUSSHOME/bin目录,且确保具有读权限。gs_ssh工具可以协助您快速将文件放入各节点对应目录下。 gs_ssh -c "gs_guc generate -o usermapping -S default -D $GAUSSHOME/bin" 其中-S参数指定default时会随机生成密码,用户也可为-S参数指定密码,此密码用于保证生成密码文件的安全性和唯一性,用户无需保存或记忆。其他参数详见工具参考中gs_guc工具说明。
  • 语法格式 ALTER USER MAPPING FOR { user_name | USER | CURRENT_USER | PUBLIC } SERVER server_name OPTIONS ( [ ADD | SET | DROP ] option ['value'] [, ... ] ) 在OPTIONS选项里,ADD、SET和DROP指定要执行的操作,未指定时默认为ADD操作。option和value为对应操作的参数及参数值。
  • 语法格式 修改用户的权限等信息。 ALTER USER user_name [ [ WITH ] option [ ... ] ]; 其中option子句为。 { CREATEDB | NOCREATEDB } | { CREATEROLE | NOCREATEROLE } | { INHERIT | NOINHERIT } | { AUDITADMIN | NOAUDITADMIN } | { SYSADMIN | NOSYSADMIN } | {MONADMIN | NOMONADMIN} | {OPRADMIN | NOOPRADMIN} | {POLADMIN | NOPOLADMIN} | { USEFT | NOUSEFT } | { LOG IN | NOLOGIN } | { REPLICATION | NOREPLICATION } | {VCADMIN | NOVCADMIN} | {PERSISTENCE | NOPERSISTENCE} | CONNECTION LIMIT connlimit | [ ENCRYPTED | UNENCRYPTED ] PASSWORD { 'password' [EXPIRED] | DISABLE | EXPIRED } | [ ENCRYPTED | UNENCRYPTED ] IDENTIFIED BY { 'password' [ REPLACE 'old_password' | EXPIRED ] | DISABLE } | VALID BEGIN 'timestamp' | VALID UNTIL 'timestamp' | RESOURCE POOL 'respool' | PERM SPACE 'spacelimit' | PGUSER 修改用户名。 ALTER USER user_name RENAME TO new_name; 锁定或解锁。 ALTER USER user_name ACCOUNT { LOCK | UNLOCK }; 修改与用户关联的指定会话参数值。 ALTER USER user_name SET configuration_parameter { { TO | = } { value | DEFAULT } | FROM CURRENT }; 重置与用户关联的指定会话参数值。 ALTER USER user_name RESET { configuration_parameter | ALL };
  • 示例 --创建用户jim,登录密码为********。 gaussdb=# CREATE USER jim PASSWORD '********'; --修改用户jim的登录密码。 gaussdb=# ALTER USER jim IDENTIFIED BY '**********' REPLACE '********'; --将enable_seqscan的值设置为on, 设置成功后,在下一会话中生效。 gaussdb=# ALTER USER jim SET enable_seqscan TO on; --重置jim的enable_seqscan参数。 gaussdb=# ALTER USER jim RESET enable_seqscan; --锁定jim账户。 gaussdb=# ALTER USER jim ACCOUNT LOCK; --解锁jim账户。 gaussdb=# ALTER USER jim ACCOUNT UNLOCK; --修改用户名。 gaussdb=# ALTER USER jim RENAME TO lisa; --删除用户。 gaussdb=# DROP USER lisa CASCADE;
  • 参数说明 name 一个需要修改的现有的类型的名称(可以有模式修饰) 。 new_name 该类型的新名称。 new_owner 新所有者的用户名 。 new_schema 该类型的新模式 。 attribute_name 拟增加、更改或删除的属性的名称。 new_attribute_name 拟改名的属性的新名称。 data_type 拟新增属性的数据类型或是拟更改的属性的新类型名。 new_enum_value 枚举类型新增加的标签值,是一个非空的长度不超过63个字节的字符串。 neighbor_enum_value 一个已有枚举标签值,新值应该被增加在紧接着该枚举值之前或者之后的位置上。 existing_enum_value 现有的要重命名的枚举值,是一个非空的长度不超过63个字节的字符串 CASCADE 自动级联更新需更新类型以及相关联的记录和继承它们的子表。 RESTRICT 如果需联动更新类型是已更新类型的关联记录,则拒绝更新。这是缺省选项。 ADD ATTRIBUTE、DROP ATTRIBUTE和ALTER ATTRIBUTE选项可以组合成一个列表同时处理。 例如,在一条命令中同时增加几个属性或是更改几个属性的类型是可以实现的。 要修改一个类型的模式,必须在新模式上拥有CREATE权限。 要修改所有者,必须是新的所有角色的直接或间接成员, 并且该成员必须在此类型的模式上有CREATE权限。 (这些限制强制了修改所有者不会做任何通过删除和重建类型不能做的事情。 不过,系统管理员可以以任何方式修改任意类型的所有权。) 要增加一个属性或是修改一个属性的类型,也必须有该类型的USAGE权限。 CURRENT_USER 当前用户。 SESSION_USER 当前系统用户。 COLLATE collation COLLATE子句为该列(必须是一种可排序数据类型)赋予一个排序规则。 如果没有指定,将使用该列数据类型的默认排序规则。
  • 语法格式 修改类型。 ALTER TYPE name action [, ... ]; 其中action对应的子句如下: 给复合类型增加新的属性。 1 ADD ATTRIBUTE attribute_name data_type [ COLLATE collation ] [ CASCADE | RESTRICT ] 从复合类型中删除一个属性。 1 DROP ATTRIBUTE [ IF EXISTS ] attribute_name [ CASCADE | RESTRICT ] 改变一种复合类型中某个属性的类型。 1 ALTER ATTRIBUTE attribute_name [ SET DATA ] TYPE data_type [ COLLATE collation ] [ CASCADE | RESTRICT ] 给复合类型增加新的属性。 ALTER TYPE name ADD ATTRIBUTE attribute_name data_type [ COLLATE collation ] [ CASCADE | RESTRICT ];
  • 参数说明 tablespace_name 要修改的表空间。 取值范围:已存在的表空间名。 new_tablespace_name 表空间的新名称。 新名称不能以"PG_"开头。 取值范围:字符串,符合标识符命名规范。 new_owner 表空间的新所有者。 取值范围:已存在的用户名。 tablespace_option 设置或者重置表空间的参数。 取值范围: seq_page_cost:设置优化器计算一次顺序获取磁盘页面的开销。缺省为1.0。 random_page_cost:设置优化器计算一次非顺序获取磁盘页面的开销。缺省为4.0。 random_page_cost是相对于seq_page_cost的取值,等于或者小于seq_page_cost时毫无意义。 默认值为4.0的前提条件是,优化器采用索引来扫描表数据,并且表数据在cache中命中率可以90%左右。 如果表数据空间要比物理内存小,那么减小该值到一个适当水平;相反地,如果表数据在cache中命中率要低于90%,那么适当增大该值。 如果采用了类似于SSD的随机访问代价较小的存储器,可以适当减小该值,以反映真正的随机扫描代价。 value的取值范围:浮点类型的正数。 RESIZE MAXSIZE 重新设置表空间限额的数值。 取值范围: UNLIMITED,该表空间不设置限额。 由space_size来确定,其格式参考CREATE TABLESPACE。 若调整后的限额值比当前表空间实际使用的值要小,调整操作可以执行成功,后续用户需要将该表空间的使用值降低到新限额值之下,才能继续往该表空间中写入数据。 修改参数MAXSIZE时也可使用: ALTER TABLESPACE tablespace_name RESIZE MAXSIZE { 'UNLIMITED' | 'space_size'};
  • 注意事项 只有表空间的所有者或者被授予了表空间ALTER权限的用户有权限执行ALTER TABLESPACE命令,系统管理员默认拥有此权限。但要修改表空间的所有者,当前用户必须是该表空间的所有者或系统管理员,且该用户是新所有者角色的成员。 要修改表空间的所有者A为B,则A必须是B的直接或者间接成员。 如果new_owner与old_owner一致,此处不再校验当前执行操作的用户是否具有修改权限,而直接显示ALTER成功。
  • 语法格式 重命名表空间的语法。 ALTER TABLESPACE tablespace_name RENAME TO new_tablespace_name; 设置表空间所有者的语法。 ALTER TABLESPACE tablespace_name OWNER TO new_owner; 设置表空间属性的语法。 ALTER TABLESPACE tablespace_name SET ( { tablespace_option = value } [, ... ] ); 重置表空间属性的语法。 ALTER TABLESPACE tablespace_name RESET ( { tablespace_option } [, ... ] ); 设置表空间限额的语法 ALTER TABLESPACE tablespace_name RESIZE MAXSIZE { UNLIMITED | 'space_size'};
  • 参数说明 table_name 分区表名。 取值范围:已存在的分区表名。 subpartition_name 二级分区名。 取值范围:已存在的二级分区名。 tablespacename 指定分区要移动到哪个表空间。 取值范围:已存在的表空间名。 partition_value 一级分区键值。 通过PARTITION FOR ( partition_value [, ...] )子句指定的这一组值,可以唯一确定一个一级分区。 取值范围:需要进行操作的一级分区的分区键的取值范围。 subpartition_value 一级分区键值和二级分区键值。 通过SUBPARTITION FOR ( subpartition_value [, ...] )子句指定的这一组值,可以唯一确定一个二级分区。 取值范围:对于需要进行操作的二级分区,需要同时有其一级分区分区键和二级分区分区键的取值范围。 UNUSABLE LOCAL INDEXES 设置该分区上的所有索引不可用。 REBUILD UNUSABLE LOCAL INDEXES 重建该分区上的所有索引。 { ENABLE | DISABLE } ROW MOVEMET 行迁移开关。 如果进行UPDATE操作时,更新了元组在分区键上的值,造成了该元组所在分区发生变化,就会根据该开关给出报错信息,或者进行元组在分区间的转移。 取值范围: ENABLE:打开行迁移开关。 DISABLE:关闭行迁移开关。 默认是打开状态。 ordinary_table_name 进行迁移的普通表的名称。 取值范围:已存在的普通表名。 { WITH | WITHOUT } VALIDATION 在进行数据迁移时,是否检查普通表中的数据满足指定分区的分区键范围。 取值范围: WITH:对于普通表中的数据要检查是否满足分区的分区键范围,如果有数据不满足,则报错。 WITHOUT:对于普通表中的数据不检查是否满足分区的分区键范围。 默认是WITH状态。 由于检查比较耗时,特别是当数据量很大的情况下更甚。所以在保证当前普通表中的数据满足分区的分区键范围时,可以加上WITHOUT来指明不进行检查。 VERBOSE 在VALIDATION是WITH状态时,如果检查出普通表有不满足要交换分区的分区键范围的数据,那么把这些数据插入到正确的分区,如果路由不到任何分区,再报错。 只有在VALIDATION是WITH状态时,才可以指定VERBOSE。 partition_new_name 分区的新名称。 取值范围:字符串,要符合标识符命名规范。 subpartition_new_name 二级分区的新名称。 取值范围:字符串,要符合标识符命名规范。 UPDATE GLOBAL INDEX 如果使用该参数,则会更新分区表上的所有全局索引,以确保使用全局索引可以查询出正确的数据;如果不使用该参数,则分区表上的所有全局索引将会失效。
  • 语法格式 修改二级分区表分区包括修改表分区主语法、修改表分区名称的语法和重置分区ID的语法。 修改表分区主语法。 ALTER TABLE [ IF EXISTS ] { table_name [*] | ONLY table_name | ONLY ( table_name )} action [, ... ]; 其中action统指如下分区维护子语法。当存在多个分区维护子句时,保证了分区的连续性,无论这些子句的排序如何, GaussDB 总会先执行DROP PARTITION再执行ADD PARTITION操作,最后顺序执行其它分区维护操作。 move_clause | exchange_clause | row_clause | merge_clause | modify_clause | add_clause | drop_clause | split_clause | truncate_clause move_clause子语法用于移动分区到新的表空间。 MOVE SUBPARTITION { subpartion_name | FOR ( subpartition_value [, ...] ) } TABLESPACE tablespacename exchange_clause子语法用于把普通表的数据迁移到指定的分区。 EXCHANGE SUBPARTITION { ( subpartition_name ) | FOR ( subpartition_value [, ...] ) } WITH TABLE {[ ONLY ] ordinary_table_name | ordinary_table_name * | ONLY ( ordinary_table_name )} [ { WITH | WITHOUT } VALIDATION ] [ VERBOSE ] [ UPDATE GLOBAL INDEX ] 进行交换的普通表和分区必须满足如下条件: 普通表和分区的列数目相同,对应列的信息严格一致,包括:列名、列的数据类型、列约束、列的Collation信息、列的存储参数、列的压缩信息等。 普通表和分区的表压缩信息严格一致。 普通表索引和分区Local索引个数相同,且对应索引的信息严格一致。 普通表和分区的表约束个数相同,且对应表约束的信息严格一致。 普通表不可以是临时表,分区表只能是二级分区表。 普通表和分区表上不可以有动态数据脱敏,行访问控制约束。 完成交换后,普通表和分区的数据被置换,同时普通表和分区的表空间信息被置换。此时,普通表和分区的统计信息变得不可靠,需要对普通表和分区重新执行analyze。 由于非分区键不能建立本地唯一索引,只能建立全局唯一索引,所以如果普通表含有唯一索引时,可能会导致不能交换数据。 如果需要进行数交换数据操作可以通过创建中间表的方式,先将分区数据插入到中间表,truncate分区,普通表数据插入分区表,drop普通表,重命名中间表的方式完成数据交换操作。 如果在普通表/分区表上进行了drop column操作,被删除的列依然物理存在,所以需要保证普通表和分区的被删除列也严格对齐才能交换成功。 row_clause子语法用于设置分区表的行迁移开关。 { ENABLE | DISABLE } ROW MOVEMENT merge_clause子语法用于把多个分区合并成一个分区。一个命令中合并的源分区上限为300。 MERGE SUBPARTITIONS { subpartition_name } [, ...] INTO SUBPARTITION partition_name [ TABLESPACE tablespacename ] [ UPDATE GLOBAL INDEX ] 对于范围分区,MERGE分区要求源分区的范围连续递增,且MERGE后的分区名可以与最后一个源分区名相同;对于列表分区,则源分区无顺序要求,且MERGE后的分区名可以与任一源分区名相同。如果MERGE后的分区名与源分区名相同,视为同一个分区。 USTORE存储引擎表不支持在事务块/存储过程中执行ALTER TABLE MERGE SUBPARTITIONS的操作。 modify_clause子语法用于设置分区索引是否可用。语法可以作用在一级分区上。 MODIFY PARTITION partition_name { UNUSABLE LOCAL INDEXES | REBUILD UNUSABLE LOCAL INDEXES } 也可以作用在二级分区上。 MODIFY SUBPARTITION partition_name { UNUSABLE LOCAL INDEXES | REBUILD UNUSABLE LOCAL INDEXES } add_clause子语法用于为指定的分区表添加一个或多个分区。语法可以作用在一级分区上。 ADD {partition_less_than_item | partition_list_item } [ ( subpartition_definition_list ) ] 也可以作用在二级分区上。 MODIFY PARTITION partition_name ADD subpartition_definition 其中,分区项partition_less_than_item为RANGE分区定义语法,具体语法如下。 PARTITION partition_name VALUES LESS THAN ( partition_value | MAXVALUE ) [ TABLESPACE tablespacename ] 分区项partition_list_item为LIST分区定义语法,具体语法如下。 PARTITION partition_name VALUES ( partition_value [, ...] | DEFAULT ) [ TABLESPACE tablespacename ] subpartition_definition_list为1到多个二级分区subpartition_definition对象,subpartition_definition具体语法如下。 SUBPARTITION subpartition_name [ VALUES LESS THAN ( partition_value | MAXVALUE ) | VALUES ( partition_value [, ...] | DEFAULT )] [ TABLESPACE tablespace ] 若一级分区为HASH分区,不支持以ADD形式新增一级分区;若二级分区为HASH分区,不支持以MODIFY形式新增二级分区。 drop_clause子语法用于删除分区表中的指定分区。语法可以作用在一级分区上。 DROP PARTITION { partition_name | FOR ( partition_value ) } [ UPDATE GLOBAL INDEX ] 也可以作用在二级分区上。 DROP SUBPARTITION { subpartition_name | FOR ( partition_value, subpartition_value ) } [ UPDATE GLOBAL INDEX ] 若一级分区为HASH分区,不支持删除一级分区;若二级分区为HASH分区,不支持删除二级分区。 不支持删除唯一子分区。 split_clause子语法用于把一个分区切割成多个分区。 SPLIT SUBPARTITION { subpartition_name| FOR ( subpartition_value [, ...] ) } { split_point_clause | no_split_point_clause } [ UPDATE GLOBAL INDEX ] SPLIT后的分区名可以与源分区名相同,但视为不同的分区。 范围分区指定切割点split_point_clause的语法为: AT ( subpartition_value ) INTO ( SUBPARTITION subpartition_name [ TABLESPACE tablespacename ] , SUBPARTITION subpartition_name [ TABLESPACE tablespacename ] ) 切割点的大小要位于正在被切割的分区的分区键范围内,指定切割点的方式只能把一个分区切割成两个新分区。 范围分区不指定切割点no_split_point_clause 的语法如下,其中最后一个分区不能写分区范围定义,即VALUES LESS THAN (subpartition_value)部分,默认继承源分区范围定义的上界值。 INTO ( SUBPARTITION subpartition_name VALUES LESS THAN (subpartition_value) [ TABLESPACE tablespacename ][, ...] ) 第一个新分区的分区范围定义要大于正在被切割的分区的前一个分区(如果存在的话)的分区范围定义。 最后一个新分区不能写分区范围定义,默认继承源分区范围定义的上界值。 新分区必须满足分区范围定义递增的约束。 列表范围分区指定切割点split_point_clause的语法如下: VALUES ( subpartition_value ) INTO ( SUBPARTITION subpartition_name [ TABLESPACE tablespacename ] , SUBPARTITION subpartition_name [ TABLESPACE tablespacename ] ) 切割点必须是源分区的一个非空真子集,指定切割点的方式只能把一个分区切割成两个新分区。 列表分区表不指定切割点no_split_point_clause的语法如下,其中最后一个分区不能写分区范围定义,即VALUES (subpartition_value_list)部分,其范围等于源分区去掉其他子分区后的剩余集合。 INTO ( SUBPARTITION subpartition_name VALUES (subpartition_value_list) [ TABLESPACE tablespacename ][, ...] ) 最后一个新分区不能写分区范围定义,其范围等于源分区去掉其他子分区后的剩余集合。 不指定切割点的方式,每一个新分区都必须是源分区的一个非空真子集,且互不交叉。 truncate_clause子语法用于清空分区表中的指定分区。语法可以作用在一级分区上。 TRUNCATE PARTITION { partition_name | FOR ( partition_value [, ...] ) } [ UPDATE GLOBAL INDEX ] 也可以作用在二级分区上。 TRUNCATE SUBPARTITION { subpartition_name | FOR ( subpartition_value [, ...] ) } [ UPDATE GLOBAL INDEX ]
  • 注意事项 添加分区的表空间不能是PG_GLOBAL。 添加分区的名称不能与该分区表已有一级分区和二级分区的名称相同。 添加分区的分区键值要和分区表的分区键的类型一致。 若添加RANGE分区,添加分区键值要大于分区表中最后一个范围分区的上边界。若需要在有MAXVALUE分区的表上新增分区,建议使用SPLIT语法。 若添加LIST分区,添加分区键值不能与现有分区键值重复。若需要在有DEFAULT分区的表上新增分区,建议使用SPLIT语法。 不支持添加HASH分区。只有一种情况例外,二级分区表的二级分区方式为HASH且一级分区方式不是HASH,此时支持新增一级分区并创建对应的二级分区。 如果目标分区表中已有分区数达到了最大值1048575,则不能继续添加分区。 当分区表只有一个一级分区或二级分区时,不能删除该分区。 不支持删除HASH分区。 选择分区使用PARTITION FOR()或SUBPARTITION FOR(),括号里指定值个数应该与定义分区时使用的列个数相同,并且一一对应。 切割分区只能对二级分区(叶子节点)进行切割,被切割分区只能是Range、List分区策略,不支持切割hash分区策略。 合并分区只能对二级分区(叶子节点)进行合并,且源分区必须属于同一个一级分区。 只有分区表的所有者或者被授予了分区表ALTER权限的用户有权限执行ALTER TABLE PARTITION命令,系统管理员默认拥有此权限。 删除、切割、清空、交换分区的操作会使Global索引失效,可以申明UPDATE GLOBAL INDEX子句同步更新索引。 如果删除、切割、清空、交换分区操作不申明UPDATE GLOBAL INDEX子句,并发的DML业务有可能因为索引不可用而报错。 若设置参数enable_gpi_auto_update为on,即使不申明UPDATE GLOBAL INDEX子句,也会自动更新Global索引。
  • 参数说明 table_name 分区表名。 取值范围:已存在的分区表名。 partition_name 分区名。 取值范围:已存在的分区名。 tablespacename 指定分区要移动到哪个表空间。 取值范围:已存在的表空间名。 partition_value 分区键值。 通过PARTITION FOR ( partition_value [, ...] )子句指定的这一组值,可以唯一确定一个分区。 取值范围:需要进行操作的分区的分区键的取值范围。 UNUSABLE LOCAL INDEXES 设置该分区上的所有索引不可用。 REBUILD UNUSABLE LOCAL INDEXES 重建该分区上的所有索引。 { ENABLE | DISABLE } ROW MOVEMET 行迁移开关。 如果进行UPDATE操作时,更新了元组在分区键上的值,造成了该元组所在分区发生变化,就会根据该开关给出报错信息,或者进行元组在分区间的转移。 取值范围: ENABLE:打开行迁移开关。 DISABLE:关闭行迁移开关。 默认是打开状态。 ordinary_table_name 进行迁移的普通表的名称。 取值范围:已存在的普通表名。 { WITH | WITHOUT } VALIDATION 在进行数据迁移时,是否检查普通表中的数据满足指定分区的分区键范围。 取值范围: WITH:对于普通表中的数据要检查是否满足分区的分区键范围,如果有数据不满足,则报错。 WITHOUT:对于普通表中的数据不检查是否满足分区的分区键范围。 默认是WITH状态。 由于检查比较耗时,特别是当数据量很大的情况下更甚。所以在保证当前普通表中的数据满足分区的分区键范围时,可以加上WITHOUT来指明不进行检查。 VERBOSE 在VALIDATION是WITH状态时,如果检查出普通表有不满足要交换分区的分区键范围的数据,那么把这些数据插入到正确的分区,如果路由不到任何分区,再报错。 只有在VALIDATION是WITH状态时,才可以指定VERBOSE。 partition_new_name 分区的新名称。 取值范围:字符串,要符合标识符命名规范。 UPDATE GLOBAL INDEX 如果使用该参数,则会更新分区表上的所有全局索引,以确保使用全局索引可以查询出正确的数据;如果不使用该参数,则分区表上的所有全局索引将会失效。
  • 语法格式 修改分区表分区包括修改表分区主语法、修改表分区名称的语法和重置分区ID的语法。 修改表分区主语法。 ALTER TABLE [ IF EXISTS ] { table_name [*] | ONLY table_name | ONLY ( table_name )} action [, ... ]; 其中action统指如下分区维护子语法。当存在多个分区维护子句时,保证了分区的连续性,无论这些子句的排序如何,GaussDB总会先执行DROP PARTITION再执行ADD PARTITION操作,最后顺序执行其它分区维护操作。 move_clause | exchange_clause | row_clause | merge_clause | modify_clause | split_clause | add_clause | drop_clause | truncate_clause move_clause子语法用于移动分区到新的表空间。 MOVE PARTITION { partion_name | FOR ( partition_value [, ...] ) } TABLESPACE tablespacename exchange_clause子语法用于把普通表的数据迁移到指定的分区。 EXCHANGE PARTITION { ( partition_name ) | FOR ( partition_value [, ...] ) } WITH TABLE {[ ONLY ] ordinary_table_name | ordinary_table_name * | ONLY ( ordinary_table_name )} [ { WITH | WITHOUT } VALIDATION ] [ VERBOSE ] [ UPDATE GLOBAL INDEX ] 进行交换的普通表和分区必须满足如下条件: 普通表和分区的列数目相同,对应列的信息严格一致,包括:列名、列的数据类型、列约束、列的Collation信息、列的存储参数、列的压缩信息等。 普通表和分区的表压缩信息严格一致。 普通表索引和分区Local索引个数相同,且对应索引的信息严格一致。 普通表和分区的表约束个数相同,且对应表约束的信息严格一致。 普通表不可以是临时表,分区表只能是范围分区表,列表分区表,哈希分区表或间隔分区表。 普通表和分区表上不可以有动态数据脱敏,行访问控制约束。 完成交换后,普通表和分区的数据被置换,同时普通表和分区的表空间信息被置换。此时,普通表和分区的统计信息变得不可靠,需要对普通表和分区重新执行analyze。 由于非分区键不能建立本地唯一索引,只能建立全局唯一索引,所以如果普通表含有唯一索引时,可能会导致不能交换数据。 如果需要进行数据交换操作,可以通过创建中间表的方式,先将分区数据插入到中间表,truncate分区,普通表数据插入分区表,drop普通表,重命名中间表的方式完成数据交换操作。 如果在普通表/分区表上进行了drop column操作,被删除的列依然物理存在,所以需要保证普通表和分区的被删除列也严格对齐才能交换成功。 row_clause子语法用于设置分区表的行迁移开关。 { ENABLE | DISABLE } ROW MOVEMENT merge_clause子语法用于把多个分区合并成一个分区。一个命令中合并的源分区上限为300。 MERGE PARTITIONS { partition_name } [, ...] INTO PARTITION partition_name [ TABLESPACE tablespacename ] [ UPDATE GLOBAL INDEX ] 对于范围分区/间隔分区,MERGE分区要求源分区的范围连续递增,且MERGE后的分区名可以与最后一个源分区名相同;对于列表分区,则源分区无顺序要求,且MERGE后的分区名可以与任一源分区名相同。如果MERGE后的分区名与源分区名相同,视为同一个分区。 USTORE存储引擎表不支持在事务块/存储过程中执行ALTER TABLE MERGE PARTITIONS的操作。 modify_clause子语法用于设置分区索引是否可用。 MODIFY PARTITION partition_name { UNUSABLE LOCAL INDEXES | REBUILD UNUSABLE LOCAL INDEXES } split_clause子语法用于把一个分区切割成多个分区。 SPLIT PARTITION { partition_name | FOR ( partition_value [, ...] ) } { split_point_clause | no_split_point_clause } [ UPDATE GLOBAL INDEX ] SPLIT后的分区名可以与源分区名相同,但视为不同的分区。 范围分区表和间隔分区表指定切割点split_point_clause的语法为: AT ( partition_value ) INTO ( PARTITION partition_name [ TABLESPACE tablespacename ] , PARTITION partition_name [ TABLESPACE tablespacename ] ) 切割点的大小要位于正在被切割的分区的分区键范围内,指定切割点的方式只能把一个分区切割成两个新分区。 范围分区表和间隔分区表不指定切割点no_split_point_clause的语法为: INTO { ( partition_less_than_item [, ...] ) | ( partition_start_end_item [, ...] ) } 不指定切割点的方式,partition_less_than_item指定的第一个新分区的分区键要大于正在被切割的分区的前一个分区(如果存在的话)的分区键,partition_less_than_item指定的最后一个分区的分区键要等于正在被切割的分区的分区键大小。 不指定切割点的方式,partition_start_end_item指定的第一个新分区的起始点(如果存在的话)必须等于正在被切割的分区的前一个分区(如果存在的话)的分区键,partition_start_end_item指定的最后一个分区的终止点(如果存在的话)必须等于正在被切割的分区的分区键。 partition_less_than_item支持的分区键个数最多为16,而partition_start_end_item仅支持1个分区键,其支持的数据类型参见•PARTITION BY RANGE [COLUMNS] (partition_key)。 在同一语句中partition_less_than_item和partition_start_end_item两者不可同时使用;不同split语句之间没有限制。 分区项partition_less_than_item的语法如下,其中最后一个分区可以不写分区范围定义,即VALUES LESS THAN (partition_value)部分,默认继承源分区范围定义的上界值。 PARTITION partition_name VALUES LESS THAN ( { partition_value | MAXVALUE } [, ...] ) [ TABLESPACE tablespacename ] 分区项partition_start_end_item的语法如下,其约束参见START END语法描述。 PARTITION partition_name { {START(partition_value) END (partition_value) EVERY (interval_value)} | {START(partition_value) END ({partition_value | MAXVALUE})} | {START(partition_value)} | {END({partition_value | MAXVALUE})} } [TABLESPACE tablespace_name] 列表分区表指定切割点split_point_clause的语法如下: VALUES ( partition_value_list ) INTO ( PARTITION partition_name [ TABLESPACE tablespacename ] , PARTITION partition_name [ TABLESPACE tablespacename ] ) 切割点必须是源分区的一个非空真子集,指定切割点的方式只能把一个分区切割成两个新分区。 列表分区表不指定切割点no_split_point_clause的语法如下,其中最后一个分区不能写分区范围定义,即VALUES (partition_value_list)部分,其范围等于源分区去掉其他子分区后的剩余集合。 INTO ( PARTITION partition_name VALUES (partition_value_list) [ TABLESPACE tablespacename ][, ...] ) 最后一个新分区不能写分区范围定义,其范围等于源分区去掉其他子分区后的剩余集合。 不指定切割点的方式,每一个新分区都必须是源分区的一个非空真子集,且互不交叉。 add_clause子语法用于为指定的分区表添加一个或多个分区。 ADD {partition_less_than_item | partition_start_end_item| partition_list_item } 分区项partition_list_item的语法如下。 PARTITION partition_name VALUES (list_values_clause) [ TABLESPACE tablespacename ] partition_list_item支持最多16个分区键,其支持的数据类型参见•PARTITION BY LIST [COLUMNS] (partition_key)。 间隔/哈希分区表不支持添加分区。 drop_clause子语法用于删除分区表中的指定分区。 DROP PARTITION { partition_name | FOR ( partition_value [, ...] ) } [ UPDATE GLOBAL INDEX ] 哈希分区表不支持删除分区。 当分区表只有一个分区时,不能删除该分区。 truncate_clause子语法用于清空分区表中的指定分区。 TRUNCATE PARTITION { partition_name | FOR ( partition_value [, ...] ) } [ UPDATE GLOBAL INDEX ] 修改表分区名称的语法。 ALTER TABLE [ IF EXISTS ] { table_name [*] | ONLY table_name | ONLY ( table_name )} RENAME PARTITION { partion_name | FOR ( partition_value [, ...] ) } TO partition_new_name; 重置分区ID的语法。 ALTER TABLE [ IF EXISTS ] { table_name [*] | ONLY table_name | ONLY ( table_name )} RESET PARTITION;
  • 注意事项 只有分区表的所有者或者被授予了分区表ALTER权限的用户有权限执行ALTER TABLE PARTITION命令,系统管理员默认拥有此权限。 添加分区的表空间不能是PG_GLOBAL。 添加分区的名称不能与该分区表已有分区的名称相同。 添加分区的分区键值要和分区表的分区键的类型一致。 若添加RANGE分区,添加分区键值要大于分区表中最后一个范围分区的上边界。 若添加LIST分区,添加分区键值不能与现有分区键值重复。 不支持添加HASH分区。 如果目标分区表中已有分区数达到了最大值1048575,则不能继续添加分区。 当分区表只有一个分区时,不能删除该分区。 选择分区使用PARTITION FOR(),括号里指定值个数应该与定义分区时使用的列个数相同,并且一一对应。 Value分区表不支持相应的Alter Partition操作。 间隔分区表不支持添加分区。 哈希分区表不支持切割分区,不支持合成分区,不支持添加和删除分区。 删除、切割、合并、清空、交换分区的操作会使Global索引失效,可以申明UPDATE GLOBAL INDEX子句同步更新索引。 如果删除、切割、合并、清空、交换分区操作不申明UPDATE GLOBAL INDEX子句,并发的DML业务有可能因为索引不可用而报错。 若设置参数enable_gpi_auto_update为on,即使不申明UPDATE GLOBAL INDEX子句,也会自动更新Global索引。
  • 示例 --创建系统管理员用户。 gaussdb=# CREATE USER sysadmin WITH SYSADMIN PASSWORD '********'; --切换管理员用户。 gaussdb=# \c - sysadmin --创建同义词t1。 gaussdb=# CREATE OR REPLACE SYNONYM t1 FOR ot.t1; --创建新用户u1。 gaussdb=# CREATE USER u1 PASSWORD '********'; --给新用户赋权限。 gaussdb=# GRANT ALL ON SCHEMA sysadmin TO u1; --修改同义词t1的owner为u1。 gaussdb=# ALTER SYNONYM t1 OWNER TO u1; --删除同义词t1。 gaussdb=# DROP SYNONYM t1; --收回用户u1权限。 gaussdb=# REVOKE ALL ON SCHEMA sysadmin FROM u1; --删除用户u1。 gaussdb=# DROP USER u1; --切换到初始用户init_user,请使用真实的初始用户名称替换init_user。 gaussdb=# \c - init_user --删除用户sysadmin。 gaussdb=# DROP USER sysadmin;
  • 语法格式 设置会话的事务参数。 ALTER SESSION SET [ SESSION CHARACTERIS TICS AS ] TRANSACTION { ISOLATION LEVEL { READ COMMITTED } | { READ ONLY | READ WRITE } } [, ...] ; 设置会话的其他运行时参数。 ALTER SESSION SET {{config_parameter { { TO | = } { value | DEFAULT } | FROM CURRENT }} | TIME ZONE time_zone | CURRENT_SCHEMA schema | NAMES encoding_name | ROLE role_name PASSWORD 'password' | SESSION AUTHORIZATION { role_name PASSWORD 'password' | DEFAULT } | XML OPTION { DOCUMENT | CONTENT } } ;
  • 参数说明 config_parameter 可设置的运行时参数的名称。可用的运行时参数可以使用SHOW ALL命令查看。 value config_parameter的新值。可以声明为字符串常量、标识符、数字,或者逗号分隔的列表。DEFAULT用于把这些参数设置为它们的缺省值。 DEFAULT OFF RESET 用户指定的值:需要满足修改参数的取值限制 FROM CURRENT 取当前会话中的值设置为configuration_parameter的值。 TIME ZONE timezone 用于指定当前会话的本地时区。 取值范围:有效的本地时区。该选项对应的运行时参数名称为TimeZone,DEFAULT缺省值为PRC。 CURRENT_SCHEMA schema CURRENT_SCHEMA用于指定当前的模式。 取值范围:已存在模式名称。如果模式名不存在,会导致CURRENT_SCHEMA值为空。 SCHEMA schema 同CURRENT_SCHEMA。此处的schema是个字符串。 NAMES encoding_name 用于设置客户端的字符编码。等价于set client_encoding to encoding_name。 取值范围:有效的字符编码。该选项对应的运行时参数名称为client_encoding,默认编码为UTF8。 role_name 取值范围:字符串。要符合标识符命名规范。 password 角色的密码。要求符合密码的命名规则。 SESSION AUTHORIZATION 当前会话的用户表示符。 XML OPTION { DOCUMENT | CONTENT } 用于设置XML的解析方式。 取值范围:CONTENT(缺省)、DOCUMENT
  • 参数说明 server_name 所修改的server的名称。 new_version 修改后server的新版本名称。 OPTIONS 更改该服务器的选项。ADD、SET和 DROP指定要执行的动作。如果没有显式地指定操作, 将会假定为ADD。选项名称必须唯一,名称和值也会使用该服务器的外部数据包装器库进行验证。 除了libpq支持的连接参数外,还额外提供以下参数: fdw_startup_cost 执行一个外表扫描时的启动耗时估算。这个值通常包含建立连接、远端对请求的分析和生成计划的耗时。默认值为100。取值范围为大于0的实数。 fdw_typle_cost 在远端服务器上对每一个元组进行扫描时的额外消耗。这个值通常表示数据在server间传输的额外消耗。默认值为0.01。取值范围为大于0的实数。 new_name 修改后server的新名称。
  • 示例 --创建my_server。 gaussdb=# CREATE SERVER my_server FOREIGN DATA WRAPPER log_fdw; --修改外部服务的名称。 gaussdb=# ALTER SERVER my_server RENAME TO my_server_1; --删除my_server_1。 gaussdb=# DROP SERVER my_server_1;
  • 注意事项 只有SERVER的所有者或者被授予了SERVER的ALTER权限的用户才可以执行ALTER SERVER命令,系统管理员默认拥有该权限。但要修改SERVER的所有者,当前用户必须是该SERVER的所有者或者系统管理员,且该用户是新所有者角色的成员。 OPTIONS中的敏感字段(如password、secret_access_key)在使用多层引号时,语义和不带引号的场景是不同的,因此不会被识别为敏感字段进行脱敏。
  • 语法格式 修改外部服务的参数。 ALTER SERVER server_name [ VERSION 'new_version' ] [ OPTIONS ( {[ ADD | SET | DROP ] option ['value']} [, ... ] ) ]; 在OPTIONS选项里,ADD、SET和DROP指定要执行的操作,未指定时默认为ADD操作。option和value为对应操作的参数。 修改外部服务的所有者。 1 2 ALTER SERVER server_name OWNER TO new_owner; 修改外部服务的名称。 ALTER SERVER server_name RENAME TO new_name;
  • 示例 --创建一个名为serial的递增序列,从101开始。 gaussdb=# CREATE SEQUENCE serial START 101; --创建一个表,定义默认值。 gaussdb=# CREATE TABLE T1(C1 bigint default nextval('serial')); --将序列serial的归属列变为T1.C1。 gaussdb=# ALTER SEQUENCE serial OWNED BY T1.C1; --删除序列和表。 gaussdb=# DROP SEQUENCE serial cascade; gaussdb=# DROP TABLE T1;
  • 注意事项 序列的所有者或者被授予了序列ALTER权限的用户或者被授予了ALTER ANY SEQUENCE权限的用户才能执行ALTER SEQUENCE命令,系统管理员默认拥有该权限。但要修改序列的所有者,当前用户必须是该序列的所有者或者系统管理员,且该用户是新所有者角色的成员。 当前版本仅支持修改拥有者、归属列和最大值。若要修改其他参数,可以删除重建,并用Setval函数恢复当前值。 ALTER SEQUENCE MAXVALUE不支持在事务、函数和存储过程中使用。 修改序列的最大值后,会清空该序列在所有会话的cache。 如果Sequence被创建时使用了LARGE标识,则ALTER时也需要使用LARGE标识。 ALTER SEQUENCE会阻塞nextval、setval、currval和lastval的调用。
  • 语法格式 修改序列归属列 ALTER [ LARGE ] SEQUENCE [ IF EXISTS ] name [MAXVALUE maxvalue | NO MAXVALUE | NOMAXVALUE | CACHE cache] [ OWNED BY { table_name.column_name | NONE } ] ; 修改序列的拥有者 ALTER [ LARGE ] SEQUENCE [ IF EXISTS ] name OWNER TO new_owner;
  • 参数说明 name 将要修改的序列名称。 IF EXISTS 当序列不存在时使用该选项不会出现错误消息,仅有一个通知。 CACHE 为了快速访问,而在内存中预先存储序列号的个数。如果没有指定,将保持旧的缓冲值。 OWNED BY 将序列和一个表的指定字段进行关联。这样,在删除那个字段或其所在表的时候会自动删除已关联的序列。 如果序列已经和表有关联后,使用这个选项后新的关联关系会覆盖旧的关联。 关联的表和序列的所有者必须是同一个用户,并且在同一个模式中。 使用OWNED BY NONE将删除任何已经存在的关联。 new_owner 序列新所有者的用户名。用户要修改序列的所有者,必须是新角色的直接或者间接成员,并且那个角色必须有序列所在模式上的CREATE权限。
  • 示例 --创建模式ds。 gaussdb=# CREATE SCHEMA ds; --将当前模式ds更名为ds_new。 gaussdb=# ALTER SCHEMA ds RENAME TO ds_new; --创建用户jack。 gaussdb=# CREATE USER jack PASSWORD '********'; --将DS_NEW的所有者修改为jack。 gaussdb=# ALTER SCHEMA ds_new OWNER TO jack; --将DS_NEW的默认字符集修改为utf8mb4,默认字符序修改为utf8mb4_bin。仅在sql_compatibility='B'时支持该语法。 gaussdb=# ALTER SCHEMA ds_new CHARACTER SET utf8mb4 COLLATE utf8mb4_bin; --删除用户jack和模式ds_new。 gaussdb=# DROP SCHEMA ds_new; gaussdb=# DROP USER jack;
  • 注意事项 只有模式的所有者或者被授予了模式ALTER权限的用户有权限执行ALTER SCHEMA命令,系统管理员默认拥有此权限。但要修改模式的所有者,当前用户必须是该模式的所有者或者系统管理员,且该用户是新所有者角色的成员。 对于除public以外的系统模式,如pg_catalog、sys等,只允许初始用户修改模式的所有者。修改系统自带模式的名称可能会导致部分功能不可用甚至影响数据库正常运行,默认情况下不允许修改系统自带模式的名称,考虑到前向兼容性,仅允许当系统在启动或升级过程中或参数allow_system_table_mods为on时修改。 只有初始用户可以将schema的属主修改为运维管理员,其他用户无法将schema的属主修改为运维管理员。
  • 参数说明 schema_name 现有模式的名称。 取值范围:已存在的模式名。 RENAME TO new_name 修改模式的名称。非系统管理员要改变模式的名称,则该用户必须在此数据库上有CREATE权限。 new_name:模式的新名称。 模式名不能和当前数据库里其他的模式重名。 模式名不能和当前数据库的初始用户重名。 模式的名称不可以“pg_”开头。 模式的名称不可以“gs_role_”开头。 取值范围:字符串,要符合标识符命名规范。 OWNER TO new_owner 修改模式的所有者。非系统管理员要改变模式的所有者,该用户还必须是新的所有角色的直接或间接成员, 并且该成员必须在此数据库上有CREATE权限。 new_owner:模式的新所有者。 取值范围:已存在的用户名/角色名。
  • 语法格式 修改已存在行访问控制策略的名称 1 ALTER [ ROW LEVEL SECURITY ] POLICY policy_name ON table_name RENAME TO new_policy_name; 修改已存在行访问控制策略的指定用户、策略表达式 1 2 3 ALTER [ ROW LEVEL SECURITY ] POLICY policy_name ON table_name [ TO { role_name | PUBLIC } [, ...] ] [ USING ( using_expression ) ];
共100000条