华为云用户手册

  • 语法格式 1 2 3 4 5 6 7 8 9101112131415 openGauss=# CREATE [ OR REPLACE ] PROCEDURE procedure_name [ ( {[ argname ] [ argmode ] argtype [ { DEFAULT | := | = } expression ]}[,...]) ] [ { IMMUTABLE | STABLE | VOLATILE } | { SHIPPABLE | NOT SHIPPABLE } | {PACKAGE} | [ NOT ] LEAKPROOF | { CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT } | {[ EXTERNAL ] SECURITY INVOKER | [ EXTERNAL ] SECURITY DEFINER | AUTHID DEFINER | AUTHID CURRENT_USER} | COST execution_cost | SET configuration_parameter { [ TO | = ] value | FROM CURRENT } ][ ... ] { IS | AS } plsql_body /
  • 参数说明 OR REPLACE 当存在同名的存储过程时,替换原来的定义。 procedure_name 创建的存储过程名称,可以带有模式名。 取值范围:字符串,要符合标识符的命名规范。 argmode 参数的模式。 VARIADIC用于声明数组类型的参数。 取值范围: IN,OUT,INOUT或VARIADIC。缺省值是IN。只有OUT模式的参数后面能跟VARIADIC。并且OUT和INOUT模式的参数不能用在RETURNS TABLE的过程定义中。 argname 参数的名称。 取值范围:字符串,要符合标识符的命名规范。 argtype 参数的数据类型。可以使用%ROWTYPE间接引用表的类型,或者使用%TYPE间接引用表或复合类型中某一列的类型。 取值范围:可用的数据类型。 IMMUTABLE、STABLE等 行为约束可选项。各参数的功能与CREATE FUNCTION类似,详细说明见CREATE FUNCTION plsql_body PL/SQL存储过程体。 当在存储过程体中进行创建用户等涉及用户密码相关操作时,系统表及csv日志中会记录密码的明文。因此不建议用户在存储过程体中进行涉及用户密码的相关操作。 argname和argmode的顺序没有严格要求,推荐按照argname、argmode、argtype的顺序使用。
  • 示例 1 2 3 4 5 6 7 8 91011121314151617181920212223242526 --创建一个表tb_for_labelopenGauss=# CREATE TABLE tb_for_label(col1 text, col2 text, col3 text);--创建一个模式schema_for_labelopenGauss=# CREATE SCHEMA schema_for_label;--创建一个视图view_for_labelopenGauss=# CREATE VIEW view_for_label AS SELECT 1;--创建一个函数func_for_labelopenGauss=# CREATE FUNCTION func_for_label RETURNS TEXT AS $$ SELECT col1 FROM tb_for_label; $$ LANGUAGE SQL;--基于表创建资源标签openGauss=# CREATE RESOURCE LABEL IF NOT EXISTS table_label add TABLE(public.tb_for_label);--基于列创建资源标签openGauss=# CREATE RESOURCE LABEL IF NOT EXISTS column_label add COLUMN(public.tb_for_label.col1);--基于模式创建资源标签openGauss=# CREATE RESOURCE LABEL IF NOT EXISTS schema_label add SCHEMA(schema_for_label);--基于视图创建资源标签openGauss=# CREATE RESOURCE LABEL IF NOT EXISTS view_label add VIEW(view_for_label);--基于函数创建资源标签openGauss=# CREATE RESOURCE LABEL IF NOT EXISTS func_label add FUNCTION(func_for_label);
  • 语法格式 123 CREATE NODE GROUP groupname [WITH ( nodename [, ... ] )] [bucketcnt bucket_cnt] [ BUCKETS [ ( bucketnumber [, ... ] ) ] ] [VCGROUP] [DISTRIBUTE FROM src_group_name] [groupparent parent_group_name];
  • 示例 1 2 3 4 5 6 7 8 9101112131415161718 --创建dev_mask和bob_mask用户。openGauss=# CREATE USER dev_mask PASSWORD 'dev@1234';openGauss=# CREATE USER bob_mask PASSWORD 'bob@1234';--创建一个表tb_for_maskingopenGauss=# CREATE TABLE tb_for_masking(col1 text, col2 text, col3 text);--创建资源标签标记敏感列col1openGauss=# CREATE RESOURCE LABEL mask_lb1 ADD COLUMN(tb_for_masking.col1);--创建资源标签标记敏感列col2openGauss=# CREATE RESOURCE LABEL mask_lb2 ADD COLUMN(tb_for_masking.col2);--对访问敏感列col1的操作创建脱敏策略openGauss=# CREATE MASKING POLICY maskpol1 maskall ON LABEL(mask_lb1);--创建仅对用户dev_mask和bob_mask,客户端工具为psql和gsql,IP地址为'10.20.30.40', '127.0.0.0/24'场景下生效的脱敏策略。openGauss=# CREATE MASKING POLICY maskpol2 randommasking ON LABEL(mask_lb2) FILTER ON ROLES(dev_mask, bob_mask), APP(psql, gsql), IP('10.20.30.40', '127.0.0.0/24');
  • 参数说明 groupname 节点组名称。 取值范围:字符串,要符合标识符的命名规范。且最大长度不超过63个字符。 节点组命名支持ASCII字符集上所有字符,但是建议用户按照标识符命名规范命名。 nodename 节点名称。 取值范围:字符串,要符合标识符的命名规范。且最大长度不超过63个字符。 不指定该参数时,需要指定bucketcnt值,表示创建属于installation node group的child node group bucketcnt bucket_cnt bucket_cnt表示bucket桶数量。 取值范围:[32,16384),并且必须是2的幂次方。 不指定该参数时,需要指定WITH的值。 BUCKETS [ ( bucketnumber [, ... ] ) ] BUCKETS子句是集群管理工具的内部用法,该子句不建议用户直接使用,以免对集群的正常使用造成影响。 VCGROUP 创建一个逻辑集群(当前特性是实验室特性,使用时请联系华为工程师提供技术支持)类型的节点组。 DISTRIBUTE FROM src_group_name 创建一个逻辑集群(当前特性是实验室特性,使用时请联系华为工程师提供技术支持)节点组,用于从src_group_name指定的逻辑集群节点组重分布数据。该子句不建议用户直接使用,以免导致数据分布错误和逻辑集群不可用。 groupparent parent_group_name parent_group_name表示当前child node group所属的parent node group名字。
  • 语法格式 1 CREATE MASKING POLICY policy_name masking_clause[, ...]* policy_filter [ENABLE | DISABLE]; masking_clause: 1 masking_function ON LABEL(label_name[, ...]*) masking_function: maskall不是预置函数,硬编码在代码中,不支持\df展示。 预置八种脱敏方式或者用户自定义的函数。 maskall | randommasking | creditcardmasking | basicemailmasking | fullemailmasking | shufflemasking | alldigitsmasking | regexpmasking
  • 参数说明 policy_name 审计策略名称,需要唯一,不可重复。 取值范围:字符串,要符合标识符的命名规范。 label_name 资源标签名称。 masking_clause 指出使用何种脱敏函数对被label_name标签标记的数据库资源进行脱敏,支持用schema.function的方式指定脱敏函数。 policy_filter 指出该脱敏策略对何种身份的用户生效,若为空表示对所有用户生效。 FILTER_TYPE 描述策略过滤的条件类型,包括IP | APP | ROLES。 filter_value 指具体过滤信息内容,例如具体的IP,具体的APP名称,具体的用户名。 ENABLE|DISABLE 可以打开或关闭脱敏策略。若不指定ENABLE|DISABLE,语句默认为ENABLE。
  • 语法格式 1 2 3 4 5 6 7 8 9101112131415 CREATE NODE nodename WITH ( [ TYPE = nodetype,] [ HOST = hostname,] [ PORT = portnum,] [ HOST1 = 'hostname',] [ PORT1 = portnum,] [ HOSTPRIMARY [ = boolean ],] [ PRIMARY [ = boolean ],] [ PREFERRED [ = boolean ],] [ SCTP_PORT = portnum,] [ CONTROL_PORT = portnum,] [ SCTP_PORT1 = portnum,] [ CONTROL_PORT1 = portnum ] );
  • 参数说明 nodename 节点名称。 取值范围:字符串,要符合标识符的命名规范。 TYPE = nodetype 指定节点的类型。 取值范围: 'coordinator' 'datanode' HOST = hostname 指定节点对应的主机名称或者IP地址。 PORT = portnum 指定节点绑定的主机端口号。 HOST1 = hostname 指定节点对应的备机名称或者IP地址。 PORT1 = portnum 指定节点绑定的备机端口号。 HOSTPRIMARY PRIMARY = boolean 声明该节点是否为主节点。主节点允许做读写操作,否则只允许读操作。 取值范围: true false(默认值) PREFERRED = boolean 声明该节点是否为读操作的首选节点。 取值范围: true false(默认值) SCTP_PORT = portnum 主机TCP代理通信库或SCTP通信库(由于规格变更,当前版本已经不再支持本特性,请不要使用)使用的数据传输通道侦听端口,使用TCP协议侦听连接。
  • 参数说明 UNIQUE 创建唯一性索引,每次添加数据时检测表中是否有重复值。如果插入或更新的值会引起重复的记录时,将导致一个错误。 目前只有行存表B-tree及UBtree索引支持唯一索引。 CONCURRENTLY 以不阻塞DML的方式创建索引(加ShareUpdateExclusiveLock锁)。创建索引时,一般会阻塞其他语句对该索引所依赖表的访问。指定此关键字,可以实现创建过程中不阻塞DML。 此选项只能指定一个索引的名称。 普通CREATE INDEX命令可以在事务内执行,但是CREATE INDEX CONCURRENTLY不可以在事务内执行。 列存表、分区表不支持CONCURRENTLY方式创建索引,对于临时表,支持使用CONCURRENTLY关键字创建索引,但是实际创建过程中,采用的是阻塞式的创建方式,因为没有其他会话会并发访问临时表,并且阻塞式创建成本更低。 创建索引时指定此关键字,需要执行先后两次对该表的全表扫描来完成build,第一次扫描的时候创建索引,不阻塞读写操作;第二次扫描的时候合并更新第一次扫描到目前为止发生的变更。 由于需要执行两次对表的扫描和build,而且必须等待现有的所有可能对该表执行修改的事务结束。这意味着该索引的创建比正常耗时更长,同时因此带来的CPU和I/O消耗对其他业务也会造成影响。 如果在索引构建时发生失败,那会留下一个“不可用”的索引。这个索引会被查询忽略,但它仍消耗更新开销。这种情况推荐的恢复方法是通过DROP INDEX IF EXISTS语法删除该索引并尝试再次CONCURRENTLY建索引。 由于在第二次扫描之后,索引构建必须等待任何持有早于第二次扫描拿的快照的事务终止,而且建索引时加的ShareUpdateExclusiveLock锁(4级)会和大于等于4级的锁冲突,在创建这类索引时,容易引发卡住(hang)或者死锁问题。例如: 两个会话对同一个表创建CONCURRENTLY索引,会引起死锁问题。 两个会话,一个对表创建CONCURRENTLY索引,一个drop table,会引起死锁问题。 三个会话,会话1先对表a加锁,不提交,会话2接着对表b创建CONCURRENTLY索引,会话3接着对表a执行写入操作,在会话1事务未提交之前,会话2会一直被阻塞。 创建CONCURRENTLY索引与同一个表的TRUNCATE操作并发,会引起死锁问题。 将事务隔离级别设置成可重复读(默认为读已提交),起两个会话,会话1起事务对表a执行写入操作,不提交,会话2对表b创建CONCURRENTLY索引,在会话1事务未提交之前,会话2会一直被阻塞。 索引构建过程中或者构建失败的情况下,需要确认索引进度或状态,可以通过查询函数gs_get_index_status('schema_name', 'index_name')来确认当前所有节点上索引的状态,其中入参为schema_name和index_name,分别用来指定索引的模式名称和索引名称,返回值为node_name,indisready和indisvalid,分别表示节点名称,索引在该节点上是否可插入,以及索引在该节点上是否可用,只有当所有节点indisready和indisvalid均为true的情况下,索引才是“可用的”,否则请等待索引创建完成,或者构建失败情况下,删除索引重新创建。 schema_name 模式的名称。 取值范围:已存在模式名。 index_name 要创建的索引名,不能包含模式名,索引的模式与表相同。 取值范围:字符串,要符合标识符的命名规范。 table_name 需要为其创建索引的表的名称,可以用模式修饰。 取值范围:已存在的表名。 USING method 指定创建索引的方法。 取值范围: btree:B-tree索引使用一种类似于B+树的结构来存储数据的键值,通过这种结构能够快速的查找索引。btree适合支持比较查询以及查询范围。 gin:GIN索引是倒排索引,可以处理包含多个键的值(比如数组)。 gist:Gist索引适用于几何和地理等多维数据类型和集合数据类型。 Psort:Psort索引。针对列存表进行局部排序索引。 行存表支持的索引类型:btree(行存表缺省值)、gin、gist。列存表支持的索引类型:Psort(列存表缺省值)、btree、gin。全局临时表不支持GIN索引和Gist索引。 column_name 表中需要创建索引的列的名称(字段名)。 如果索引方式支持多字段索引,可以声明多个字段。全局索引最多可以声明31个字段,其他索引最多可以声明32个字段。 expression 创建一个基于该表的一个或多个字段的表达式索引,通常必须写在圆括弧中。如果表达式有函数调用的形式,圆括弧可以省略。 表达式索引可用于获取对基本数据的某种变形的快速访问。比如,一个在upper(col)上的函数索引将允许WHERE upper(col) = 'JIM'子句使用索引。 在创建表达式索引时,如果表达式中包含IS NULL子句,则这种索引是无效的。此时,建议用户尝试创建一个部分索引。 COLLATE collation COLLATE子句指定列的排序规则(该列必须是可排列的数据类型)。如果没有指定,则使用默认的排序规则。排序规则可以使用“select * from pg_collation”命令从pg_collation系统表中查询,默认的排序规则为查询结果中以default开始的行。 opclass 操作符类的名称。对于索引的每一列可以指定一个操作符类,操作符类标识了索引那一列的使用的操作符。例如一个B-tree索引在一个四字节整数上可以使用int4_ops;这个操作符类包括四字节整数的比较函数。实际上对于列上的数据类型默认的操作符类是足够用的。操作符类主要用于一些有多种排序的数据。例如,用户想按照绝对值或者实数部分排序一个复数。能通过定义两个操作符类然后当建立索引时选择合适的类。 ASC 指定按升序排序 (默认)。 DESC 指定按降序排序。 NULLS FIRST 指定空值在排序中排在非空值之前,当指定DESC排序时,本选项为默认的。 NULLS LAST 指定空值在排序中排在非空值之后,未指定DESC排序时,本选项为默认的。 WITH ( {storage_parameter = value} [, ... ] ) 指定索引方法的存储参数。 取值范围: 只有GIN索引支持FASTUPDATE,GIN_PENDING_LIST_LIMIT参数。GIN和Psort之外的索引都支持FILLFACTOR参数。 FILLFACTOR 一个索引的填充因子(fillfactor)是一个介于10和100之间的百分数。 取值范围:10~100 FASTUPDATE GIN索引是否使用快速更新。 取值范围:ON,OFF 默认值:ON GIN_PENDING_LIST_LIMIT 当GIN索引启用fastupdate时,设置该索引pending list容量的最大值。 取值范围:64~2147483647‬,单位KB。 默认值:gin_pending_list_limit的默认取决于GUC中gin_pending_list_limit的值(默认为4MB) CROSSBUCKET 索引是否使用跨hashbucket索引。仅支持B-Tree索引。 取值范围:ON,OFF 默认值:ON TABLESPACE tablespace_name 指定索引的表空间,如果没有声明则使用默认的表空间。 取值范围:已存在的表空间名。 WHERE predicate 创建一个部分索引。部分索引是一个只包含表的一部分记录的索引,通常是该表中比其他部分数据更有用的部分。例如,有一个表,表里包含已记账和未记账的定单,未记账的定单只占表的一小部分而且这部分是最常用的部分,此时就可以通过只在未记账部分创建一个索引来改善性能。另外一个可能的用途是使用带有UNIQUE的WHERE强制一个表的某个子集的唯一性。 取值范围:predicate表达式只能引用表的字段,它可以使用所有字段,而不仅是被索引的字段。目前,子查询和聚集表达式不能出现在WHERE子句里。不建议使用int等数值类型作为predicate,因为int等数值类型可以隐式转换为bool值(非0值隐式转换为true,0转换为false),可能导致非预期的结果。 对于分区表索引,当创建索引带GLOBAL/LOCAL关键字,或者最终创建的索引类型为GLOBAL索引时,不支持带WHERE子句创建索引。 PARTITION index_partition_name 索引分区的名称。 取值范围:字符串,要符合标识符的命名规范。 TABLESPACE index_partition_tablespace 索引分区的表空间。 取值范围:如果没有声明,将使用分区表索引的表空间index_tablespace。
  • 优化建议 create index 建议仅在匹配如下条件之一时创建索引: 经常执行查询的字段。 在连接条件上创建索引,对于存在多字段连接的查询,建议在这些字段上建立组合索引。例如,select * from t1 join t2 on t1.a=t2.a and t1.b=t2.b,可以在t1表上的a,b字段上建立组合索引。 where子句的过滤条件字段上(尤其是范围条件)。 在经常出现在order by、group by和distinct后的字段。 约束限制: 普通表的索引支持最大列数为32列;分区表的GLOBAL索引支持最大列数为31列。 单个索引大小不能超过索引页面大小(8k),其中B-tree、UBtree及Gin索引不能超过页面大小的三分之一。 分区表上不支持创建部分索引。 在分区表上创建唯一索引时,索引项中必须包含分布列。索引项不包含分区键只能创建全局分区索引。
  • 语法格式 在表上创建索引。 12345 CREATE [ UNIQUE ] INDEX [ CONCURRENTLY ] [ [schemaname.]index_name ] ON table_name [ USING method ] ({ { column_name | ( expression ) } [ COLLATE collation ] [ opclass ] [ ASC | DESC ] [ NULLS { FIRST | LAST } ] }[, ...] ) [ WITH ( {storage_parameter = value} [, ... ] ) ] [ TABLESPACE tablespace_name ] [ WHERE predicate ]; 在分区表上创建索引。 123456 CREATE [ UNIQUE ] INDEX [ [schemaname.]index_name ] ON table_name [ USING method ] ( { { column_name | ( expression ) } [ COLLATE collation ] [ opclass ] [ ASC | DESC ] [ NULLS LAST ] } [, ...] ) [ LOCAL [ ( { PARTITION index_partition_name [ TABLESPACE index_partition_tablespace ] } [, ...] ) ] | GLOBAL ] [ WITH ( { storage_parameter = value } [, ...] ) ] [ TABLESPACE tablespace_name ] [ WHERE predicate ];
  • 功能描述 在指定的表上创建索引。 索引可以用来提高数据库查询性能,但是不恰当的使用将导致数据库性能下降。建议仅在匹配如下某条原则时创建索引: 经常执行查询的字段。 在连接条件上创建索引,对于存在多字段连接的查询,建议在这些字段上建立组合索引。例如,select * from t1 join t2 on t1.a=t2.a and t1.b=t2.b,可以在t1表上的a,b字段上建立组合索引。 where子句的过滤条件字段上(尤其是范围条件)。 在经常出现在order by、group by和distinct后的字段。 在分区表上创建索引与在普通表上创建索引的语法不太一样,使用时请注意,如当索引带GLOBAL/LOCAL关键字或者创建索引为GLOBAL索引时不支持创建部分索引。
  • 注意事项 索引自身也占用存储空间、消耗计算资源,创建过多的索引将对数据库性能造成负面影响(尤其影响数据导入的性能,建议在数据导入后再建索引)。因此,仅在必要时创建索引。 索引定义里的所有函数和操作符都必须是immutable类型的,即它们的结果必须只能依赖于它们的输入参数,而不受任何外部的影响(如另外一个表的内容或者当前时间)。这个限制可以确保该索引的行为是定义良好的。要在一个索引上或WHERE中使用用户定义函数,请把它标记为immutable类型函数。 在分区表上创建唯一索引时,索引项必须包含分布列。索引项不包含分区键只能创建全局分区索引。 列存表支持的PSORT和B-tree索引都不支持创建表达式索引、部分索引和唯一索引。 列存表支持的GIN索引支持创建表达式索引,但表达式不能包含空分词、空列和多列,不支持创建部分索引和唯一索引。 被授予CREATE ANY INDEX权限的用户,可以在public模式和用户模式下创建索引。 如果表达式索引中调用的是用户自定义函数,按照函数创建者权限执行表达式索引函数。
  • 示例 --创建一个普通表openGauss=# CREATE TABLE my_table (c1 int, c2 int);--创建全量物化视图openGauss=# CREATE MATERIALIZED VIEW my_mv AS SELECT * FROM my_table;--基表写入数据openGauss=# INSERT INTO my_table VALUES(1,1),(2,2);--对全量物化视图my_mv进行全量刷新openGauss=# REFRESH MATERIALIZED VIEW my_mv;
  • 参数说明 mv_name 要创建的物化视图的名称(可以被模式限定)。 取值范围:字符串,要符合标识符的命名规范。 column_name 新物化视图中的一个列名。物化视图支持指定列,指定列需要和后面的查询语句结果的列数量保持一致;如果没有提供列名,会从查询的输出列名中获取列名。 取值范围:字符串,要符合标识符的命名规范。 WITH ( storage_parameter [= value] [, ... ] ) 这个子句为表或索引指定一个可选的存储参数。详见CREATE TABLE。 TABLESPACE tablespace_name 指定新建物化视图所属表空间。如果没有声明,将使用默认表空间。 AS query 一个SELECT、TABLE 或者VALUES命令。这个查询将在一个安全受限的操作中运行。
  • 示例 1 2 3 4 5 6 7 8 910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879 --定义函数为SQL查询。openGauss=# CREATE FUNCTION func_add_sql(integer, integer) RETURNS integer AS 'select $1 + $2;' LANGUAGE SQL IMMUTABLE RETURNS NULL ON NULL INPUT;--利用参数名用 PL/pgSQL 自增一个整数。openGauss=# CREATE OR REPLACE FUNCTION func_increment_plsql(i integer) RETURNS integer AS $$ BEGIN RETURN i + 1; END;$$ LANGUAGE plpgsql;--返回RECORD类型CREATE OR REPLACE FUNCTION compute(i int, out result_1 bigint, out result_2 bigint)returns SETOF RECORDas $$begin result_1 = i + 1; result_2 = i * 10;return next;end;$$language plpgsql;--返回一个包含多个输出参数的记录。openGauss=# CREATE FUNCTION func_dup_sql(in int, out f1 int, out f2 text) AS $$ SELECT $1, CAST($1 AS text) || ' is text' $$ LANGUAGE SQL;openGauss=# SELECT * FROM func_dup_sql(42);--计算两个整数的和,并返回结果。若果输入为null,则返回null。openGauss=# CREATE FUNCTION func_add_sql2(num1 integer, num2 integer) RETURN integerASBEGIN RETURN num1 + num2;END;/--创建package属性的重载函数openGauss=# create or replace function package_func_overload(col int, col2 int)return integer packageasdeclare col_type text;begin col := 122; dbe_output.print_line('two int parameters ' || col2); return 0;end;/openGauss=# create or replace function package_func_overload(col int, col2 smallint)return integer packageasdeclare col_type text;begin col := 122; dbe_output.print_line('two smallint parameters ' || col2); return 0;end;/--修改函数add的执行规则为IMMUTABLE,即参数不变时返回相同结果。openGauss=# ALTER FUNCTION func_add_sql2(INTEGER, INTEGER) IMMUTABLE;--将函数add的名称修改为add_two_number。openGauss=# ALTER FUNCTION func_add_sql2(INTEGER, INTEGER) RENAME TO add_two_number;--将函数add的属者改为omm。openGauss=# ALTER FUNCTION add_two_number(INTEGER, INTEGER) OWNER TO omm;--删除函数。openGauss=# DROP FUNCTION add_two_number;openGauss=# DROP FUNCTION func_increment_sql;openGauss=# DROP FUNCTION func_dup_sql;openGauss=# DROP FUNCTION func_increment_plsql;openGauss=# DROP FUNCTION func_add_sql;
  • 语法格式 兼容PostgreSQL风格的创建自定义函数语法。 1 2 3 4 5 6 7 8 910111213141516171819202122 CREATE [ OR REPLACE ] FUNCTION function_name ( [ { argname [ argmode ] argtype [ { DEFAULT | := | = } expression ]} [, ...] ] ) [ RETURNS rettype [ DETERMINISTIC ] | RETURNS TABLE ( { column_name column_type } [, ...] )] LANGUAGE lang_name [ {IMMUTABLE | STABLE | VOLATILE } | {SHIPPABLE | NOT SHIPPABLE} | WINDOW | [ NOT ] LEAKPROOF | {CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT } | {[ EXTERNAL ] SECURITY INVOKER | [ EXTERNAL ] SECURITY DEFINER | AUTHID DEFINER | AUTHID CURRENT_USER} | {fenced | not fenced} | {PACKAGE} | COST execution_cost | ROWS result_rows | SET configuration_parameter { {TO | =} value | FROM CURRENT }} ][...] { AS 'definition' | AS 'obj_file', 'link_symbol' } 兼容Oracle风格的创建自定义函数的语法。 1 2 3 4 5 6 7 8 91011121314151617181920212223 CREATE [ OR REPLACE ] FUNCTION function_name ( [ { argname [ argmode ] argtype [ { DEFAULT | := | = } expression ] } [, ...] ] ) RETURN rettype [ DETERMINISTIC ] [ {IMMUTABLE | STABLE | VOLATILE } | {SHIPPABLE | NOT SHIPPABLE} | {PACKAGE} | {FENCED | NOT FENCED} | [ NOT ] LEAKPROOF | {CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT } | {[ EXTERNAL ] SECURITY INVOKER | [ EXTERNAL ] SECURITY DEFINER |AUTHID DEFINER | AUTHID CURRENT_USER} | COST execution_cost | ROWS result_rows | SET configuration_parameter { {TO | =} value | FROM CURRENT | LANGUAGE lang_name ][...] { IS | AS} plsql_body/
  • 参数说明 function_name 要创建的函数名称(可以用模式修饰)。 取值范围:字符串,要符合标识符的命名规范。 argname 函数参数的名称。 取值范围:字符串,要符合标识符的命名规范。 argmode 函数参数的模式。 取值范围:IN,OUT,INOUT或VARIADIC。缺省值是IN。只有OUT模式的参数后面能跟VARIADIC。并且OUT和INOUT模式的参数不能用在RETURNS TABLE的函数定义中。 VARIADIC用于声明数组类型的参数。 argtype 函数参数的类型。可以使用%ROWTYPE间接引用表的类型,或者使用%TYPE间接引用表或复合类型中某一列的类型。 expression 参数的默认表达式。 rettype 函数返回值的数据类型。与argtype相同,可以使用%ROWTYPE或者%TYPE间接引用类型。 如果存在OUT或IN OUT参数,可以省略RETURNS子句。如果存在,该子句必须和输出参数所表示的结果类型一致:如果有多个输出参数,则为RECORD,否则与单个输出参数的类型相同。 SETOF修饰词表示该函数将返回一个集合,而不是单独一项。 column_name 字段名称。 column_type 字段类型。 definition 一个定义函数的字符串常量,含义取决于语言。它可以是一个内部函数名称、一个指向某个目标文件的路径、一个SQL查询、一个过程语言文本。 LANGUAGE lang_name 用以实现函数的语言的名称。可以是SQL,C,internal,或者是用户定义的过程语言名称。为了保证向下兼容,该名称可以用单引号(包围)。若采用单引号,则引号内必须为大写。 由于兼容性问题,O风格的语法无论指定任何语言,最终创建的语言都为plpgsql。 WINDOW 表示该函数是窗口函数,通常只用于C语言编写的函数。替换函数定义时不能改变WINDOW属性。 自定义窗口函数只支持LANGUAGE是internal,并且引用的内部函数必须是窗口函数。 IMMUTABLE 表示该函数在给出同样的参数值时总是返回同样的结果。 STABLE 表示该函数不能修改数据库,对相同参数值,在同一次表扫描里,该函数的返回值不变,但是返回值可能在不同SQL语句之间变化。 VOLATILE 表示该函数值可以在一次表扫描内改变,因此不会做任何优化。 SHIPPABLE NOT SHIPPABLE 表示该函数是否可以下推到DN上执行。 对于IMMUTABLE类型的函数,函数始终可以下推到DN上执行。 对于STABLE/VOLATILE类型的函数,仅当函数的属性是SHIPPABLE的时候,函数可以下推到DN执行。 对于指定了SHIPPABLE/IMMUABLE的函数或者存储过程,其不能包含EXCEPTION或调用含有EXCEPTION的函数或者存储过程。 PACKAGE 表示该函数是否支持重载。 不允许package函数和非package函数重载或者替换。 package函数不支持VARIADIC类型的参数。 不允许修改函数的package属性。 LEAKPROOF 指出该函数的参数只包括返回值。LEAKPROOF只能由系统管理员设置。 CALLED ON NULL INPUT 表明该函数的某些参数是NULL的时候可以按照正常的方式调用。该参数可以省略。 RETURNS NULL ON NULL INPUT STRICT STRICT用于指定如果函数的某个参数是NULL,此函数总是返回NULL。如果声明了这个参数,当有NULL值参数时该函数不会被执行;而只是自动返回一个NULL结果。 RETURNS NULL ON NULL INPUT和STRICT的功能相同。 EXTERNAL 目的是和SQL兼容,是可选的,这个特性适合于所有函数,而不仅是外部函数。 SECURITY INVOKER AUTHID CURRENT_USER 表明该函数将带着调用它的用户的权限执行。该参数可以省略。 SECURITY INVOKER和AUTHID CURRENT_USER的功能相同。 SECURITY DEFINER AUTHID DEFINER 声明该函数将以创建它的用户的权限执行。 AUTHID DEFINER和SECURITY DEFINER的功能相同。 FENCED NOT FENCED 该参数用于声明函数是在保护模式还是非保护模式下执行。如果函数声明为NOT FENCED模式,则函数的执行在CN或者DN进程中进行。如果函数声明为FENCED模式,则函数在新fork的进程执行,这样函数的异常不会影响CN或者DN进程。 FENCED/NOT FENCED模式的选择: 正在开发或者调试的Function使用FENCED模式。开发测试完成,使用NOT FENCED模式执行,减少fork进程以及通信的开销。 复杂的操作系统操作,例:打开文件,信号处理,线程处理等操作,使用FENCED模式。否则可能影响 GaussDB数据库 的执行。 用户自定义C函数(当前特性是实验室特性,使用时请联系华为工程师提供技术支持),如果不指定该参数,默认为FENCED。 用户自定义PL/Java函数(当前特性是实验室特性,使用时请联系华为工程师提供技术支持),如果不指定该参数,默认为FENCED, 且不支持指定为NOT FENCED执行模式。 用户自定义PL/pgSQL函数,如果不指定该参数,默认为NOT FENCED,且不支持指定为FENCED执行模式。 COST execution_cost 用来估计函数的执行成本。 execution_cost以cpu_operator_cost为单位。 取值范围:正数 ROWS result_rows 估计函数返回的行数。用于函数返回的是一个集合。 取值范围:正数,默认值是1000行。 configuration_parameter value 把指定的数据库会话参数值设置为给定的值。如果value是DEFAULT或者RESET,则在新的会话中使用系统的缺省设置。OFF关闭设置。 取值范围:字符串 DEFAULT OFF RESET 指定默认值。 from current 取当前会话中的值设置为configuration_parameter的值。 obj_file, link_symbol 适用于C语言函数(当前特性是实验室特性,使用时请联系华为工程师提供技术支持),字符串obj_file指定了动态库的绝对路径;link_symbol指定了该函数的链接符号,也就是该函数在C代码中的函数名称。 plsql_body PL/SQL存储过程体。 当在函数体中创建用户时,日志中会记录密码的明文。因此不建议用户在函数体中创建用户。
  • 语法格式 12 CREATE GROUP group_name [ [ WITH ] option [ ... ] ] [ ENCRYPTED | UNENCRYPTED ] { PASSWORD | IDENTIFIED BY } { 'password' [ EXPIRED ] | DISABLE }; 其中可选项action子句语法为: 1 2 3 4 5 6 7 8 91011121314151617181920212223242526272829303132 where option can be:{SYSADMIN | NOSYSADMIN} | {MONADMIN | NOMONADMIN} | {OPRADMIN | NOOPRADMIN} | {POLADMIN | NOPOLADMIN} | {AUDITADMIN | NOAUDITADMIN} | {CREATEDB | NOCREATEDB} | {USEFT | NOUSEFT} | {CREATEROLE | NOCREATEROLE} | {INHERIT | NOINHERIT} | { LOG IN | NOLOGIN} | {REPLICATION | NOREPLICATION} | {INDEPENDENT | NOINDEPENDENT} | {VCADMIN | NOVCADMIN} | {PERSISTENCE | NOPERSISTENCE} | CONNECTION LIMIT connlimit | VALID BEGIN 'timestamp' | VALID UNTIL 'timestamp' | RESOURCE POOL 'respool' | USER GROUP 'groupuser' | PERM SPACE 'spacelimit' | NODE GROUP logic_group_name | IN ROLE role_name [, ...] | IN GROUP role_name [, ...] | ROLE role_name [, ...] | ADMIN role_name [, ...] | USER role_name [, ...] | SYSID uid | DEFAULT TABLESPACE tablespace_name | PROFILE DEFAULT | PROFILE profile_name | PGUSER
  • 功能描述 CREATE INCREMENTAL MATERIALIZED VIEW会创建一个增量物化视图,并且后续可以使用REFRESH MATERIALIZED VIEW(全量刷新)和REFRESH INCREMENTAL MATERIALIZED VIEW(增量刷新)刷新物化视图的数据。 CREATE INCREMENTAL MATERIALIZED VIEW类似于CREATE TABLE AS,不过它会记住被用来初始化该视图的查询, 因此它可以在后续中进行数据刷新。一个物化视图有很多和表相同的属性,但是不支持临时物化视图。
  • 示例 --创建一个普通表openGauss=# CREATE TABLE my_table (c1 int, c2 int);--创建增量物化视图openGauss=# CREATE INCREMENTAL MATERIALIZED VIEW my_imv AS SELECT * FROM my_table;--基表写入数据openGauss=# INSERT INTO my_table VALUES(1,1),(2,2);--对增量物化视图my_imv进行增量刷新openGauss=# REFRESH INCREMENTAL MATERIALIZED VIEW my_imv;
  • 参数说明 mv_name 要创建的物化视图的名称(可以被模式限定)。 取值范围:字符串,要符合标识符的命名规范。 column_name 新物化视图中的一个列名。物化视图支持指定列,指定列需要和后面的查询语句结果的列数量保持一致;如果没有提供列名,会从查询的输出列名中获取列名。 取值范围:字符串,要符合标识符的命名规范。 TABLESPACE tablespace_name 指定新建物化视图所属表空间。如果没有声明,将使用默认表空间。 AS query 一个SELECT或者TABLE 命令。这个查询将在一个安全受限的操作中运行。
  • 参数说明 client_master_key_name 该参数作为密钥对象名,在同一命名空间下,需满足命名唯一性约束。 取值范围:字符串,需符合标识符的命名规范。 KEY_STORE 独立管理密钥的工具/服务。目前,仅支持由 GaussDB 提供的密钥管理工具gs_ktool,以及由华为云提供的在线密钥管理服务huawei_kms。取值范围为:gs_ktool,huawei_kms。 由于我们仅在客户端与KEY_STORE进行交互,当使用不同的客户端时,本语法中KEY_STORE参数支持的类型也不尽相同。当使用gsql执行本语法时,KEY_STORE仅支持gs_ktool,当使用JDBC执行本语法时,KEY_STORE仅支持huawei_kms。 KEY_PATH 用于指定密钥管理工具/服务中的一个密钥。通过KEY_STORE和KEY_PATH参数可唯一确定一个密钥实体。当KEY_STORE = gs_ktool时,取值范围为:gs_ktool/KEY_ID;当KEY_STORE = huawei_kms时,取值范围为:36字节的密钥ID。 由该语法创建的CMK对象中,存储了KEY_STORE和KEY_PATH信息。当需要读取密钥实体时,GaussDB能够根据CMK对象中存储的信息,自动地从指定KEY_STORE中读取指定的密钥实体。因此,在本语法中,KEY_PATH参数应指向一个已经存在的密钥实体。 ALGORITHM 用于指定该密钥实体将用于何种加密算法。当KEY_STORE = gs_ktool时,取值范围为:AES_256_CBC,SM4;当KEY_STORE = huawei_kms时,取值为:AES_256。
  • 示例(在使用JDBC连接数据库服务器的场景下) 1 2 3 4 5 6 7 8 910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455 /* * (1) 登录华为云官网(https://www.huaweicloud.com),进入“控制台”-“服务列表”-“ 数据加密 服务 DEW”- “密钥管理”页面,创建一个密钥。 * 该服务即由华为云提供的密钥管理服务——KMS。当然,你还可通过编程接口进行密钥管理,详情请参考华为云公开文档 : * (https://support.huaweicloud.com/dew_faq/dew_01_0053.html) *//* *(2)与数据库服务器建立连接并执行本语法,在url中需开启全密态数据库的开关:enable_ce=1 * 说明:本部分代码作为示例代码,仅考虑通过最少代码实现最基本的功能 */import java.sql.*;public class CrtCmkTest { public static void main(String[] args) { String driver = "org.postgresql.Driver"; try { Class.forName(driver); } catch (Exception e) { e.printStackTrace(); return; } /* 用于与数据库服务器建立连接的信息 */ String dbUrl = "jdbc:postgresql://localhost:19900/postgres?enable_ce=1"; String dbUser = "alice"; String dbPassword = "********"; /* * 用于访问华为云KMS的身份认证信息与KMS项目信息 * 说明:本部分所有参数,均可在华为云官网“控制台”-“我的凭证”页面找到 */ String iamUser = "alice_for_kms"; String iamPassword = "********"; String kmsDomain = "hw00000000"; String kmsProjectName = "cn-east-3"; String kmsProjectId = "00000000000000000000000000000000"; /* 用于创建CMK密钥对象的SQL语句 */ String sql = "CREATE CLIENT MASTER KEY alice_cmk WITH ( " + "KEY_STORE = huawei_kms, KEY_PATH = \"00000000-0000-0000-0000-000000000000\" , ALGORITHM = AES_256);"; try { Connection conn = DriverManager.getConnection(dbUrl, dbUser, dbPassword); conn.setClientInfo("iamUser", iamUser); conn.setClientInfo("iamPassword", iamPassword); conn.setClientInfo("kmsDomain", kmsDomain); conn.setClientInfo("kmsProjectName", kmsProjectName); conn.setClientInfo("kmsProjectId", kmsProjectId ); Statement stmt = conn.createStatement(); System.out.println("results: " + stmt.executeUpdate(sql)); } catch (SQLException e) { e.printStackTrace(); } }}
  • 注意事项 当enable_access_server_directory=off时,只允许初始用户创建directory对象;当enable_access_server_directory=on时,具有SYSADMIN权限的用户和继承了内置角色gs_role_directory_create权限的用户可以创建directory对象。 创建用户默认拥有此路径的READ和WRITE操作权限。 目录的默认owner为创建directory的用户。 以下路径禁止创建: 路径含特殊字符。 路径是相对路径。 路径是符号连接。 创建目录时会进行以下合法性校验: 创建时会检查添加路径是否为操作系统实际存在路径,如不存在会提示用户使用风险。 创建时会校验数据库初始化(omm)用户对于添加路径的权限(即操作系统目录权限,读/写/执行 - R/W/X),如果权限不全,会提示用户使用风险。 在集群环境下用户指定的路径需要用户保证各节点上路径的一致性,否则在不同节点上执行会产生找不到路径的问题。
  • 语法格式 从一个文件拷贝数据到一个表。 1 2 3 4 5 6 7 8 910 COPY table_name [ ( column_name [, ...] ) ] FROM { 'filename' | STDIN } [ [ USING ] DELIMITERS 'delimiters' ] [ WITHOUT ESCAPING ] [ LOG ERRORS ] [ REJECT LIMIT 'limit' ] [ [ WITH ] ( option [, ...] ) ] | copy_option | TRANSFORM ( { column_name [ data_type ] [ AS transform_expr ] } [, ...] ) | FIXED FORMATTER ( { column_name( offset, length ) } [, ...] ) [ ( option [, ...] ) | copy_option [ ...] ] ]; 语法中的FIXED FORMATTER ( { column_name( offset, length ) } [, ...] )以及 [copy_option [ ...] ] 的无冲突项可以任意排列组合。 把一个表的数据拷贝到一个文件。 1 2 3 4 5 6 7 8 91011121314 COPY table_name [ ( column_name [, ...] ) ] TO { 'filename' | STDOUT } [ [ USING ] DELIMITERS 'delimiters' ] [ WITHOUT ESCAPING ] [ [ WITH ] ( option [, ...] ) ] | copy_option | FIXED FORMATTER ( { column_name( offset, length ) } [, ...] ) [ ( option [, ...] ) | copy_option [ ...] ] ];COPY query TO { 'filename' | STDOUT } [ WITHOUT ESCAPING ] [ [ WITH ] ( option [, ...] ) ] | copy_option | FIXED FORMATTER ( { column_name( offset, length ) } [, ...] ) [ ( option [, ...] ) | copy_option [ ...] ] ]; COPY TO语法形式约束如下: (query)与[USING] DELIMITERS不兼容,即若COPY TO的数据来自于一个query的查询结果,那么COPY TO语法不能再指定[USING] DELIMITERS语法子句。 对于FIXED FORMATTTER语法后面跟随的copy_option是以空格进行分隔的。 copy_option是指COPY原生的参数形式,而option是兼容外表导入的参数形式。 语法中的FIXED FORMATTER ( { column_name( offset, length ) } [, ...] )以及 [ copy_option [ ...] ] 的无冲突项可以任意排列组合。 其中可选参数option子句语法为: 1 2 3 4 5 6 7 8 9101112131415161718192021 FORMAT 'format_name'| OIDS [ boolean ]| DELIMITER 'delimiter_character'| NULL 'null_string'| HEADER [ boolean ]| FILEHEADER 'header_file_string'| FREEZE [ boolean ]| QUOTE 'quote_character'| ESCAPE 'escape_character'| EOL 'newline_character'| NOESCAPING [ boolean ]| FORCE_QUOTE { ( column_name [, ...] ) | * }| FORCE_NOT_NULL ( column_name [, ...] )| ENCODING 'encoding_name'| IGNORE_EXTRA_DATA [ boolean ]| FILL_MISSING_FIELDS [ boolean ]| COMPATIBLE_ILLEGAL_CHARS [ boolean ]| DATE_FORMAT 'date_format_string'| TIME_FORMAT 'time_format_string'| TIMESTAMP_FORMAT 'timestamp_format_string'| SMALLDATETIME_FORMAT 'smalldatetime_format_string' 其中可选参数copy_option子句语法为: 1 2 3 4 5 6 7 8 91011121314151617181920 OIDS | NULL 'null_string' | HEADER | FILEHEADER 'header_file_string' | FREEZE | FORCE_NOT_NULL column_name [, ...]| FORCE_QUOTE { column_name [, ...] | * }| BINARY | CS V | QUOTE [ AS ] 'quote_character' | ESCAPE [ AS ] 'escape_character' | EOL 'newline_character'| ENCODING 'encoding_name' | IGNORE_EXTRA_DATA | FILL_MISSING_FIELDS| COMPATIBLE_ILLEGAL_CHARS | DATE_FORMAT 'date_format_string' | TIME_FORMAT 'time_format_string' | TIMESTAMP_FORMAT 'timestamp_format_string' | SMALLDATETIME_FORMAT 'smalldatetime_format_string'
  • 示例 1 2 3 4 5 6 7 8 9101112131415161718192021222324252627282930313233343536 --将tpcds.ship_mode中的数据拷贝到/home/omm/ds_ship_mode.dat文件中。openGauss=# COPY tpcds.ship_mode TO '/home/omm/ds_ship_mode.dat';--将tpcds.ship_mode 输出到stdout。openGauss=# COPY tpcds.ship_mode TO stdout;--创建tpcds.ship_mode_t1表。openGauss=# 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))WITH (ORIENTATION = COLUMN,COMPRESSION=MIDDLE)DISTRIBUTE BY HASH(SM_SHIP_MODE_SK );--从stdin拷贝数据到表tpcds.ship_mode_t1。openGauss=# COPY tpcds.ship_mode_t1 FROM stdin;--从/home/omm/ds_ship_mode.dat文件拷贝数据到表tpcds.ship_mode_t1。openGauss=# COPY tpcds.ship_mode_t1 FROM '/home/omm/ds_ship_mode.dat';--从/home/omm/ds_ship_mode.dat文件拷贝数据到表tpcds.ship_mode_t1,应用TRANSFORM表达式转换,取SM_TYPE列左边10个字符插入到表中。openGauss=# COPY tpcds.ship_mode_t1 FROM '/home/omm/ds_ship_mode.dat' TRANSFORM (SM_TYPE AS LEFT(SM_TYPE, 10));--从/home/omm/ds_ship_mode.dat文件拷贝数据到表tpcds.ship_mode_t1,使用参数如下:导入格式为TEXT(format 'text'),分隔符为'\t'(delimiter E'\t'),忽略多余列(ignore_extra_data 'true'),不指定转义(noescaping 'true')。openGauss=# COPY tpcds.ship_mode_t1 FROM '/home/omm/ds_ship_mode.dat' WITH(format 'text', delimiter E'\t', ignore_extra_data 'true', noescaping 'true');--从/home/omm/ds_ship_mode.dat文件拷贝数据到表tpcds.ship_mode_t1,使用参数如下:导入格式为FIXED(FIXED),指定定长格式(FORMATTER(SM_SHIP_MODE_SK(0, 2), SM_SHIP_MODE_ID(2,16), SM_TYPE(18,30), SM_CODE(50,10), SM_CARRIER(61,20), SM_CONTRACT(82,20))),忽略多余列(ignore_extra_data),有数据头(header)。openGauss=# COPY tpcds.ship_mode_t1 FROM '/home/omm/ds_ship_mode.dat' FIXED FORMATTER(SM_SHIP_MODE_SK(0, 2), SM_SHIP_MODE_ID(2,16), SM_TYPE(18,30), SM_CODE(50,10), SM_CARRIER(61,20), SM_CONTRACT(82,20)) header ignore_extra_data;--删除tpcds.ship_mode_t1。openGauss=# DROP TABLE tpcds.ship_mode_t1;
  • 注意事项 当参数enable_copy_server_files关闭时,只允许初始用户执行COPY FROM FILENAME或COPY TO FILENAME命令,当参数enable_copy_server_files打开时,允许具有SYSADMIN权限的用户或继承了内置角色gs_role_copy_files权限的用户执行,但默认禁止对数据库配置文件,密钥文件,证书文件和审计日志执行COPY FROM FILENAME或COPY TO FILENAME,以防止用户越权查看或修改敏感文件。同时enable_copy_server_files打开时,管理员可以通过guc参数safe_data_path设置普通用户可以导入导出的路径必须为设置路径的子路径,未设置此guc参数时候(默认情况),不对普通用户使用的路径进行拦截。 COPY只能用于表,不能用于视图。 copy to需要读取的表的select权限,copy from需要插入的表的insert权限。 如果声明了一个字段列表,COPY将只在文件和表之间拷贝已声明字段的数据。如果表中有任何不在字段列表里的字段,COPY FROM将为那些字段插入缺省值。 如果声明了数据源文件,服务器必须可以访问该文件;如果指定了STDIN,数据将在客户前端和服务器之间流动,输入时,表的列与列之间使用TAB键分隔,在新的一行中以反斜杠和句点(\.)表示输入结束。 如果数据文件的任意行包含比预期多或者少的字段,COPY FROM将抛出一个错误。 数据的结束可以用一个只包含反斜杠和句点(\.)的行表示。如果从文件中读取数据,数据结束的标记是不必要的;如果在客户端应用之间拷贝数据,必须要有结束标记。 COPY FROM中\N为空字符串,如果要输入实际数据值\N ,使用\\N。
共100000条