华为云用户手册

  • 列操作示例 1 2 3 4 5 6 7 8 9 10 11 DROP TABLE IF EXISTS warehouse_t; CREATE TABLE warehouse_t ( W_WAREHOUSE_SK INTEGER NOT NULL, W_WAREHOUSE_ID CHAR(16) NOT NULL, W_WAREHOUSE_NAME VARCHAR(20) UNIQUE DEFERRABLE, W_WAREHOUSE_SQ_FT INTEGER , W_COUNTY VARCHAR(30) , W_STATE CHAR(2) DEFAULT 'GA', W_ZIP CHAR(10) ); 向表中增加一个新的字段: 1 ALTER TABLE warehouse_t ADD W_GOODS_CATEGORY int; 修改表中列名信息以及列字段信息: 1 ALTER TABLE warehouse_t CHANGE W_GOODS_CATEGORY W_GOODS_CATEGORY2 DECIMAL NOT NULL COMMENT 'W_GOODS_CATEGORY'; 给已创建好的表增加主键: 1 ALTER TABLE warehouse_t ADD PRIMARY KEY(w_warehouse_name); 重命名列: 1 ALTER TABLE warehouse_t RENAME W_ZIP TO new_W_ZIP; 向表中增加多列: 1 ALTER TABLE warehouse_t ADD (W_COMMENT VARCHAR(117) NOT NULL, W_COUNT int); 修改表中已存在字段的数据类型,并将字段约束设置为非空: 1 ALTER TABLE warehouse_t MODIFY W_WAREHOUSE_SQ_FT varchar(20) NOT NULL; 为表的某列添加not null约束: 1 ALTER TABLE warehouse_t ALTER COLUMN W_COUNTY SET NOT NULL; 从表中删除一个字段: 1 ALTER TABLE warehouse_t DROP COLUMN W_STATE;
  • 语法格式 修改表的定义。 1 2 ALTER TABLE [ IF EXISTS ] { table_name [*] | ONLY table_name | ONLY ( table_name ) } action [, ... ]; 其中具体表操作action可以是以下子句之一: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 column_clause | ADD table_constraint [ NOT VALID ] | ADD table_constraint_using_index | VALIDATE CONSTRAINT constraint_name | DROP CONSTRAINT [ IF EXISTS ] constraint_name [ RESTRICT | CASCADE ] | CLUSTER ON index_name | SET WITHOUT CLUSTER | SET ( {storage_parameter = value} [, ... ] ) | RESET ( storage_parameter [, ... ] ) | OWNER TO new_owner | SET TABLESPACE new_tablespace | SET {COMPRESS|NOCOMPRESS} | DISTRIBUTE BY { REPLICATION | ROUNDROBIN | { HASH ( column_name [,...] ) } } | TO { GROUP groupname | NODE ( nodename [, ... ] ) } | ADD NODE ( nodename [, ... ] ) | DELETE NODE ( nodename [, ... ] ) | DISABLE TRIGGER [ trigger_name | ALL | USER ] | ENABLE TRIGGER [ trigger_name | ALL | USER ] | ENABLE REPLICA TRIGGER trigger_name | ENABLE ALWAYS TRIGGER trigger_name | DISABLE ROW LEVEL SECURITY | ENABLE ROW LEVEL SECURITY | FORCE ROW LEVEL SECURITY | NO FORCE ROW LEVEL SECURITY | REFRESH STORAGE ADD table_constraint [ NOT VALID ] 给表增加一个新的约束。与NOT VALID选项组合时,这种约束仅在对外键和CHECK类约束有效。 如果约束条件增加了NOT VALID选项后,表中已有记录是否满足初始约束检查会被跳过。 ADD table_constraint_using_index 根据已有唯一索引为表增加主键约束或唯一约束。 VALIDATE CONSTRAINT constraint_name 验证一个外键或是一个使用NOT VALID选项创建的检查类约束,通过扫描全表来保证所有记录都符合约束条件。如果约束已标记为有效时,什么操作也不会发生。 DROP CONSTRAINT [ IF EXISTS ] constraint_name [ RESTRICT | CASCADE ] 删除一个表上的约束。 CLUSTER ON index_name 为将来的CLUSTER操作选择默认索引。实际上并没有重新盘簇化处理该表。 SET WITHOUT CLUSTER 从表中删除最新使用的CLUSTER索引。这样会影响将来那些没有声明索引的集群操作。 SET ( {storage_parameter = value} [, ... ] ) 修改表的一个或多个存储参数。 RESET ( storage_parameter [, ... ] ) 重置表的一个或多个存储参数。与SET一样,根据参数的不同可能需要重写表才能获得想要的效果。 OWNER TO new_owner 将表、序列、视图的属主改变成指定的用户。 SET {COMPRESS|NOCOMPRESS} 修改表的压缩特性。表压缩特性的改变只会影响后续批量插入的数据的存储方式,对已有数据的存储毫无影响。也就是说,表压缩特性的修改会导致该表中同时存在着已压缩和未压缩的数据。 DISTRIBUTE BY { REPLICATION | ROUNDROBIN | { HASH ( column_name [,...] ) } } 修改表的分布方式,在修改表分布信息的同时会将表数据在物理上按新分布方式重新分布,修改完成后建议对被修改表执行ANALYZE,以便收集全新的统计信息。 本操作属于重大变更操作,涉及表分布信息的修改以及数据的物理重分布,修改过程中会阻塞业务,修改完成后原有业务的执行计划会发生变化,请按照正规变更流程进行。 本操作属于资源密集操作,针对大表的分布方式修改,建议在计算和存储资源充裕情况下进行,保证整个集群和原表所在表空间有足够的剩余空间能存储一张与原表同等大小且按照新分布方式进行分布的表。 TO { GROUP groupname | NODE ( nodename [, ... ] ) } 此语法仅在扩展模式(GUC参数support_extended_features为on时)下可用。该模式谨慎打开,主要供内部扩容工具使用,一般用户不应使用该模式。 ADD NODE ( nodename [, ... ] ) 此语法主要供内部扩容工具使用,一般用户不建议使用。 DELETE NODE ( nodename [, ... ] ) 此语法主要供内部缩容工具使用,一般用户不建议使用。 DISABLE TRIGGER [ trigger_name | ALL | USER ] 禁用trigger_name所表示的单个触发器,或禁用所有触发器,或仅禁用用户触发器(此选项不包括内部生成的约束触发器,例如,可延迟唯一性和排除约束的约束触发器)。 应谨慎使用此功能,因为如果不执行触发器,则无法保证原先期望的约束的完整性。 ENABLE TRIGGER [ trigger_name | ALL | USER ] 启用trigger_name所表示的单个触发器,或启用所有触发器,或仅启用用户触发器。 ENABLE REPLICA TRIGGER trigger_name 触发器触发机制受配置变量session_replication_role的影响,当复制角色为“origin”(默认值)或“local”时,将触发简单启用的触发器。 配置为ENABLE REPLICA的触发器仅在会话处于“replica”模式时触发。 ENABLE ALWAYS TRIGGER trigger_name 无论当前复制模式如何,配置为ENABLE ALWAYS的触发器都将触发。 DISABLE/ENABLE ROW LEVEL SECURITY 开启或关闭表的行访问控制开关。 当开启行访问控制开关时,如果未在该数据表定义相关行访问控制策略,数据表的行级访问将不受影响;如果关闭表的行访问控制开关,即使定义了行访问控制策略,数据表的行访问也不受影响。详细信息参见CREATE ROW LEVEL SECURITY POLICY章节。 NO FORCE/FORCE ROW LEVEL SECURITY 强制开启或关闭表的行访问控制开关。 默认情况,表所有者不受行访问控制特性影响,但当强制开启表的行访问控制开关时,表的所有者(不包含系统管理员用户)会受影响。系统管理员可以绕过所有的行访问控制策略,不受影响。 REFRESH STORAGE 根据OBS冷热表storage_policy所定义的规则,将符合条件的本地热分区切换为存储在OBS上的冷分区。 例如创建OBS冷热表时,设置storage_policy 为 'LMT:10',则在执行该操作时可将10日前无修改的分区切为冷存储,存至OBS中。 其中列相关的操作column_clause可以是以下子句之一: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 ADD [ COLUMN ] column_name data_type [ compress_mode ] [ COLLATE collation ] [ column_constraint [ ... ] ] | MODIFY [ COLUMN ] column_name data_type | MODIFY [ COLUMN ] column_name [ CONSTRAINT constraint_name ] NOT NULL [ ENABLE ] | MODIFY [ COLUMN ] column_name [ CONSTRAINT constraint_name ] NULL | MODIFY [ COLUMN ] column_name DEFAULT default_expr | MODIFY [ COLUMN ] column_name COMMENT comment_text | DROP [ COLUMN ] [ IF EXISTS ] column_name [ RESTRICT | CASCADE ] | ALTER [ COLUMN ] column_name [ SET DATA ] TYPE data_type [ COLLATE collation ] [ USING expression ] | ALTER [ COLUMN ] column_name { SET DEFAULT expression | DROP DEFAULT } | ALTER [ COLUMN ] column_name { SET | DROP } NOT NULL | ALTER [ COLUMN ] column_name SET STATIS TICS [PERCENT] integer | ADD STATISTI CS (( column_1_name, column_2_name [, ...] )) | ADD { INDEX | UNIQUE [ INDEX ] } [ index_name ] ( { { column_name | ( expression ) } [ COLLATE collation ] [ opclass ] [ ASC | DESC ] [ NULLS LAST ] } [, ...] ) [ USING method ] [ COMMENT 'text' ] LOCAL [ ( { PARTITION index_partition_name } [, ...] ) ] [ WITH ( { storage_parameter = value } [, ...] ) ] | ADD { INDEX | UNIQUE [ INDEX ] } [ index_name ] ({ { column_name | ( expression ) } [ COLLATE collation ] [ opclass ] [ ASC | DESC ] [ NULLS { FIRST | LAST } ] }[, ...] ) [ USING method ] [ COMMENT 'text' ] [ WITH ( {storage_parameter = value} [, ... ] ) ] [ WHERE predicate ] | DROP { INDEX | KEY } index_name | CHANGE [ COLUMN ] old_column_name new_column_name data_type [ [ CONSTRAINT constraint_name ] NOT NULL [ ENABLE ] | [ CONSTRAINT constraint_name ] NULL | DEFAULT default_expr | COMMENT 'text' ] | DELETE STATISTICS (( column_1_name, column_2_name [, ...] )) | ALTER [ COLUMN ] column_name SET ( {attribute_option = value} [, ... ] ) | ALTER [ COLUMN ] column_name RESET ( attribute_option [, ... ] ) | ALTER [ COLUMN ] column_name SET STORAGE { PLAIN | EXTERNAL | EXTENDED | MAIN } ADD [ COLUMN ] column_name data_type [ compress_mode ] [ COLLATE collation ] [ column_constraint [ ... ] ] 向表中增加一个新的字段。用ADD COLUMN增加一个字段,所有表中现有行都初始化为该字段的缺省值(如果没有声明DEFAULT子句,值为NULL)。 ADD ( { column_name data_type [ compress_mode ] } [, ...] ) 向表中增加多列。 MODIFY [ COLUMN ] column_name data_type 修改表已存在字段的数据类型。需注意:不支持修改分布列数据类型。 MODIFY [ COLUMN ] column_name [ CONSTRAINT constraint_name ] NOT NULL [ ENABLE ] 为表的某列添加not null约束,列存表暂不支持。 MODIFY [ COLUMN ] column_name [ CONSTRAINT constraint_name ] NULL 为表的某列移除not null约束。 MODIFY [ COLUMN ] column_name DEFAULT default_expr 修改表的default值。 MODIFY [ COLUMN ] column_name COMMENT comment_text 修改表的注释信息。 DROP [ COLUMN ] [ IF EXISTS ] column_name [ RESTRICT | CASCADE ] 从表中删除一个字段,和这个字段相关的索引和表约束也会被自动删除。如果任何表之外的对象依赖于这个字段,必须声明CASCADE ,比如外键参考、视图等。 DROP COLUMN命令并不是物理上把字段删除,而只是简单地把它标记为对SQL操作不可见。随后对该表的插入和更新将在该字段存储一个NULL。因此,删除一个字段是很快的,但是它不会立即释放表在磁盘上的空间,因为被删除了的字段占据的空间还没有回收。这些空间将在执行VACUUM时而得到回收。 ALTER [ COLUMN ] column_name [ SET DATA ] TYPE data_type [ COLLATE collation ] [ USING expression ] 改变表字段的数据类型,只允许相同大类的类型转换(数值之间,字符串之间,时间之间等)。该字段涉及的索引和简单的表约束将被自动地转换为使用新的字段类型,方法是重新分析最初提供的表达式。 ALTER TYPE要求重写整个表的特性有时候是一个优点,因为重写的过程消除了表中没用的空间。比如,要想立刻回收被一个已经删除的字段占据的空间,最快的方法是 1 ALTER TABLE table ALTER COLUMN anycol TYPE anytype; 这里的anycol是任何在表中还存在的字段,而anytype是和该字段的原类型一样的类型。这样的结果是在表上没有任何可见的语意的变化,但是这个命令强制重写,这样就删除了不再使用的数据。 ALTER [ COLUMN ] column_name { SET DEFAULT expression | DROP DEFAULT } 为一个字段设置或者删除缺省值。请注意缺省值只应用于随后的INSERT命令,它们不会修改表中已经存在的行。也可以为视图创建缺省,这个时候它们是在视图的ON INSERT规则应用之前插入到INSERT句中的。 ALTER [ COLUMN ] column_name { SET | DROP } NOT NULL 修改一个字段是否允许NULL值或者拒绝NULL值。如果表在字段中包含非NULL,则只能使用SET NOT NULL。 ALTER [ COLUMN ] column_name SET STATISTICS [PERCENT] integer 为随后的ANALYZE操作设置针对每个字段的统计收集目标。目标的范围可以在0到10000之内设置。设置为-1时表示重新恢复到使用系统缺省的统计目标。 {ADD | DELETE} STATISTICS ((column_1_name, column_2_name [, ...])) 用于添加和删除多列统计信息声明(不实际进行多列统计信息收集),以便在后续进行全表或全库analyze时进行多列统计信息收集。每组多列统计信息最多支持32列。不支持添加/删除多列统计信息声明的表:系统表、外表。 ADD { INDEX | UNIQUE [ INDEX ] } [ index_name ] ( { { column_name | ( expression ) } [ COLLATE collation ] [ opclass ] [ ASC | DESC ] [ NULLS LAST ] } [, ...] ) [ USING method ] [ COMMENT 'text' ] LOCAL [ ( { PARTITION index_partition_name } [, ...] ) ] [ WITH ( { storage_parameter = value } [, ...] ) ] 为表的分区表创建索引,具体参数可参考CREATE INDEX。 ADD { INDEX | UNIQUE [ INDEX ] } [ index_name ] ({ { column_name | ( expression ) } [ COLLATE collation ] [ opclass ] [ ASC | DESC ] [ NULLS { FIRST | LAST } ] }[, ...] ) [ USING method ] [ COMMENT 'text' ] [ WITH ( {storage_parameter = value} [, ... ] ) ] [ WHERE predicate ] 在表上创建索引,具体参数可参考CREATE INDEX。 DROP { INDEX | KEY } index_name 删除一个表上的索引。 CHANGE [ COLUMN ] old_column_name new_column_name data_type [ [ CONSTRAINT constraint_name ] NOT NULL [ ENABLE ] | [ CONSTRAINT constraint_name ] NULL | DEFAULT default_expr | COMMENT 'text' ] 修改表中列信息,可将旧列名修改成新列名,以及修改列字段信息。 ALTER [ COLUMN ] column_name SET ( {attribute_option = value} [, ... ] ) ALTER [ COLUMN ] column_name RESET ( attribute_option [, ... ] ) 设置/重置属性选项。 属性选项定义的参数有:n_distinct、n_distinct_inherited和cstore_cu_sample_ratio。n_distinct设置并固定表的distinct值统计信息,n_distinct_inherited设置并固定继承表的distinct值统计信息,cstore_cu_sample_ratio设置对cstore列存表进行analyze时所选CU的比例。目前,禁止SET/RESET n_distinct_inherited参数。 n_distinct 手动设置该列的distinct值统计信息。 取值范围:-1.0 ~ INT_MAX 默认值:0,表示不设置。 n_distinct_inherited 手动设置继承表的该列的distinct值统计信息。 取值范围:-1.0 ~ INT_MAX 默认值:0,表示不设置。 cstore_cu_sample_ratio 设置列存表执行analyze,计算需要采样的CU个数时,需要扩大的倍数。 取值范围:1.0 ~ 10000.0 默认值:1.0 ALTER [ COLUMN ] column_name SET STORAGE { PLAIN | EXTERNAL | EXTENDED | MAIN } 为一个字段设置存储模式。这个设置控制这个字段是内联保存还是保存在一个附属的表里,以及数据是否要压缩。仅支持对行存表的设置;对列存表没有意义,执行时报错。SET STORAGE本身并不改变表上的任何东西,只是设置将来的表操作时,建议使用的策略。 其中列约束column_constraint为: 1 2 3 4 5 6 7 8 [ CONSTRAINT constraint_name ] { NOT NULL | NULL | CHECK ( expression ) | DEFAULT default_expr | UNIQUE index_parameters | PRIMARY KEY index_parameters } [ DEFERRABLE | NOT DEFERRABLE | INITIALLY DEFERRED | INITIALLY IMMEDIATE ] 其中列的压缩可选项compress_mode为: 1 [ DELTA | PREFIX | DICTIONARY | NUMSTR | NOCOMPRESS ] 其中根据已有唯一索引为表增加主键约束或唯一约束table_constraint_using_index为: 1 2 3 [ CONSTRAINT constraint_name ] { UNIQUE | PRIMARY KEY } USING INDEX index_name [ DEFERRABLE | NOT DEFERRABLE | INITIALLY DEFERRED | INITIALLY IMMEDIATE ] 其中表约束table_constraint为: 1 2 3 4 5 6 [ CONSTRAINT constraint_name ] { CHECK ( expression ) | UNIQUE ( column_name [, ... ] ) index_parameters | PRIMARY KEY ( column_name [, ... ] ) index_parameters } [ DEFERRABLE | NOT DEFERRABLE | INITIALLY DEFERRED | INITIALLY IMMEDIATE ] 其中索引参数index_parameters为: 1 2 [ WITH ( {storage_parameter = value} [, ... ] ) ] [ USING INDEX TABLESPACE tablespace_name ]
  • 注意事项 只有表的所有者或者被授予了表ALTER权限的用户有权限执行ALTER TABLE命令,系统管理员默认拥有此权限。若要修改表的所有者或者修改表的模式,当前用户必须是该表的所有者或者系统管理员,且该用户是新的所有角色的直接或间接成员。 不支持修改存储参数ORIENTATION。 SET SCHEMA操作不支持修改为系统内部模式,当前仅支持用户模式之间的修改。 列存表支持PARTIAL CLUSTER KEY,不支持外键表级约束。列存表从8.1.1版本开始在创建表时支持创建主键和唯一表级约束。 行存REPLICATION分布表不支持将系统列设置为主键。 列存表支持添加字段ADD COLUMN,修改字段的数据类型ALTER TYPE,设置单个字段的收集目标SET STATISTICS,支持更改表名字,支持删除字段DROP COLUMN;对于添加的字段和修改的字段类型要求是列存支持的数据类型;ALTER TYPE的USING选项只支持常量表达式和涉及本字段的表达式,暂不支持涉及其他字段的表达式。 列存表支持的字段约束包括NULL、NOT NULL和DEFAULT常量值;对字段约束的修改当前支持对DEFAULT值的修改(SET DEFAULT)、删除(DROP DEFAULT)和NOT NULL约束的删除;支持对非空约束NULL/NOT NULL的删除(DROP NOT NULL),暂不支持对非空约束NULL/NOT NULL的修改(SET NOT NULL)。 修改列存表存储参数COLVERSION或者enable_delta时,不能与其他ALTER操作同时进行。
  • 示例 创建范围分区表customer_address: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 DROP TABLE IF EXISTS customer_address; CREATE TABLE customer_address ( ca_address_sk INTEGER NOT NULL , ca_address_id CHARACTER(16) NOT NULL , ca_street_number CHARACTER(10) , ca_street_name CHARACTER varying(60) , ca_street_type CHARACTER(15) , ca_suite_number CHARACTER(10) ) DISTRIBUTE BY HASH (ca_address_sk) PARTITION BY RANGE(ca_address_sk) ( PARTITION P1 VALUES LESS THAN(100), PARTITION P2 VALUES LESS THAN(200), PARTITION P3 VALUES LESS THAN(300) ); 创建list分区表: DROP TABLE IF EXISTS data_list; CREATE TABLE data_list( id int, time int, sarlay decimal(12,2) )PARTITION BY LIST (time)( PARTITION P1 VALUES (202209), PARTITION P2 VALUES (202210,202208), PARTITION P3 VALUES (202211), PARTITION P4 VALUES (202212), PARTITION P5 VALUES (202301) ); modify_clause子句用于设置分区索引是否可用。 给分区表customer_address创建LOCAL索引student_grade_index,并指定分区的索引名称: 1 2 3 4 5 6 CREATE INDEX customer_address_index ON customer_address(ca_address_id) LOCAL ( PARTITION P1_index, PARTITION P2_index, PARTITION P3_inde ); 重建分区表customer_address中分区P1上的所有索引: 1 ALTER TABLE customer_address MODIFY PARTITION P1 REBUILD UNUSABLE LOCAL INDEXES; 设置分区表customer_address的分区P3上的所有索引不可用: 1 ALTER TABLE customer_address MODIFY PARTITION P3 UNUSABLE LOCAL INDEXES; add_clause子句用于为指定的分区表添加一个或多个分区。 为范围分区表customer_address增加分区: 1 ALTER TABLE customer_address ADD PARTITION P5 VALUES LESS THAN (500); 为范围分区表customer_address增加分区: [500, 600), [600, 700): 1 ALTER TABLE customer_address ADD PARTITION p6 START(500) END(700) EVERY(100); 为范围分区表customer_address增加MAXVALUE分区p7: 1 ALTER TABLE customer_address ADD PARTITION p7 END(MAXVALUE); 为列表分区表增加分区P6: 1 ALTER TABLE data_list ADD PARTITION P6 VALUES (202302,202303); split_clause子句用于把一个分区切割成多个分区。 将范围分区表customer_address的P7分区以800为分割点切分: 1 ALTER TABLE customer_address SPLIT PARTITION P7 AT(800) INTO (PARTITION P6a,PARTITION P6b); 将范围分区表customer_address中400所在的分区分割成多个分区: 1 ALTER TABLE customer_address SPLIT PARTITION FOR(400) INTO(PARTITION p_part START(300) END(500) EVERY(100)); 将列表分区表data_list的分区P2分割成p2a和p2b两个分区: 1 ALTER TABLE data_list SPLIT PARTITION P2 VALUES(202210) INTO (PARTITION p2a,PARTITION p2b); exchange_clause子句:把普通表的数据迁移到指定的分区。 下面示例演示了把一个普通表math_grade数据迁移到分区表student_grade中分区(math)的操作。创建分区表student_grade : 1 2 3 4 5 6 7 8 9 10 11 12 13 CREATE TABLE student_grade ( stu_name char(5), stu_no integer, grade integer, subject varchar(30) ) PARTITION BY LIST(subject) ( PARTITION gym VALUES('gymnastics'), PARTITION phys VALUES('physics'), PARTITION history VALUES('history'), PARTITION math VALUES('math') ); 插入数据到分区表student_grade中: 1 2 3 4 5 6 7 INSERT INTO student_grade VALUES ('Ann', 20220101, 75, 'gymnastics'), ('Jeck', 20220103, 60, 'math'), ('Anna', 20220108, 56, 'history'), ('Jann', 20220107, 82, 'physics'), ('Molly', 20220104, 91, 'physics'), ('Sam', 20220105, 72, 'math'); 查询分区表student_grade的math分区记录: 1 SELECT * FROM student_grade PARTITION (math); 图1 查询分区记录 创建一个与分区表student_grade定义匹配的普通表math_grade: 1 2 3 4 5 6 7 CREATE TABLE math_grade ( stu_name char(5), stu_no integer, grade integer, subject varchar(30) ); 插入数据到表math_grade中。数据与分区表student_grade的math分区的分区规则一致: 1 2 3 4 5 INSERT INTO math_grade VALUES ('Ann', 20220101, 75, 'math'), ('Jeck', 20220103, 60, 'math'), ('Anna', 20220108, 56, 'math'), ('Jann', 20220107, 82, 'math'); 将普通表math_grade数据迁移到分区表student_grade中分区(math): 1 ALTER TABLE student_grade EXCHANGE PARTITION (math) WITH TABLE math_grade; 查询分区表student_grade,结果显示表math_grade中的数据已和分区表student_grade的分区math中的数据交换: 1 SELECT * FROM student_grade PARTITION (math); 图2 查询结果 查询表math_grade,显示之前存储在分区表student_grade的分区math中的数据已交换到表math_grade中: 1 SELECT * FROM math_grade; 图3 查询math_grade结果 row_clause子句用于设置分区表的行迁移开关。 打开分区表customer_address的迁移开关: 1 ALTER TABLE customer_address ENABLE ROW MOVEMENT; merge_clause子句用于把多个分区合并成一个分区。 将范围分区表customer_address的P2,P3两个分区合并为一个分区: 1 ALTER TABLE customer_address MERGE PARTITIONS P2, P3 INTO PARTITION P_M; drop_clause子句用于删除分区表中的指定分区。 删除分区表customer_address的分区P2: 1 ALTER TABLE customer_address DROP PARTITION P2; 删除分区表customer_address的多个分区P6a,P6b: 1 ALTER TABLE customer_address DROP PARTITION P6a, P6b;
  • 参数说明 table_name 分区表名。 取值范围:已存在的分区表名。 partition_name 分区名。 取值范围:已存在的分区名。 partition_value 分区键值。 通过PARTITION FOR ( partition_value [, ...] )子句指定的这一组值,可以唯一确定一个分区。 取值范围:需重命名的分区的分区键的取值范围。 UNUSABLE LOCAL INDEXES 设置该分区上的所有索引不可用。 REBUILD UNUSABLE LOCAL INDEXES 重建该分区上的所有索引。 ENABLE/DISABLE ROW MOVEMENT 行迁移开关。 取值范围: ENABLE:打开行迁移开关。 DISABLE:关闭行迁移开关。 默认是关闭状态。 ENABLE ROW MOVEMENT开启则允许跨分区更新,但此时如果有SELECT FOR UPDATE查询该分区表并发执行,存在查询结果瞬时不一致的可能性,需要谨慎使用。 如果进行UPDATE操作时,更新了元组在分区键上的值,造成了该元组所在分区发生变化,就会根据该开关给出报错信息,或者进行元组在分区间的转移。 ordinary_table_name 进行迁移的普通表的名称。 取值范围:已存在的普通表名。 { WITH | WITHOUT } VALIDATION 在进行数据迁移时,是否检查普通表中的数据满足指定分区的分区键范围。 取值范围: WITH:对于普通表中的数据要检查是否满足分区的分区键范围,如果有数据不满足,则报错。 WITHOUT:对于普通表中的数据不检查是否满足分区的分区键范围。 默认是WITH状态。 由于检查比较耗时,特别是当数据量很大的情况下更甚。所以在保证当前普通表中的数据满足分区的分区键范围时,可以加上WITHOUT来指明不进行检查。 VERBOSE 在VALIDATION是WITH状态时,如果检查出普通表有不满足要交换分区的分区键范围的数据,那么把这些数据插入到正确的分区,如果路由不到任何分区,再报错。 只有在VALIDATION是WITH状态时,才可以指定VERBOSE。 partition_new_name 分区的新名字。 取值范围:字符串,要符合标识符的命名规范。
  • 语法格式 修改表分区主语法。 1 2 ALTER TABLE [ IF EXISTS ] { table_name [*] | ONLY table_name | ONLY ( table_name )} action [, ... ]; 其中action统指如下分区维护子语法。当存在多个分区维护子句时,保证了分区的连续性,无论这些子句的排序如何, GaussDB (DWS)总会先执行DROP PARTITION再执行ADD PARTITION操作,最后顺序执行其它分区维护操作。 1 2 3 4 5 6 7 exchange_clause | row_clause | merge_clause | modify_clause | split_clause | add_clause | drop_clause exchange_clause子语法用于把普通表的数据迁移到指定的分区。 1 2 3 EXCHANGE PARTITION { ( partition_name ) | FOR ( partition_value [, ...] ) } WITH TABLE {[ ONLY ] ordinary_table_name | ordinary_table_name * | ONLY ( ordinary_table_name )} [ { WITH | WITHOUT } VALIDATION ] [ VERBOSE ] 进行交换的普通表和分区表必须满足如下条件: 普通表和分区表的列数目相同,对应列的信息严格一致,包括:列名、列的数据类型、列约束、列的Collation信息、列的存储参数、列的压缩信息、已删除字段的数据类型等。 普通表和分区表的表压缩信息严格一致。 普通表和分区表的分布列信息严格一致。 普通表和分区表的索引个数相同,且对应索引的信息严格一致。 普通表和分区表的表约束个数相同,且对应表约束的信息严格一致。 普通表不可以是临时表和unlogged表。 普通表和分区表必须在同一个逻辑集群或节点组(NodeGroup)中。 如果行存分区表中最后一个有效字段后的其他字段全部被删除,在不考虑这些删除字段的情况下,分区表与普通表字段信息一致时,分区表和普通表可以进行交换。 列存普通表和列存分区表的表级参数colversion必须一致:禁止colversion2.0与colversion1.0执行交换分区操作。 完成交换后,普通表和分区表的数据被置换,同时普通表和分区表的表空间信息被置换。此时,普通表和分区表的统计信息变得不可靠,需要对普通表和分区表重新执行analyze。 row_clause子语法用于设置分区表的行迁移开关。 1 { ENABLE | DISABLE } ROW MOVEMENT merge_clause子语法用于把多个分区合并成一个分区。 1 MERGE PARTITIONS { partition_name } [, ...] INTO PARTITION partition_name INTO关键字前的分区称为源分区,INTO关键字后的分区称为目标分区。 源分区个数不能小于2个,不能大于32个。 源分区名称不能重复。 源分区不能存在unusable的索引,否则执行会报错。 目标分区名只能跟最后一个源分区的名称相同,或者跟表的所有分区名都不相同。 目标分区的边界是所有源分区边界的并集。 对于范围分区表,所有的源分区必须是边界连续的分区。 对于列表分区,如果源分区中包含DEFAULT分区,那么目标分区的边界也是DEFAULT。 modify_clause子语法用于设置分区索引是否可用。 1 MODIFY PARTITION partition_name { UNUSABLE LOCAL INDEXES | REBUILD UNUSABLE LOCAL INDEXES } split_clause子语法用于把一个分区切割成多个分区。 范围分区的split_clause语法如下: 1 SPLIT PARTITION { partition_name | FOR ( partition_value [, ...] ) } { split_point_clause | no_split_point_clause } 指定切割点split_point_clause的语法为: 1 AT ( partition_value ) INTO ( PARTITION partition_name , PARTITION partition_name ) 切割点的大小要位于正在被切割分区的分区键范围内,指定切割点的方式只能把一个分区切割成两个新分区。 不指定切割点no_split_point_clause的语法为: 1 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支持的分区键个数最多为4,而partition_start_end_item仅支持1个分区键,其支持的数据类型参见Partition Key。 在同一语句中partition_less_than_item和partition_start_end_item两者不可同时使用;不同split语句之间没有限制。 分区项partition_less_than_item的语法为: 1 2 PARTITION partition_name VALUES LESS THAN ( { partition_value | MAXVALUE } [, ...] ) 分区项partition_start_end_item的语法为,其约束参见START END语法描述。 1 2 3 4 5 6 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})} } 列表分区的split_clause语法如下: 1 SPLIT PARTITION { partition_name | FOR ( partition_value [, ...] ) } { split_values_clause | split_no_values_clause } 指定切割点的split_values_clause的语法为: 1 VALUES ( { (partition_value) [, ...] } | DEFAULT } ) INTO ( PARTITION partition_name , PARTITION partition_name ) 如果源分区不是DEFAULT分区,那么切割点所指定的边界是源分区边界的一个非空真子集;如果源分区是DEFAULT分区,那么切割点所指定的边界不能和其它非DEFAULT分区的边界存在重叠。 切割点的指定的边界是INTO关键字后面的第一个分区的边界,源分区边界与切割点的指定的边界的差集是第二个分区的边界。 当源分区是DEFAULT分区时,第二个分区的边界还是DEFAULT。 不指定切割点的split_no_values_clause的语法为: 1 INTO ( list_partition_item [, ....], PARTITION partition_name ) 此处的list_partition_item和创建列表分区表的时候指定分区的语法一样,除了此处的分区定义中边界值不能为DEFAULT。 除了最后一个分区,其他分区需要显式定义边界,定义的边界不能是DEFAULT,并且必须是源分区边界的非空真子集。最后一个分区的边界是源分区边界与其它分区边界的差集,且最后一个分区的边界为空(即差集不能为空集)。 如果源分区是DEFAULT分区,则最后一个分区的边界为DEFAULT。 add_clause子语法用于为指定的分区表添加一个或多个分区。 范围分区的add_clause语法如下: 1 ADD { partition_less_than_item... | partition_start_end_item } 使用partition_less_than_item语法时,分区表必须是范围分区表,否则执行会报错。 此处partition_less_than_item和创建范围分区表的时候指定分区的语法一样。 当前分区表的最后一个分区的边界为MAXVALUE,不允许添加新的分区,否则执行会报错。 列表分区的add_clause语法如下: 1 ADD list_partition_item 使用list_partition_item语法时,分区表必须是列表分区表,否则执行会报错 此处的list_partition_item和创建列表分区表的时候指定分区的语法一样 当前分区表存在DEFAULT分区时,不允许添加新的分区动作,否则执行会报错 drop_clause子语法用于删除分区表中的指定分区。 1 DROP PARTITION { partition_name | FOR ( partition_value [, ...] ) } drop_clause子语法支持删除多个分区语法。(8.1.3.100及以上集群版本支持。) 1 DROP PARTITION { partition_name [, ... ] } 修改表分区名的语法。 1 2 ALTER TABLE [ IF EXISTS ] { table_name [*] | ONLY table_name | ONLY ( table_name )} RENAME PARTITION { partition_name | FOR ( partition_value [, ...] ) } TO partition_new_name;
  • 注意事项 添加分区的名称不能与该分区表已有分区的名称相同。 对于范围分区表,要添加的分区的边界值要和分区表的分区键的类型一致,且要大于分区表的最后一个分区的上边界。 对于列表分区表,如果已经定义DEFAULT分区,则不能添加新分区。 若文档中未特殊注明,则表明范围分区表和列存分区的语法使用相同。 如果目标分区表中已有分区数达到了最大值(32767),则不能继续添加分区。 当分区表只有一个分区时,不能删除该分区。 删除分区(DROP PARTITION)时会连同分区内数据一起删除。 选择分区使用PARTITION FOR(),括号里指定值个数应该与定义分区时使用的列个数相同,并且一一对应。 Value分区表不支持相应的Alter Partition操作。 OBS冷热表对于move,exchange,merge,split操作,不支持指定分区表表空间为OBS表空间;执行ALTER语法时,需保持分区数据冷热属性不变(即冷分区操作后为冷分区,热分区操作后为热分区),不支持将冷分区数据切至本地表空间;对于冷分区仅支持默认表空间;merge操作不支持将冷分区与热分区进行合并,exchange操作不支持冷分区交换。 避免在业务高峰期执行ALTER TABLE/ALTER TABLE PARTITION(增删改查、DROP PARTITION)、TRUNCATE操作,避免有长SQL阻塞ALTER、TRUNCATE操作或SQL业务被ALTER、TRUNCATE阻塞。 更多开发设计规范参见总体开发设计规范。
  • 语法格式 修改词典定义。 1 2 3 ALTER TEXT SEARCH DICTIONARY name ( option [ = value ] [, ... ] ); 重命名词典。 1 ALTER TEXT SEARCH DICTIONARY name RENAME TO new_name; 设置词典的所属模式。 1 ALTER TEXT SEARCH DICTIONARY name SET SCHEMA new_schema; 修改词典的所属者。 1 ALTER TEXT SEARCH DICTIONARY name OWNER TO new_owner;
  • 示例 创建全文检索词典my_dict。 1 2 3 4 5 CREATE TEXT SEARCH DICTIONARY my_dict ( TEMPLATE = snowball, Language = english, StopWords = english ); 修改全文检索词典my_dict的停用词定义,其他参数保持不变。 认证用的AK和SK硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全。 1 ALTER TEXT SEARCH DICTIONARY my_dict (StopWords = newrussian, FilePath = 'obs://bucket_name/path accesskey=ak secretkey=sk region=rg' ); 修改全文检索词典my_dict的Language参数,并删除停用词定义。 1 ALTER TEXT SEARCH DICTIONARY my_dict (Language = dutch, StopWords); 更新全文检索词典my_dict定义,实际不更改任何内容。 1 ALTER TEXT SEARCH DICTIONARY my_dict (dummy);
  • 参数说明 name 已存在的词典名(可指定模式名,否则默认在当前模式下)。 取值范围:已存在的词典名。 option 要修改的参数名。与template对应,不同的词典类型具有不同的参数列表,且与指定顺序无关。详细参数说明请见option。 不支持修改词典的TEMPLATE参数值。 不支持仅修改FILEPATH参数而不修改对应的词典定义文件参数。 词典定义文件的文件名仅支持小写字母、数据、下划线混合。 value 要修改的参数值。如果省略等号(=)和value,则表示删除该option的先前设置,使用默认值。 取值范围:对应option定义。 new_name 词典的新名称。 取值范围:符合标识符命名规范的字符串,且最大长度不超过63个字符。 new_owner 词典新的所有者。 取值范围:已存在的用户。 new_schema 词典的新模式。 取值范围:已存在的模式。
  • 背景 目前在互联网、教育、游戏等行业都有实时精准营销的需求。通过系统生成用户画像,在营销时通过条件组合筛选用户,快速提取目标群体。例如: 在电商行业中,商家在进行营销活动前,需要根据活动的目的,圈选一批满足特定特征的目标用户群体进行广告推送。 在教育行业中,需要根据学生不同的特征,推送有针对性的练习题目,帮助学生查漏补缺。 在搜索、视频、门户网站中,根据用户关注的热点,推送不同的内容。 这些业务场景都有一些共同的特点: 数据量庞大,运算量极大。 用户规模庞大,标签多,字段多,占用存储空间也多。 圈选的特征条件多样化,很难找到固定索引,如果每个字段一个索引,存储空间又会暴增。 性能要求高,因为实时营销要求秒级响应。 数据更新时效要求高,用户画像几乎要求实时更新。 针对上述业务场景特点,GaussDB(DWS)的roaringbitmap可以高效生成、压缩、解析位图数据,支持最常见的位图聚合操作(与、或、非、异或),满足用户在亿级以上、千万级标签的大数据量下实时精准营销、快速圈选用户的需求。
  • 示例 创建用户: 1 2 CREATE USER joe PASSWORD '{Password}'; CREATE USER kim PASSWORD '{Password}'; 创建模式: 1 CREATE SCHEMA tpcds; 创建表: 1 CREATE TABLE IF NOT EXISTS tpcds.reason(r_reason_sk int,r_reason_id int,r_reason_desc int); 将系统权限授权给用户或者角色。 将sysadmin所有可用权限授权给joe用户: 1 GRANT ALL PRIVILEGES TO joe; 授权成功后,用户joe会拥有sysadmin的所有权限。 将对象权限授权给用户或者角色。 将表tpcds.reason的SELECT权限授权给用户joe: 1 GRANT SELECT ON TABLE tpcds.reason TO joe; 将表tpcds.reason的所有权限授权给用户kim: 1 GRANT ALL PRIVILEGES ON tpcds.reason TO kim; 授权成功后,kim用户就拥有了tpcds.reason表的所有权限,包括增删改查等权限。 将模式tpcds的使用权限授权给用户joe: 1 GRANT USAGE ON SCHEMA tpcds TO joe; 授权成功后,joe用户就拥有了模式schema的USAGE权限,允许访问包含在指定模式schema中的对象。 将tpcds.reason表中r_reason_sk、r_reason_id、r_reason_desc列的查询权限,r_reason_desc的更新权限授权给joe: 1 GRANT select (r_reason_sk,r_reason_id,r_reason_desc),update (r_reason_desc) ON tpcds.reason TO joe; 授权成功后,用户joe对tpcds.reason表中r_reason_sk,r_reason_id的查询权限会立即生效。 1 GRANT select (r_reason_sk, r_reason_id) ON tpcds.reason TO joe ; 将函数func_add_sql的EXECUTE权限授权给用户joe。 1 2 3 4 5 6 CREATE FUNCTION func_add_sql(integer, integer) RETURNS integer AS 'select $1 + $2;' LANGUAGE SQL IMMUTABLE RETURNS NULL ON NULL INPUT; GRANT EXECUTE ON FUNCTION func_add_sql(integer, integer) TO joe; 将序列serial的UPDATE权限授权给joe用户。 1 2 CREATE SEQUENCE serial START 101 CACHE 20; GRANT UPDATE ON SEQUENCE serial TO joe; 将数据库gaussdb的连接权限授权给用户joe,并给予其在gaussdb中创建schema的权限: 1 GRANT create,connect on database gaussdb TO joe ; 将模式tpcds的访问权限授权给角色joe,并授予该角色在tpcds下创建对象的权限,不允许该角色中的用户将权限授权给其他人: 1 GRANT USAGE,CREATE ON SCHEMA tpcds TO joe; 将用户或者角色的权限授权给其他用户或角色。 将用户joe的权限授权给用户kim,并允许该角色将权限授权给其他人: 1 GRANT joe TO kim WITH ADMIN OPTION; 将用户joe的权限授权给kim用户: 1 GRANT joe TO kim;
  • 参数说明 GRANT的权限分类如下所示。 SELECT 允许对指定的表、视图、序列执行SELECT语句。 INSERT 允许对指定的表执行INSERT语句。 UPDATE 允许对声明的表中任意字段执行UPDATE语句。SELECT… FOR UPDATE和SELECT… FOR SHARE除了需要SELECT权限外,还需要UPDATE权限。 DELETE 允许执行DELETE语句删除指定表中的数据。 TRUNCATE 允许执行TRUNCATE语句删除指定表中的所有记录。 REFEREN CES 创建一个外键约束,必须拥有参考表和被参考表的REFERENCES权限。 TRIGGER 创建一个触发器,必须拥有表或视图的TRIGGER权限。 ANALYZE | ANALYSE 对表执行ANALYZE | ANALYSE操作来收集表的统计信息,必须拥有表的ANALYZE | ANALYSE权限。 CREATE 对于数据库,允许在数据库里创建新的模式。 对于模式,允许在模式中创建新的对象。如果要重命名一个对象,用户除了必须是该对象的所有者外,还必须拥有该对象所在模式的CREATE权限。 对于子集群,允许在子集群中创建表对象。 CONNECT 允许用户连接到指定的数据库。 TEMPORARY | TEMP 允许在使用指定数据库时创建临时表。 EXECUTE 允许使用指定的函数,以及利用这些函数实现的操作符。 USAGE 对于过程语言,允许用户在创建函数的时候指定过程语言。 对于模式,USAGE允许访问包含在指定模式中的对象,若没有该权限,则只能看到这些对象的名字。 对于序列,USAGE允许使用nextval函数。 对于子集群, 对包含在指定模式中的对象有访问权限时,USAGE允许访问指定子集群下的表对象。 COMPUTE 针对计算子集群,允许用户在具有compute权限的计算子集群上进行弹性计算。 ALL PRIVILEGES 一次赋予指定用户/角色所有可赋予的权限。只有系统管理员有权执行GRANT ALL PRIVILEGES。 WITH GRANT OPTION 指定权限是否允许转授。如果声明了WITH GRANT OPTION,则被授权的用户也可以将此权限赋予他人,否则就不能授权给他人。这个选项不能赋予PUBLIC。 NODE GROUP不支持WITH GRANT OPTION功能。 使用with grant option时需确保enable_grant_option参数设置为on。 WITH ADMIN OPTION 指定权限是否允许转授。如果声明了WITH ADMIN OPTION,角色的成员又可以将角色的成员身份授予其他人。 GRANT的参数说明如下所示。 role_name 已存在用户名称。 table_name 已存在表名称。 column_name 已存在字段名称。 schema_name 已存在模式名称。 database_name 已存在数据库名称。 function_name 已存在函数名称。 sequence_name 已存在序列名称。 domain_name 已存在域类型名称。 fdw_name 已存在外部数据包名称。 lang_name 已存在语言名称。 type_name 已存在类型名称。 group_name 已存在的子集群名称。 argmode 参数模式。 取值范围:字符串,要符合标识符命名规范。 arg_name 参数名称。 取值范围:字符串,要符合标识符命名规范。 arg_type 参数类型。 取值范围:字符串,要符合标识符命名规范。 loid 包含本页的大对象的标识符。 取值范围:字符串,要符合标识符命名规范。
  • 功能描述 对角色和用户进行授权操作。 使用GRANT命令进行用户授权包括以下三种场景: 将系统权限授权给角色或用户 系统权限又称为用户属性,包括SYSADMIN、CREATEDB、CREATEROLE、AUDITADMIN和 LOG IN。 系统权限一般通过CREATE/ALTER ROLE语法来指定。其中,SYSADMIN权限可以通过GRANT/REVOKE ALL PRIVILEGE授予或撤销。但系统权限无法通过ROLE和USER的权限被继承,也无法授予PUBLIC。 将数据库对象授权给角色或用户 将数据库对象(表和视图、指定字段、数据库、函数、模式等)的相关权限授予特定角色或用户。 GRANT命令将数据库对象的特定权限授予一个或多个角色。这些权限会追加到已有的权限上。 关键字PUBLIC表示该权限要赋予所有角色,包括以后创建的用户。PUBLIC可以看做是一个隐含定义好的组,它总是包括所有角色。任何角色或用户都将拥有通过GRANT直接赋予的权限和所属的权限,再加上PUBLIC的权限。 如果声明了WITH GRANT OPTION,则被授权的用户也可以将此权限赋予他人,否则就不能授权给他人。这个选项不能赋予PUBLIC,这是GaussDB(DWS)特有的属性。 GaussDB(DWS)会将某些类型的对象上的权限授予PUBLIC。默认情况下,对表、表字段、序列、外部数据源、外部服务器、模式或表空间对象的权限不会授予PUBLIC,而以下这些对象的权限会授予PUBLIC:数据库的CONNECT权限和CREATE TEMP TABLE权限、函数的EXECUTE特权、语言和数据类型(包括域)的USAGE特权。对象拥有者可以撤销默认授予PUBLIC的权限并专门授予权限给其他用户。为了更安全,建议在同一个事务中创建对象并设置权限,这样其他用户就没有时间窗口使用该对象。另外,这些初始的默认权限可以使用ALTER DEFAULT PRIVILEGES命令修改。 将角色或用户的权限授权给其他角色或用户 将一个角色或用户的权限授予一个或多个其他角色或用户。在这种情况下,每个角色或用户都可视为拥有一个或多个数据库权限的集合。 当声明了WITH ADMIN OPTION,被授权的用户可以将该权限再次授予其他角色或用户,以及撤销所有由该角色或用户继承到的权限。当授权的角色或用户发生变更或被撤销时,所有继承该角色或用户权限的用户拥有的权限都会随之发生变更。 数据库系统管理员可以给任何角色或用户授予/撤销任何权限。拥有CREATEROLE权限的角色可以赋予或者撤销任何非系统管理员角色的权限。
  • 语法格式 将表或视图的访问权限赋予指定的用户或角色。不允许对表分区进行GRANT操作,对表分区进行GRANT操作会引起告警。 1 2 3 4 5 6 GRANT { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER | ANALYZE | ANALYSE | VACUUM | ALTER | DROP } [, ...] | ALL [ PRIVILEGES ] } ON { [ TABLE ] table_name [, ...] | ALL TABLES IN SCHEMA schema_name [, ...] } TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]; 将表中字段的访问权限赋予指定的用户或角色。 1 2 3 4 5 GRANT { {{ SELECT | INSERT | UPDATE | REFERENCES } ( column_name [, ...] )} [, ...] | ALL [ PRIVILEGES ] ( column_name [, ...] ) } ON [ TABLE ] table_name [, ...] TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]; 将数据库的访问权限赋予指定的用户或角色。 1 2 3 4 5 GRANT { { CREATE | CONNECT | TEMPORARY | TEMP } [, ...] | ALL [ PRIVILEGES ] } ON DATABASE database_name [, ...] TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]; 将域的访问权限赋予指定的用户或角色。 1 2 3 4 GRANT { USAGE | ALL [ PRIVILEGES ] } ON DOMAIN domain_name [, ...] TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]; 当前版本暂时不支持赋予域的访问权限。 将外部数据源的访问权限赋予给指定的用户或角色。 1 2 3 4 GRANT { USAGE | ALL [ PRIVILEGES ] } ON FOREIGN DATA WRAPPER fdw_name [, ...] TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]; 将外部服务器的访问权限赋予给指定的用户或角色。 1 2 3 4 GRANT { USAGE | ALL [ PRIVILEGES ] } ON FOREIGN SERVER server_name [, ...] TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]; 将函数的访问权限赋予给指定的用户或角色。 1 2 3 4 5 GRANT { EXECUTE | ALL [ PRIVILEGES ] } ON { FUNCTION {function_name ( [ {[ argmode ] [ arg_name ] arg_type} [, ...] ] )} [, ...] | ALL FUNCTIONS IN SCHEMA schema_name [, ...] } TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]; 将过程语言的访问权限赋予给指定的用户或角色。 1 2 3 4 GRANT { USAGE | ALL [ PRIVILEGES ] } ON LANGUAGE lang_name [, ...] TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]; 当前版本暂时不支持过程语言。 将大对象的访问权限赋予指定的用户或角色。 1 2 3 4 GRANT { { SELECT | UPDATE } [, ...] | ALL [ PRIVILEGES ] } ON LARGE OBJECT loid [, ...] TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]; 当前版本暂时不支持大对象。 将序列的访问权限赋予指定的用户或角色。 1 2 3 4 5 GRANT { { SELECT | UPDATE | USAGE } [, ...] | ALL [ PRIVILEGES ] } ON { SEQUENCE sequence_name [, ...] | ALL SEQUENCES IN SCHEMA schema_name [, ...] } TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]; 将子集群的访问权限赋予指定的用户或角色。普通用户不能执行针对Node Group的GRANT/REVOKE操作。 1 2 3 4 GRANT { CREATE | USAGE | COMPUTE | ALL [ PRIVILEGES ] } ON NODE GROUP group_name [, ...] TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]; 将模式的访问权限赋予指定的用户或角色。 1 2 3 4 GRANT { { CREATE | USAGE | ALTER | DROP } [, ...] | ALL [ PRIVILEGES ] } ON SCHEMA schema_name [, ...] TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]; 将模式中的表或者视图对象授权给其他用户时,需要将表或视图所属的模式的USAGE权限同时授予该用户,若没有该权限,则只能看到这些对象的名字,并不能实际进行对象访问。 将类型的访问权限赋予指定的用户或角色。 1 2 3 4 GRANT { USAGE | ALL [ PRIVILEGES ] } ON TYPE type_name [, ...] TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]; 当前版本暂时不支持赋予类型的访问权限。 将角色的权限赋予其他用户或角色的语法。 1 2 3 GRANT role_name [, ...] TO role_name [, ...] [ WITH ADMIN OPTION ]; 将所有权限赋予指定的角色。 1 2 GRANT ALL { PRIVILEGES | PRIVILEGE } TO role_name;
  • 语法格式 显示SQL语句的执行计划,支持多种选项,对选项顺序无要求: 1 EXPLAIN [ ( option [, ...] ) ] statement; 其中选项option子句的语法为: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ANALYZE [ boolean ] | ANALYSE [ boolean ] | VERBOSE [ boolean ] | COSTS [ boolean ] | CPU [ boolean ] | DETAIL [ boolean ] | NODES [ boolean ] | NUM_NODES [ boolean ] | BUFFERS [ boolean ] | TIMING [ boolean ] | PLAN [ boolean ] | FORMAT { TEXT | XML | JSON | YAML } | BLOCKNAME [boolean] | OUTLINE [boolean] | WARMUP | WARMUP HOT 显示SQL语句的执行计划,且要按顺序给出选项: 1 EXPLAIN { [ { ANALYZE | ANALYSE } ] [ VERBOSE ] | PERFORMANCE } statement; 显示复现SQL语句的执行计划所需的信息,通常用于定位问题。STATS选项必须单独使用: 1 EXPLAIN ( STATS [ boolean ] ) statement;
  • 功能描述 显示SQL语句的执行计划。 执行计划将显示SQL语句所引用的表采用的扫描方式,如:简单的顺序扫描、索引扫描等。如果引用了多个表,执行计划还会显示使用的JOIN算法。 执行计划的最关键部分是语句的预计执行开销,即计划生成器估算执行该语句将花费多长的时间。 若指定了ANALYZE选项,则该语句会被执行,然后根据实际的运行结果显示统计数据,包括每个计划节点内时间总开销(毫秒为单位)和实际返回的总行数。这对于判断计划生成器是否接近现实非常有用。
  • 功能描述 创建一个预备语句。 预备语句是服务端的对象,可以用于优化性能。在执行PREPARE语句的时候,指定的查询被解析、分析、重写。当随后发出EXECUTE语句的时候,预备语句被规划和执行。这种设计避免了重复解析、分析工作。PREPARE语句创建后在整个数据库会话期间一直存在,一旦创建成功,即便是在事务块中创建,事务回滚,PREPARE也不会删除。只能通过显式调用DEALLOCATE进行删除,会话结束时,PREPARE也会自动删除。
  • 示例 为一个INSERT语句创建一个预备语句,然后执行它: 1 2 PREPARE insert_reason(integer,character(16),character(100)) AS INSERT INTO tpcds.reason_t1 VALUES($1,$2,$3); EXECUTE insert_reason(52, 'AAAAAAAADDAAAAAA', 'reason 52');
  • SQL差异 表1 GaussDB(DWS)不支持的PostgreSQL数据库语言 分类 GaussDB(DWS)不支持 说明 数据类型 几何类型line GaussDB(DWS)所支持的数据类型参见数据类型。 pg_node_tree 函数 枚举支持函数: enum_first(anyenum) enum_last(anyenum) enum_range(anyenum) enum_range(anyenum, anyenum) GaussDB(DWS)所支持的函数参见函数和操作符。 访问权限查询函数: has_sequence_privilege(user, sequence, privilege) has_sequence_privilege(sequence, privilege) 系统目录信息函数: pg_get_triggerdef(trigger_oid) pg_get_triggerdef(trigger_oid, pretty_bool) 几何类型转换函数: line(point, point) pg_node_tree函数 SQL语法 CREATE TABLE子句: INHERITS ( parent_table [, ... ] ) 继承表。 CREATE TABLE的列约束: REFERENCES reftable [ ( refcolumn ) ] [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ] [ ON DELETE action ] [ ON UPDATE action ] 列约束中用REFERENCES reftable [ ( refcolumn ) ] [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ] [ ON DELETE action ] [ ON UPDATE action ] 为表创建外键约束。 CREATE TABLE的表约束: EXCLUDE [ USING index_method ] ( exclude_element WITH operator [, ... ] ) 表约束中用EXCLUDE [ USING index_method ] ( exclude_element WITH operator [, ... ] )为表创建排除约束。 CREATE/ALTER/DROP EXTENSION 扩展的加载、修改和删除。 CREATE/ALTER/DROP AGGREGATE 聚集函数的定义、修改和删除。 CREATE/ALTER/DROP OPERATOR 操作符(OPERATOR)的创建、修改和删除。 CREATE/ALTER/DROP OPERATOR CLASS 操作符类(OPERATOR CLASS)的创建、修改和删除。 CREATE/ALTER/DROP OPERATOR FAMILY 操作符族(OPERATOR FAMILY)的创建、修改和删除。 CREATE/ALTER/DROP TEXT SEARCH PARSER 文本检索解析器(TEXT SEARCH PARSER)的创建、修改和删除。 CREATE/ALTER/DROP TEXT SEARCH TEMPLATE 文本检索模板(TEXT SEARCH TEMPLATE)的创建、修改和删除。 CREATE/ALTER/DROP COLLATION 排序规则(COLLATION)的创建、修改和删除 CREATE/ALTER/DROP CONVERSION 字符集编码转换(CONVERSION)的定义、修改和删除。 CREATE/ALTER/DROP RULE 规则(RULE)的创建、修改和删除。 CREATE/ALTER/DROP LANGUAGE 过程语言(LANGUAGE)的注册、修改和删除。 CREATE/ALTER/DROP DOMAIN 域(DOMAIN)的创建、修改和删除。 CREATE/DROP CAST 类型转换(CAST)的定义和删除。 CREATE/ALTER/DROP USER MAPPING 用户映射(USER MAPPING)的定义、修改和删除。 SECURITY LABEL 定义或更改对象的安全标签。 NOTIFY 生成一个通知。 LISTEN 监听一个通知。 UNLISTEN 停止监听通知信息。 LOAD 加载或重新加载一个共享库文件。 DISCARD 释放一个数据库的会话资源(8.2.0及以上集群版本已支持DISCARD) 。 MOVE BACKWARD 反向移动游标。 COPY的COPY FROM FILE和COPY TO FILE 为了权限的隔离,GaussDB(DWS)禁用COPY FROM FILE和COPY TO FILE。 其他 自定义C函数 DWS支持的用户自定义函数参见用户自定义函数。
  • 客户端差异 GaussDB(DWS) gsql相较于PostgreSQL psql做了如下安全加固变更: 取消通过元命令\password设置用户密码。 新增元命令\i+、 \ir+、\include_relative+和输入输出参数-k,以支持给导入导出的文件加密。 取消打印命令行历史到文件的元命令\s。 涉及敏感操作SQL历史不再记录,如含有密码操作。即用户通过翻页/上下键查阅SQL历史将不能查到对应的记录。 支持连接后在屏幕上给出用户密码过期提示以及版本信息。 gsql在psql基础上还增加了如下功能: 新增输出格式参数-r。支持用户输入命令时的tab补齐和方向键调整焦点。 新增并行操作元命令\parallel,以提升执行性能。 新增\set RETRY支持语句出错重试。 新增PLSQL默认结束符功能,将“/”作为PLSQL语句(create or replace function/procedure)的默认结束符,增加便利性。 libpq:
  • 示例 创建示例表test_trigger_src_tbl和test_trigger_des_tbl。 1 2 3 4 5 DROP TABLE IF EXISTS test_trigger_src_tbl; DROP TABLE IF EXISTS test_trigger_des_tbl; CREATE TABLE test_trigger_src_tbl(id1 INT, id2 INT, id3 INT); CREATE TABLE test_trigger_des_tbl(id1 INT, id2 INT, id3 INT); 创建触发器函数tri_insert_func()。 1 2 3 4 5 6 7 8 9 DROP FUNCTION IF EXISTS tri_insert_func; CREATE OR REPLACE FUNCTION tri_insert_func() RETURNS TRIGGER AS $$ DECLARE BEGIN INSERT INTO test_trigger_des_tbl VALUES(NEW.id1, NEW.id2, NEW.id3); RETURN NEW; END $$ LANGUAGE PLPGSQL; 创建触发器insert_trigger。 1 2 3 4 CREATE TRIGGER insert_trigger BEFORE INSERT ON test_trigger_src_tbl FOR EACH ROW EXECUTE PROCEDURE tri_insert_func(); 修改触发器insert_trigger。 1 ALTER TRIGGER insert_trigger ON test_trigger_src_tbl RENAME TO delete_trigger_renamed; 禁用触发器delete_trigger_renamed。 1 ALTER TABLE test_trigger_src_tbl DISABLE TRIGGER delete_trigger_renamed; 禁用表test_trigger_src_tbl所有触发器。 1 ALTER TABLE test_trigger_src_tbl DISABLE TRIGGER ALL;
  • 参数说明 表1 DROP TEXT SEARCH CONFIGURATION参数说明 参数 描述 取值范围 IF EXISTS 如果指定的文本搜索配置不存在,那么发出一个notice而不是抛出一个错误。 - name 要删除的文本搜索配置名称(可有模式修饰)。 已存在的文本搜索配置名称。 CASCADE | RESTRICT 当执行删除操作时,如何处理依赖对象中的相关数据。 CASCADE:级联删除依赖文本搜索配置的对象。 RESTRICT:如果有任何对象依赖文本搜索配置则拒绝删除它。这是默认情况。此选项为缺省值。
  • 参数说明 表1 RESET参数说明 参数 描述 取值范围 configuration_parameter 运行时参数的名称。 可以使用SHOW ALL命令查看运行时参数。 说明: 部分通过SHOW ALL查看的参数不能通过SET设置。如max_datanodes。 CURRENT_SCHEMA 当前模式。 - TIME ZONE 时区。 - TRANSACTION ISOLATION LEVEL 事务的隔离级别。 - SESSION AUTHORIZATION 当前会话的用户标识符。 - ALL 所有运行时参数。 -
  • 示例 启用物化视图的查询重写。 1 2 3 ALTER MATERIALIZED VIEW mv1 ENABLE QUERY REWRITE; NOTICE: REFRESH MATERIALIZED VIEW should be executed to enable query rewrite. ALTER MATERIALIZED VIEW 修改物化视图的表属性。 1 2 3 ALTER MATERIALIZED VIEW mv1 SET (force_rewrite_timeout=100); ALTER MATERIALIZED VIEW mv1 SET (mv_pck_column='col1'); ALTER MATERIALIZED VIEW mv1 SET (enable_foreign_table_query_rewrite = true); 修改物化视图的刷新时间。 1 ALTER MATERIALIZED VIEW mv1 REFRESH START WITH('2025-01-01 15:15:15'::timestamptz) EVERY (interval '60 s');
  • 语法格式 设置是否对物化视图启动查询重写。 1 2 ALTER MATERIALIZED VIEW [ IF EXISTS ] { materialized_view_name } [ ENABLE | DISABLE ] QUERY REWRITE; 修改物化视图的刷新方式。目前仅支持COMPLETE全量刷新这一种刷新方式。执行物化视图定义的查询语句并更新物化视图。 1 2 ALTER MATERIALIZED VIEW [ IF EXISTS ] { materialized_view_name } REFRESH [ COMPLETE ] [ ON DEMAND ] [ [ START WITH (timestamptz) ] | [ EVERY (interval) ] ]; REFRESH ON DEMAND,表示手动按需刷新。 START WITH,指定首次刷新时间。 EVERY指定刷新间隔,根据指定的时间定时刷新,支持MONTH、DAY、HOUR、MINUTE及SECOND。 修改物化视图的所有者。 1 2 ALTER MATERIALIZED VIEW { materialized_view_name } OWNER TO new_owner; 设置物化视图的表属性。该语法仅9.1.0.200及以上集群版本支持。 1 2 3 ALTER MATERIALIZED VIEW { materialized_view_name } SET ( {storage_parameter = value} [, ... ] ) | RESET ( storage_parameter [, ... ] ) 重命名物化视图。 1 2 ALTER MATERIALIZED VIEW [ IF EXISTS ] materialized_view_name RENAME TO new_materialized_view_name;
  • 参数说明 表1 ALTER MATERIALIZED VIEW参数说明 参数 描述 取值范围 IF EXISTS 如果指定的物化视图不存在时,返回一个提示而不是错误。 - materialized_view_name 需要修改的物化视图的名称。 已存在的物化视图名。 storage_parameter 设置物化视图的表属性。 支持设置参数:mv_pck_column,bitmap_columns,enable_foreign_table_query_rewrite,excluded_inactive_tables,force_rewrite_timeout,mv_analyze_mode等。 更多支持设置的参数可参考参数说明。 new_owner 物化视图的新所有者。 已存在的用户名。 new_materialized_view_name 新的物化视图名称。 字符串,需符合标识符命名规范。
  • 参数说明 表1 ALTER INDEX参数说明 参数 描述 取值范围 IF EXISTS 如果指定的索引不存在时,返回一个提示而不是错误。 - RENAME TO 修改索引的名称。对存储的数据没有影响。 - SET ( { STORAGE_PA RAM ETER = value } [, ...] ) 修改索引的一个或多个索引方法特定的存储参数。 此命令不会立即修改索引内容,根据参数的不同,可能需要使用REINDEX重建索引来获得所需的效果。 - RESET ( { storage_parameter } [, ...] ) 重置索引的一个或多个索引方法特定的存储参数为默认值。与SET一样,可能需要使用REINDEX来完全更新索引。 - [ MODIFY PARTITION index_partition_name ] UNUSABLE 用于设置表或者索引分区上的索引不可用。 - REBUILD [ PARTITION index_partition_name ] 用于重建表或者索引分区上的索引。 - WITHOUT UNUSABLE 重建表或者索引分区上的索引时不重建状态为UNUSABLE的索引。 - RENAME PARTITION 用于重命名索引分区。 - COMMENT comment_text 用于添加,修改或删除索引的注释。 - index_name 需要修改的索引名。 已存在的索引名。 new_name 新的索引名。 字符串,需符合标识符命名规范。 storage_parameter 索引方法特定的参数名。 - invisible 控制优化器是否生成索引扫描相关计划。默认值:OFF。 ON或OFF。 ON表示不生成索引扫描相关计划。 OFF表示生成索引扫描相关计划。 value 索引方法特定的存储参数的新值。根据参数的不同,这可能是一个数字或单词。 - new_index_partition_name 新索引分区名。 字符串,需符合标识符命名规范。 index_partition_name 索引分区名。 字符串,需符合标识符命名规范。 comment_text 索引的注释信息。 -
  • 示例 创建示例表tpcds.ship_mode_t1。 1 2 3 4 5 6 7 8 9 10 11 DROP TABLE IF EXISTS tpcds.ship_mode_t1; CREATE TABLE tpcds.ship_mode_t1 ( SM_SHIP_MODE_SK INTEGER NOT NULL, SM_SHIP_MODE_ID CHAR(16) NOT NULL, SM_TYPE CHAR(30) , SM_CODE CHAR(10) , SM_CARRIER CHAR(20) , SM_CONTRACT CHAR(20) ) DISTRIBUTE BY HASH(SM_SHIP_MODE_SK); 在表tpcds.ship_mode_t1上的SM_SHIP_MODE_SK字段上创建唯一索引。 1 2 DROP INDEX IF EXISTS ds_ship_mode_t1_index1; CREATE UNIQUE INDEX ds_ship_mode_t1_index1 ON tpcds.ship_mode_t1(SM_SHIP_MODE_SK); 在表tpcds.ship_mode_t1上SM_CODE字段上创建表达式索引。 1 2 DROP INDEX IF EXISTS ds_ship_mode_t1_index2; CREATE INDEX ds_ship_mode_t1_index2 ON tpcds.ship_mode_t1(SUBSTR(SM_CODE,1 ,4)); 重命名现有的索引ds_ship_mode_t1_index1为ds_ship_mode_t1_index5。 1 ALTER INDEX tpcds.ds_ship_mode_t1_index1 RENAME TO ds_ship_mode_t1_index5; 设置索引ds_ship_mode_t1_index2不可用。 1 ALTER INDEX tpcds.ds_ship_mode_t1_index2 UNUSABLE; 重建索引ds_ship_mode_t1_index2。 1 ALTER INDEX tpcds.ds_ship_mode_t1_index2 REBUILD;
  • 语法格式 重命名表索引的名称,支持新的索引名称前带有原索引所在的schema名,但是不支持同时修改schema名。 1 2 3 4 ALTER INDEX [ IF EXISTS ] index_name RENAME TO new_name; ALTER INDEX [ IF EXISTS ] index_name RENAME TO schema.new_name; 修改表索引的存储参数。 1 2 ALTER INDEX [ IF EXISTS ] index_name SET ( {storage_parameter = value} [, ... ] ); 修改索引的状态标记。 1 2 ALTER INDEX [ IF EXISTS ] index_name SET ( {invisible = value} [, ... ] ); 重置表索引的存储参数。 1 2 ALTER INDEX [ IF EXISTS ] index_name RESET ( storage_parameter [, ... ] ) ; 设置表索引或索引分区不可用。 1 2 ALTER INDEX [ IF EXISTS ] index_name [ MODIFY PARTITION index_partition_name ] UNUSABLE; 列存表不支持该语法。 重建表索引或索引分区。 1 2 ALTER INDEX index_name REBUILD [ PARTITION index_partition_name ] [WITHOUT UNUSABLE]; 重命名索引分区。 1 2 ALTER INDEX [ IF EXISTS ] index_name RENAME PARTITION index_partition_name TO new_index_partition_name; PG_OBJECT系统表记录索引最后修改时间时不支持对该语法的记录。
共100000条
提示

您即将访问非华为云网站,请注意账号财产安全