华为云用户手册

  • 注意事项 通过CREATE USER创建的用户,默认具有 LOG IN权限。 通过CREATE USER创建用户的同时系统会在执行该命令的数据库中,为该用户创建一个同名的SCHEMA;其他数据库中,则不自动创建同名的SCHEMA;用户可使用CREATE SCHEMA命令,分别在其他数据库中,为该用户创建同名SCHEMA。 系统管理员在普通用户同名schema下创建的对象,所有者为schema的同名用户(非系统管理员)。 除系统管理员之外,其他用户即使被授权了schema的所有权限也无法在普通用户的同名schema下创建对象,除非把同名schema相关的角色权限赋予其他用户。具体操作可参考“赋予用户schema的all权限后建表仍然报错”章节。 尽量避免所有业务使用同一个数据库用户运行,请按业务模块规划不同数据库用户。 不建议使用系统管理员用户跑业务,不同模块业务请通过多用户和权限进行访问控制。 更多开发设计规范参见总体开发设计规范。
  • 语法格式 1 CREATE USER user_name [ [ WITH ] option [ ... ] ] [ ENCRYPTED | UNENCRYPTED ] { PASSWORD | IDENTIFIED BY } { 'password' | DISABLE }; 其中option子句用于设置权限及属性等信息。 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 26 27 28 29 30 31 {SYSADMIN | NOSYSADMIN} | {AUDITADMIN | NOAUDITADMIN} | {CREATEDB | NOCREATEDB} | {USEFT | NOUSEFT} | {CREATEROLE | NOCREATEROLE} | {INHERIT | NOINHERIT} | {LOGIN | NOLOGIN} | {REPLICATION | NOREPLICATION} | {INDEPENDENT | NOINDEPENDENT} | {VCADMIN | NOVCADMIN} | CONNECTION LIMIT connlimit | VALID BEGIN 'timestamp' | VALID UNTIL 'timestamp' | RESOURCE POOL 'respool' | USER GROUP 'groupuser' | PERM SPACE 'spacelimit' | TEMP SPACE 'tmpspacelimit' | SPILL SPACE 'spillspacelimit' | NODE GROUP logic_cluster_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 | AUTHINFO 'authinfo' | PASSWORD EXPIRATION period
  • 示例 创建一个Ispell词典类型的词典english_ispell(词典定义文件来自开源词典)。 1 2 3 4 5 6 7 CREATE TEXT SEARCH DICTIONARY english_ispell ( TEMPLATE = ispell, DictFile = english, AffFile = english, StopWords = english, FilePath = 'obs://bucket_name/path accesskey=ak secretkey=sk region=rg' ); 请参见配置示例一节的示例。
  • 参数说明 表1 CREATE TEXT SEARCH DICTIONARY参数说明 参数 描述 取值范围 name 要创建的全文检索词典的名称,可以用模式修饰。 字符串,需符合标识符命名规范。 template 模板名。 系统表PG_TS_TEMPLATE中定义的模板:Simple/Synonym/Thesaurus/Ispell/Snowball。 option 全文检索词典特定选项的参数名称。与template对应,不同的词典类型具有不同的参数列表,且与指定顺序无关。 详细参数说明参见表2。 value 参数值。如果不是简单的标识符或数字,则参数值必须加单引号(标识符和数字同样可以加上单引号)。 - 表2 Simple、Ispell、Synonym、Thesaurus、以及Snowball的option参数 option option参数选项的名称 描述 Simple词典对应的option STOPWORDS 停用词表文件名,默认后缀名为stop。例如STOPWORDS = french,则实际文件名为french.stop。停用词文件格式为一组word列表,每行定义一个停用词。词典处理时,文件中的空行和空格会被忽略,并将stopword词组转换为小写形式。 ACCEPT 是否将非停用词设置为已识别。默认值为true。 当Simple词典设置参数ACCEPT=true时,将不会传递任何token给后继词典,此时建议将其放置在词典列表的最后。反之,当ACCEPT=false时,建议将该Simple词典放置在列表中的至少一个词典之前。 FILEPATH 停用词文件所在目录。停用词文件可以存放于本地,也可以存放于 对象存储服务 OBS服务器。如果存在本地,目录格式为'file://absolute_path'。如果存放于OBS服务器,目录格式为'obs://bucket/path accesskey=ak secretkey=sk region=region_name'。注意目录要用单引号包含。默认值为预定义词典文件所在目录。FILEPATH参数必须和STOPWORDS参数同时指定,不允许单独指定。 使用OBS服务器上的停用词文件创建字典的过程如下: 将停用词文件上传到OBS服务器。例如将french.stop文件上传到OBS服务器obsv3.sa-fb-1.externaldemo.com上名为gaussdb的桶中,其URL为https://gaussdb.obsv3.sa-fb-1.externaldemo.com/french.stop。上传文件及查询URL的方式请参考OBS用户手册。 修改$GAUSSHOME/etc/region_map文件,在其中加入一行"region_name": "obs domain"。region_name可以为任意由大小写字母、数字、斜杠(/)或下划线组成的字符串。obs domain为OBS服务器的 域名 。 示例,将region_name设为rg,region_map包含的内容如:"rg": "obsv3.sa-fb-1.externaldemo.com"。 须知: region_name和obs domain都用双引号,冒号的左边没有空格,右边有1个空格。 执行CREATE TEXT SEARCH DICTIONARY命令创建字典。命令如下: 1 CREATE TEXT SEARCH DICTIONARY french_dict ( TEMPLATE = pg_catalog.simple, STOPWORDS = french, FILEPATH = 'obs://gaussdb accesskey=xxx secretkey=yyy region=rg' ); 由于french.stop文件放在gaussdb桶的根目录下,因此path为空。 Synonym词典对应的option SYNONYM 同义词词典的定义文件名,默认后缀名为syn。 文件格式为一组同义词列表,每行格式为"token synonym",即token和其对应的synonym,中间以空格相连。 CASESENSITIVE 设置是否大小写敏感,默认值为false,此时词典文件中的token和synonym均会转为小写形式处理。如果设置为true,则不会进行小写转换。 FILEPATH 同义词词典文件所在目录。目录可以指定为本地目录和OBS目录两种形式。默认值为预定义词典文件所在目录。其中目录格式、以及使用OBS服务器上的文件创建Synonym字典的过程与Simple字典相同。 Thesaurus词典对应的option DICTFILE 词典定义文件名,默认后缀名为ths。 文件格式为一组同义词列表,每行格式为"sample words : indexed words",中间冒号(:)作为短语和其替换词间的分隔符。TZ词典处理时,如果有多个匹配的sample words,将选择最长匹配输出。 DICTIONARY 用于词规范化的子词典名,必须且仅能定义一个。该词典必须是已经存在的,在检查短语匹配之前使用,用于识别和规范输入文本。 如果子词典无法识别输入词,将会报错。此时,需要移除该词或者更新子词典使其识别。此外,可在indexed words的开头放上一个星号(*)来跳过在其上应用子词典,但是所有sample words必须可以被子词典识别。 如果词典文件定义的sample words中,含有子词典中定义的停用词,需要用问号(?)替代停用词。假设a和the是子词典中所定义的停用词,如下: ? one ? two : swsw 上述同义词组定义会匹配"a one the two"以及"the one a two",这两个短语均会被swsw替代输出。 FILEPATH 词典定义文件所在目录。目录可以指定为本地目录和OBS目录两种形式。默认值为预定义词典文件所在目录。其中目录格式、以及使用OBS服务器上的文件创建Synonym字典的过程与Simple字典相同。 Ispell词典 DICTFILE 词典定义文件名,默认后缀名为dict。 AFFFILE 词缀文件名,默认后缀名为affix。 STOPWORDS 停用词文件名,默认后缀名为stop,文件格式要求与Simple类型词典的停用词文件相同。 FILEPATH 词典文件所在目录。可以指定为本地目录和OBS目录两种形式。默认值为预定义词典文件所在目录。其中目录格式、以及使用OBS服务器上的文件创建Synonym字典的过程与Simple字典相同。 Snowball词典 LANGUAGE 语言名,标识使用哪种语言的词干分析算法。算法按照对应语言中的拼写规则,缩减输入词的常见变体形式为一个基础词或词干。 STOPWORDS 停用词表文件名,默认后缀名为stop,文件格式要求与Simple类型词典的停用词文件相同。 FILEPATH 词典定义文件所在目录。可以指定为本地目录或者OBS目录。默认值为预定义词典文件所在目录。FILEPATH参数必须和STOPWORDS参数同时指定,不允许单独指定。其中目录格式、以及用OBS服务器上的文件创建Snowball字典的过程与Simple字典相同。
  • 注意事项 具有SYSADMIN权限的用户可以执行创建词典操作,创建该词典的用户自动成为其所有者。 临时模式(pg_temp)下不允许创建词典。 创建或修改词典之后,任何对于用户自定义的词典定义文件的修改,将不会影响到数据库中的词典。如果需要在数据库中使用这些修改,需使用ALTER语句更新对应词典的定义文件。 不支持修改词典的TEMPLATE参数值。 不支持仅修改FILEPATH参数而不修改对应的词典定义文件参数。 词典定义文件的文件名仅支持小写字母、数据、下划线混合。 预定义词典文件位于$GAUSSHOME/share/postgresql/tsearch_data目录下。
  • 注意事项 这种方式仅支持TEXT和 CS V格式,并且需要额外指定OBS连接信息。对于OBS上的ORC、CARBONDATA、PARQUET等格式数据,不适用这种方式,请参考CREATE FOREIGN TABLE (SQL on OBS or Hadoop)。 创建的外表分为只读外表(READ ONLY)和只写外表(WRITE ONLY)。缺省为只读外表。数据导入集群时,请将外表设为READ ONLY;导出时,请设为WRITE ONLY。 外表由命令执行者所有; OBS外表不需要显式指定分布方式,默认支持ROUNDROBIN分布方式; 所创建外表只对信息约束(Informational Constraint)约束生效。 OBS导入导出数据时,不支持中文路径。
  • 语法格式 1 2 3 4 5 6 7 8 CREATE FOREIGN TABLE [ IF NOT EXISTS ] table_name ( { column_name type_name [column_constraint ] | LIKE source_table | table_constraint [, ...]} [, ...] ) SERVER server_name OPTIONS ( { option_name ' value ' } [, ...] ) [ { WRITE ONLY | READ ONLY }] [ WITH error_table_name | LOG INTO error_table_name] [PER NODE REJECT LIMIT 'value'] ;
  • location参数说明 对于只读外表(默认为只读)的URL末尾可以指定到对象路径的前缀或直接指定到对象全路径。指定方式为obs://bucket/prefix。(其中,prefix是指对象路径的前缀。)例如:obs://mybucket/tpch/nation/ 对于obs://bucket/prefix格式,若显式指定region参数时,域名信息将会读取指定的region参数;若region参数不指定,则读取defaultRegion的值,即安装集群时指定的region。 对于可写外表,URL不需要指定文件名。外部表数据源位置只可指定一个,并且要预先创建好对应目录。 对于只读外表不能使用多个相同的URL地址。 向外表中插入数据需要指定location。 location参数中前缀gsobs、obs均支持,都识别为OBS的信息,若为gsobs时,其中包含obs url、bucket、prefix,若为obs时则表示bucket、prefix。 在实际导入导出数据时,location参数使用建议如下: 导入时“location”建议指定到具体文件名。如果仅指定到OBS桶或目录,则会导入其中的所有文本文件。当数据格式不正确时,则会报错。如果设置了容错,则容错表可能导入大量数据。 支持OBS单桶多文件导入,根据文件名前缀进行匹配,匹配到的文件都会被导入。 例如,有以下两个数据文件,只要在“location”中指定前缀mybucket/input_data/product_info就能识别并导入这两个文件。 mybucket/input_data/product_info.0 mybucket/input_data/product_info.1 导入时如果指定到文件名,例如“1.csv”,那么在此文件的桶或目录存在此名称为前缀的其他文件,也会被导入。即“1.csv1”、“1.csv22”等,都会被自动导入。 导入时,“location”中如果使用obs方式,支持多个url,并且用‘|’分隔;如果使用gsobs方式,则不支持多个路径。 导出时“location”默认按目录处理。如果仅指定到自定义名称的文件,则导出时会以该文件为名称创建目录,然后再生成导出文件。文件名由 GaussDB (DWS)自动生成。 导出时“location”只支持一个路径。
  • 示例 创建外表OBS_ft,用来以txt格式导入OBS上指定的对象数据到row_tbl表中: 认证用的AK和SK硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全。 1 2 3 4 5 6 7 8 9 DROP FOREIGN TABLE IF EXISTS OBS_ft; CREATE FOREIGN TABLE OBS_ft( a int, b int)SERVER gsmpp_server OPTIONS (location 'obs://gaussdbcheck/obs_ddl/test_case_data/txt_obs_informatonal_test001',format 'text',encoding 'utf8',chunksize '32', encrypt 'on',AC CES S_KEY 'access_key_value_to_be_replaced',SECRET_ACCESS_KEY 'secret_access_key_value_to_be_replaced',delimiter E'\x08') read only; DROP TABLE row_tbl; CREATE TABLE row_tbl( a int, b int); INSERT INTO row_tbl select * from OBS_ft;
  • 示例 本示例假定用户已预先成功创建控制组。 创建一个默认资源池,其控制组为“DefaultClass”组下属的“Medium”Timeshare Workload控制组: 1 CREATE RESOURCE POOL pool1; 创建一个资源池,其控制组指定为“DefaultClass”组下属的“High”Timeshare Workload控制组: 1 CREATE RESOURCE POOL pool2 WITH (CONTROL_GROUP="High"); 创建一个资源池,其控制组指定为“class1”组下属的“Low”Timeshare Workload控制组: 1 CREATE RESOURCE POOL pool3 WITH (CONTROL_GROUP="class1:Low"); 创建一个资源池,其控制组指定为“class1”组下属的“wg1”Workload控制组: 1 CREATE RESOURCE POOL pool4 WITH (CONTROL_GROUP="class1:wg1"); 创建一个资源池,其控制组指定为“class1”组下属的“wg2”Workload控制组: 1 CREATE RESOURCE POOL pool5 WITH (CONTROL_GROUP="class1:wg2:3"); 创建一个资源池,并打开该资源池的弹性并发扩展功能: 1 CREATE RESOURCE POOL pool6 WITH (enable_concurrency_scaling=true);
  • 语法格式 1 2 CREATE RESOURCE POOL pool_name [WITH ({MEM_PERCENT=pct | CONTROL_GROUP="group_name" | ACTIVE_STATEMENTS=stmt | MAX_DOP = dop | MEMORY_LIMIT='memory_size' | io_limits=io_limits | io_priority='priority' | nodegroup='nodegroup_name' | is_foreign = boolean | except_rule='except_rule' | weight=bandwidth_weight | enable_concurrency_scaling=boolean}[, ... ])];
  • 参数说明 表1 CREATE RESOURCE POOL参数说明 参数 描述 取值范围 pool_name 资源池名称。 资源池名称不能和当前数据库里已有的资源池重名。 取值范围:字符串,要符合标识符的命名规范。 group_name 控制组名称。 取值范围:字符串,要符合说明中的规则,其指定已创建的控制组。 设置控制组名称时,语法可以使用双引号,也可以使用单引号。 group_name对大小写敏感。 不指定group_name时,默认指定的字符串为“Medium”,代表指定DefaultClass控制组的“Medium”Timeshare控制组。 若数据库管理员指定自定义Class组下的Workload控制组,如control_group的字符串为:“class1:workload1”;代表此资源池指定到class1控制组下的workload1控制组。也可同时指定Workload控制组的层次,如control_group的字符串为:“class1:workload1:1”。 若数据库用户指定Timeshare控制组代表的字符串,即“Rush”、“High”、“Medium”或“Low”其中一种,如control_group的字符串为“High”;代表资源池指定到DefaultClass控制组下的“High”Timeshare控制组。 多租户场景下,组资源池关联的控制组为Class级别,业务资源池关联Workload控制组。且不允许在各种资源池间相互切换。 stmt 资源池语句执行的最大并发数量。 取值范围:数值型,-1~INT_MAX。 dop 资源池简单语句执行的最大并发数量。 取值范围:数值型,1~INT_MAX。 memory_size 资源池最大使用内存。 取值范围:字符串,内容范围1KB~2047GB。 mem_percent 资源池可用内存占全部内存或者组用户内存使用的比例。 在多租户场景下,组用户和业务用户的mem_percent范围1-100,默认为20。 在普通场景下,普通用户的mem_percent范围为0-100,默认值为0。 须知: mem_percent和memory_limit同时指定时,只有mem_percent起作用。 io_limits 该参数8.1.2版本中已废弃,为兼容历史版本保留该参数。 - io_priority 该参数8.1.2版本中已废弃,为兼容历史版本保留该参数。 - nodegroup 在逻辑集群模式下,指定资源池所属的逻辑集群名称。必须是存在的逻辑集群。 如果逻辑集群名称包含大写字符、特殊符号或以数字开头,SQL语句中对逻辑集群名称需要加双引号。 is_foreign 在逻辑集群模式下,指定当前资源池用于控制没有关联本逻辑集群的普通用户的资源。这里的逻辑集群是由资源池nodegroup字段指定的。 nodegroup必须是存在的逻辑集群,不能是elastic_group和安装的nodegroup (group_version1)。 如果指定了is_foreign为true,则资源池不能再关联用户,即不允许通过CREATE USER ... RESOURCE POOL语句来将该资源池配置给用户。该资源池自动检查用户是否关联到资源池指定的逻辑集群,如果用户没有关联到该逻辑集群,则这些用户在逻辑集群所包含的DN上运行将受到该资源池的资源控制。 except_rule 异常规则集。 - weight 资源池网络带宽权重。 - enable_concurrency_scaling 弹性并发扩展功能开关。该功能仅9.1.0.100及以上集群版本支持。 取值范围: true表示开启该资源池作业的弹性并发扩展功能。 false表示关闭该资源池作业的弹性并发扩展功能。 默认值:false
  • 参数说明 表1 CREATE FUNCTION参数说明 参数 描述 取值范围 function_name 要创建的函数名字(可以用模式修饰)。 取值范围:字符串,要符合标识符的命名规范。参见标识符命名规范。 须知: 如果创建的函数名与系统函数同名,建议指定schema。调用自定义函数时需指定schema,否则系统会优先调用系统函数。 argname 函数参数的名字。 取值范围:字符串,要符合标识符的命名规范。 argmode 函数参数的模式。 取值范围:IN,OUT,INOUT或VARIADIC。缺省值是IN。只有OUT模式的参数后面能跟VARIADIC。并且OUT和INOUT模式的参数不能用在RETURNS TABLE的函数定义中。 说明: VARIADIC用于声明数组类型的参数。 argtype 函数参数的类型。 - expression 函数参数的默认表达式。 - rettype 函数返回值的数据类型。 如果存在OUT或IN OUT参数,可以省略RETURNS子句。如果存在,该子句必须和输出参数所表示的结果类型一致:如果有多个输出参数,则为RECORD,否则与单个输出参数的类型相同。 SETOF修饰词表示该函数将返回一个集合,而不是单独一项。 DETERMINISTIC 为适配Oracle SQL语法,未实现功能,不推荐使用。 - column_name 字段名称。 - column_type 字段类型。 - definition 一个定义函数的字符串常量,含义取决于语言。它可以是一个内部函数名字、一个指向某个目标文件的路径、一个SQL查询、一个过程语言文本。 - LANGUAGE lang_name 用于实现函数的语言的名字。可以是SQL,internal,或者是用户定义的过程语言名字。为了保证向下兼容,该名字可以用单引号(包围)。若采用单引号,则引号内必须为大写。 - WINDOW 表示该函数是窗口函数,替换函数定义时不能改变WINDOW属性。 须知: 自定义窗口函数只支持LANGUAGE是internal,并且引用的内部函数必须是窗口函数。 IMMUTABLE 表示该函数在给出同样的参数值时总是返回同样的结果。 如果函数的入参是常量,会在优化器阶段计算该函数的值。益处是可以尽早获取表达式的值,从而能更准确的进行代价估算,生成的执行计划也更优。 用户自定义的IMMUTABLE的函数是会被自动下推到DN执行的,但是这样可能有潜在的风险,即如果用户错误定义了函数的IMMUTABLE属性,但是函数执行的过程并不是IMMUTABLE的,那么可能会导致结果错误等严重问题。因此,用户在指定函数的属性为IMMUTABLE的时候,要特别慎重。 举例如下: 如果自定义函数中引用了表,视图等对象,那么该函数就不能定义为IMMUTABLE,因为当表的数据发生变化的时候,函数的返回值可能发生变化。 如果自定义函数中引用了STABLE/VOALATILE类型的函数,那么该函数不能定义为IMMUTABLE。 如果自定义函数中有不下推的因素,则该函数不能定义成IMMUTABLE,因为IMMUTABLE意味着要下推到DN执行,与函数内部的不下推因素相互冲突。典型场景例如,包含不下推的函数、语法等。 如果自定义函数中含有聚合运算,但聚合运算的运算需要生成STREAM计划才能完成计算的(部分结果在DN计算,部分结果在CN计算,例如listagg函数等)。 同时,为了防止这种情况下可能出现严重问题,数据库内部可以通过设置behavior_compat_options=‘check_function_conflicts’来开启对函数定义冲突的检查,目前可以识别出上述1和2场景。 STABLE 表示该函数不能修改数据库,对相同参数值,在同一次表扫描里,该函数的返回值不变,但是返回值可能在不同SQL语句之间变化。 - VOLATILE 表示该函数值可以在一次表扫描内改变,因此不会做任何优化。 - SHIPPABLE NOT SHIPPABLE 表示该函数是否可以下推到DN上执行。 对于IMMUTABLE类型的函数,函数始终可以下推到DN上执行。 对于STABLE/VOLATILE类型的函数,仅当函数的属性是SHIPPABLE的时候,函数可以下推到DN执行。 用户在定义函数的SHIPPABLE属性时也需特别慎重,SHIPPABLE意味着整个函数会下推到DN上执行,如果设置不当,会导致结果错误等严重问题。 与定义IMMUTABLE属性一样,SHIPPABLE属性的定义也有诸多约束,简单来说就是函数内不能有不可下推的因素,函数下推到单DN执行后,函数内部的计算逻辑仅依赖当前DN的数据集合。 举例如下: 如果函数内部引用了表,并且表为HASH分布,那么该函数通常不能定义为SHIPPABLE。 函数内部有不可下推的因素,函数,语法等,那么该函数不能定义为SHIPPABLE,可参考语句下推调优。 函数内部的计算过程可能需要跨DN数据,这种情况该函数通常不能定义为SHIPPABLE,例如一些聚合运算等。 PACKAGE 表示该函数是否支持重载。PostgreSQL风格的函数本身就支持重载,此参数主要是针对Oracle风格的函数。 不允许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 该函数只对用户定义的C函数生效,声明函数是在保护模式还是非保护模式下执行。如果函数声明为NOT FENCED模式,则函数的执行在CN或者DN进程中进行。如果函数声明为FENCED模式,则函数在新fork的进程执行,这样函数的异常不会影响CN或者DN进程。 FENCED/NOT FENCED模式的选择: 正在开发或者调试的Function使用FENCED模式。开发测试完成,使用NOT FENCED模式执行,减少fork进程以及通信的开销。 复杂的操作系统操作,例:打开文件,信号处理,线程处理等操作,使用FENCED模式。否则可能影响GaussDB(DWS)数据库的执行。 默认值为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的值。 plsql_body PL/SQL存储过程体。 须知: 当在函数中创建用户时,日志中会记录密码的明文。因此不建议用户在函数中创建用户。
  • 示例 定义函数为SQL查询: 1 2 3 4 5 CREATE FUNCTION func_add_sql(integer, integer) RETURNS integer AS 'select $1 + $2;' LANGUAGE SQL IMMUTABLE RETURNS NULL ON NULL INPUT; 利用参数名用PL/pgSQL自增一个整数: 1 2 3 4 5 CREATE OR REPLACE FUNCTION func_increment_plsql(i integer) RETURNS integer AS $$ BEGIN RETURN i + 1; END; $$ LANGUAGE plpgsql; 返回RECORD类型: 1 2 3 4 5 6 7 8 9 CREATE OR REPLACE FUNCTION compute(i int, out result_1 bigint, out result_2 bigint) returns SETOF RECORD as $$ begin result_1 = i + 1; result_2 = i * 10; return next; end; $$language plpgsql; 返回一个包含多个输出参数的记录: 1 2 3 4 CREATE FUNCTION func_dup_sql(in int, out f1 int, out f2 text) AS $$ SELECT $1, CAST($1 AS text) || ' is text' $$ LANGUAGE SQL; SELECT * FROM func_dup_sql(42); 计算两个整数的和,并返回结果。若果输入为null,则返回null: 1 2 3 4 5 6 CREATE FUNCTION func_add_sql2(num1 integer, num2 integer) RETURN integer AS BEGIN RETURN num1 + num2; END; / 创建package属性的重载函数: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 CREATE OR REPLACE FUNCTION package_func_overload(col int, col2 int) return integer package as declare col_type text; begin col := 122; dbms_output.put_line('two int parameters ' || col2); return 0; end; / CREATE OR REPLACE FUNCTION package_func_overload(col int, col2 smallint) return integer package as declare col_type text; begin col := 122; dbms_output.put_line('two smallint parameters ' || col2); return 0; end; /
  • 语法格式 兼容PostgreSQL风格的创建自定义函数语法。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 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 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 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 ][...] { IS | AS } plsql_body /
  • 注意事项 如果创建函数时参数或返回值带有精度,不进行精度检测。 创建函数时,函数定义中对表对象的操作建议都显式指定模式,否则可能会导致函数执行异常。 在创建函数时,函数内部通过SET语句设置current_schema和search_path无效。执行完函数search_path和current_schema与执行函数前的search_path和current_schema保持一致。 如果函数参数中带有出参,SELECT调用函数必须缺省出参,CALL调用函数适配Oracle必须指定出参,对于调用重载的带有PACKAGE属性的函数,CALL调用函数可以缺省出参,具体信息参见CALL的示例。 兼容PostgreSQL风格的函数或者带有PACKAGE属性的函数支持重载。在指定REPLACE的时候,如果参数个数、类型、返回值有变化,不会替换原有函数,而是会建立新的函数。 SELECT调用可以指定不同参数来进行同名函数调用。由于语法CALL适配自Oracle,因此不支持调用不带有PACKAGE属性的同名函数。 在创建function时,不能在avg函数外面嵌套其他agg函数,或者其他系统函数。 在非逻辑集群模式下,暂不支持将返回值、参数以及变量设置为建在非系统默认安装Node Group的表,sql function内部语句暂不支持对建在非系统默认安装Node Group的表操作。 在逻辑集群模式下,如果函数返回值和参数是用户表类型,所有涉及表都必须在同一逻辑集群内;如果函数内部涉及对多个逻辑集群表操作,函数定义时不能为IMMUTABLE和SHIPPABLE类型,以避免函数被下推到DN执行。 在逻辑集群模式下,函数参数、返回值不能用%type引用表字段类型,否则会导致函数创建失败。 新创建的函数默认会给PUBLIC授予执行权限(详见GRANT)。用户可以选择收回PUBLIC默认执行权限,然后根据需要将执行权限授予其他用户,为了避免出现新函数能被所有人访问的时间窗口,应在一个事务中创建函数并且设置函数执行权限。 在多个CN的集群中,不能将函数的入参或出参设置为临时表类型,因为在非当前连接CN上执行创建函数过程中,无法单独根据表名获取到正确的临时schema,进而无法获取到准确的表类型。
  • 示例 创建外部服务器hdfs_server,其中hdfs_fdw为数据库中存在的foreign data wrapper。 1 2 3 4 5 CREATE SERVER hdfs_server FOREIGN DATA WRAPPER HDFS_FDW OPTIONS (address '10.10.0.100:25000,10.10.0.101:25000', hdfscfgpath '/opt/hadoop_client/HDFS/hadoop/etc/hadoop', type 'HDFS' ) ; 修改外部服务器hdfs_server的address选项。 1 ALTER SERVER hdfs_server OPTIONS ( SET address '10.10.0.110:25000,10.10.0.120:25000'); 修改外部服务器hdfs_server的hdfscfgpath选项。 1 ALTER SERVER hdfs_server OPTIONS ( SET hdfscfgpath '/opt/bigdata/hadoop');
  • 语法格式 修改外部服务的参数。 1 2 ALTER SERVER server_name [ VERSION 'new_version' ] [ OPTIONS ( {[ ADD | SET | DROP ] option ['value']} [, ... ] ) ]; 修改外部服务的所有者。 1 2 ALTER SERVER server_name OWNER TO new_owner; 修改外部服务的名称。 1 2 ALTER SERVER server_name RENAME TO new_name; 刷新HDFS配置文件。 1 ALTER SERVER server_name REFRESH OPTIONS;
  • 参数说明 表1 ALTER SERVER参数说明 参数 描述 取值范围 server_name 需要修改的外部服务的名称。 已存在的外部服务器名。 new_version 新的外部服务器版本。 - OPTIONS 更改服务器的选项。ADD、SET和DROP指定要执行的操作。OPTIONS选项未指定时默认为ADD操作。 对于HDFS Server目前只支持SET操作,ADD/DROP操作现有版本不支持。语法中SET和DROP操作语法依然保留,以便后续扩展使用。 option和value为对应操作的参数可参考表2。 new_owner 外部服务器的新所有者。 有效的用户名。 new_name 外部服务器的新名称。 字符串,需符合标识符命名规范。 REFRESH OPTIONS 刷新HDFS的配置文件缓存信息,在配置文件有变动时执行,若不执行可能会访问报错。 须知: 该参数用于更新hdfs server配置缓存,不能与其相关的HDFS外表访问并发。 - 表2 修改外部服务器所支持的OPTIONS参数说明 参数 描述 取值范围 address OBS服务的终端节点(Endpoint)。 HDFS集群的主备节点所在的IP地址以及端口。 说明: 对于HDFS server,address必须存在,所以ADD和DROP操作不被允许。 address目前只支持点分十进制格式的IPv4格式,且address字符串中不能出现空格,多组address以逗号作为分隔符。ip和port之间使用“:”来区分。HDFS集群中ip、port组对推荐设置两组,分别对应HDFS NameNode主备节点的address。 当server类型为 DLI 时,address为DLI服务上数据所存储的OBS address。 - hdfscfgpath HDFS集群的配置文件。 说明: 若HDFS为安全模式时,hdfscfgpath是必选项,否则为可选项。 若设置hdfscfgpath时,path仅能设置一个。 - fed 表示dfs_fdw连接的是HDFS为联邦模式。 取值rbf,表示HDFS为联邦rbf方式。 说明: 该参数8.1.2及以上版本支持;8.0.0基线版本下,仅8.0.0.10及以上版本支持。 - encrypt 是否对数据进行加密,该参数仅支持在type为OBS时设置。默认值为off。 on表示对数据进行加密。 off表示不对数据进行加密。 access_key OBS访问协议对应的AK值(OBS云服务界面由用户获取),创建外表时AK值会加密保存到数据库的元数据表中。该参数仅支持type为OBS时设置。 - secret_access_key OBS访问协议对应的SK值(OBS云服务界面由用户获取),创建外表时SK值会加密保存到数据库的元数据表中。该参数仅支持type为OBS时设置。 - dli_address DLI服务的终端节点,即endpoint。该参数仅支持type为DLI时设置。 - dli_access_key DLI访问协议对应的AK值(DLI云服务界面由用户获取),创建外表时AK值会保存到数据库的元数据表中。该参数仅支持type为DLI时设置。 - dli_secret_access_key DLI访问协议对应的SK值(DLI云服务界面由用户获取),创建外表时SK值会加密保存到数据库的元数据表中。该参数仅支持type为DLI时设置。 - region 此参数表示OBS服务的IP地址或者域名信息。该参数仅支持type为OBS时设置。 - dbname 用于协同分析、跨集群互联互通,表示将要连接的远端集群的数据库名称。 - username 用于协同分析、跨集群互联互通,表示将要连接的远端集群的用户名。 - password 用于协同分析、跨集群互联互通,表示将要连接的远端集群的用户名密码。 - syncsrv 仅用于跨集群互联互通,表示数据同步过程中使用到的GDS服务,设置方式与GDS外表的location属性相同。该参数仅8.1.2及以上版本支持。 -
  • 示例 创建全文检索词典my_dict。 1 2 3 4 5 CREATE TEXT SEARCH DICTIONARY my_dict ( TEMPLATE = snowball, Language = english, StopWords = english ); 修改全文检索词典my_dict的Language参数,并删除停用词定义。 1 ALTER TEXT SEARCH DICTIONARY my_dict (Language = dutch,StopWords); 更新全文检索词典my_dict定义,实际不更改任何内容。 1 ALTER TEXT SEARCH DICTIONARY my_dict (dummy);
  • 参数说明 表1 ALTER TEXT SEARCH DICTIONARY参数说明 参数 描述 取值范围 name 需要修改的全文检索词典的名称,可以用模式修饰。 有效的全文检索词典名。 option 要修改的全文检索词典特定选项的参数名称。与template对应,不同的词典类型具有不同的参数列表,且与指定顺序无关。 说明: 不支持修改词典的TEMPLATE参数值。 不支持仅修改FILEPATH参数而不修改对应的词典定义文件参数。 词典定义文件的文件名仅支持小写字母、数据、下划线混合。 详细参数说明请见表1中option参数。 value 要修改的参数值。如果省略等号(=)和value,则表示删除该option的先前设置,使用默认值。 对应option定义。 new_name 全文检索词典的新名称。 字符串,需符合标识符命名规范。 new_owner 全文检索词典的新所有者。 有效的用户名。 new_schema 全文检索词典的新模式。 有效的模式名。
  • 语法格式 修改词典定义。 1 ALTER TEXT SEARCH DICTIONARY name ( option = value | option [, ...] ); 重命名词典。 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;
  • 示例 创建一个名为serial的递增序列,从101开始。 1 2 3 CREATE SEQUENCE serial START 101 CACHE 20; 从序列中选出下一个数字。 1 2 3 4 SELECT nextval('serial'); nextval --------- 101 从序列中选出下一个数字。 1 2 3 4 SELECT nextval('serial'); nextval --------- 102 创建与表关联的序列。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 CREATE TABLE customer_address ( ca_address_sk integer not null, ca_address_id char(16) not null, ca_street_number char(10) , ca_street_name varchar(60) , ca_street_type char(15) , ca_suite_number char(10) , ca_city varchar(60) , ca_county varchar(30) , ca_state char(2) , ca_zip char(10) , ca_country varchar(20) , ca_gmt_offset decimal(5,2) , ca_location_type char(20) ) ; CREATE SEQUENCE serial1 START 101 CACHE 20 OWNED BY customer_address.ca_address_sk; 使用serial创建主键自增序列表serial_table。 1 2 3 4 5 6 7 8 9 CREATE TABLE serial_table(a int, b serial); INSERT INTO serial_table (a) VALUES (1),(2),(3); SELECT * FROM serial_table ORDER BY b; a | b ---+--- 1 | 1 2 | 2 3 | 3 (3 rows)
  • 语法格式 1 2 3 4 CREATE SEQUENCE [ IF NOT EXISTS ] name [ INCREMENT [ BY ] increment ] [ MINVALUE minvalue | NO MINVALUE | NOMINVALUE ] [ MAXVALUE maxvalue | NO MAXVALUE | NOMAXVALUE] [ START [ WITH ] start ] [ CACHE cache ] [ [ NO ] CYCLE | NOCYCLE ] [ OWNED BY { table_name.column_name | NONE } ];
  • 参数说明 表1 CREATE SEQUENCE参数说明 参数 描述 取值范围 IF NOT EXISTS 指定IF NOT EXISTS时,若不存在同名SEQUENCE,则可以成功创建SEQUENCE。若已存在同名SEQUENCE,创建时不会报错,仅会提示该SEQUENCE已存在,且不执行任何操作。 该参数仅9.1.0及以上版本支持。 - name 将要创建的序列名称。 字符串,需符合标识符命名规范。 increment 指定序列的步长。正值将生成一个递增的序列,负值将生成一个递减的序列。 默认值为1。 - MINVALUE minvalue | NO MINVALUE| NOMINVALUE 确定序列可以生成的最小值。如果没有指定minvalue或者指定了NO MINVALUE,则递增序列的缺省值为1,递减序列的缺省值为-263-1。 NOMINVALUE等价于NO MINVALUE。 - MAXVALUE maxvalue | NO MAXVALUE| NOMAXVALUE 确定序列可以生成的最大值。如果没有声明maxvalue或者声明了NO MAXVALUE,则递增序列的缺省值为263-1,递减序列的缺省值为-1。 NOMAXVALUE等价于NO MAXVALUE。 - start 指定序列的起始值。 默认值:对于递增序列为minvalue,递减序列为maxvalue。 - cache 指定数据库预先缓存(预分配)多少个序列号到内存中,从而加快访问速度。一个缓存周期内,CN不再向GTM索取序列号,而是使用本地预先申请的序列号。 9.1.0.100及以上集群版本中缺省值由GUC参数default_sequence_cache控制。 新安装的9.1.0.100及以上集群版本中,默认值为20。 从低版本升级到9.1.0.100及以上集群版本,默认值为1。表示一次只能生成一个值,即没有缓存。 不建议同时定义cache和maxvalue或minvalue。因为定义cache后不能保证序列的连续性,可能会产生空洞,造成序列号段浪费。 建议cache值不要设置过大,否则会出现缓存序列号时(每个cache周期的第一个nextval)耗时过长的情况;同时建议cache值小于100000000。实际使用时应根据业务设置合理的cache值,既能保证快速访问,又不会浪费序列号。 CYCLE | NOCYCLE 当序列达到maxvalue或者minvalue时,允许序列可循环重新开始。 默认值为NO CYCLE,表示序列达到极大或极小值后将无法生成新值。NOCYCLE的作用等价于NO CYCLE。 如果指定序列为CYCLE,则不能保证序列的唯一性。 如果指定了NO CYCLE,则在序列达到其最大值后任何对nextval的调用都将返回错误。 - OWNED BY 将序列与特定表的指定字段相关联。这样,如果该字段或其所在表被删除,该序列也将被自动删除。关联的表和序列的所有者必须是同一个用户,并且在同一个模式中。 缺省值为OWNED BY NONE,表示不存在这种关联。 通过指定OWNED BY,仅建立了表的对应列和SEQUENCE之间关联关系,并不会在插入数据时在该列上产生自增序列。 通过指定OWNED BY创建的SEQUENCE不建议用于其他表,如果希望多个表共享SEQUENCE,该SEQUENCE不应该从属于特定表。
  • 注意事项 创建序列的用户为该序列的所有者。 如果指定了模式名称,则会在指定模式中创建序列,否则会在当前模式中创建。序列名必须和同一个模式中的其他序列、表、索引、视图或外表的名字不同。 创建序列后,在表中使用序列的nextval()函数和generate_series(1,N)函数对表插入数据,请保证nextval的可调用次数大于等于N+1次,否则会因为generate_series()函数会调用N+1次而导致报错。 不支持在template1数据库中创建SEQUENCE。
  • 参数说明 表1 CREATE SUBSCRIPTION参数说明 参数 描述 取值范围 name 新订阅的名称。 取值范围:字符串,要符合标识符的命名规范。参见标识符命名规范。 conninfo 连接发布端的字符串。 如host=1.1.1.1,2.2.2.2 port=10000,20000 dbname=postgres user=repusr1 password=password_123。 host 发布端IP地址,可以同时指定发布端主机和备机的IP地址,如果同时指定了多个IP,以英文逗号分隔。 port 发布端端口,此处的端口不能使用主端口,而应该使用主端口+1端口,否则会与线程池冲突。可以同时指定发布端主机和备机的端口,如果同时指定了多个端口,以英文逗号分隔。 注意: host和port的数量要一致,并且要一一对应。 dbname 发布所在的数据库。 user和password 用于连接发布端且具有系统管理员权限(SYSADMIN)或者运维管理员权限(OPRADMIN)的用户名和密码。 publication_name 要订阅的发布端的发布名称,一个订阅可以对应多个发布。 - WITH 该子句指定订阅的可选参数,支持的参数如右列所示。 enabled 指定订阅是否应该主动复制,或者是否应该只是设置,但尚未启动。 取值范围:true,false。 默认值:true。 create_slot 指定该命令是否要在发布者上创建复制槽。 取值范围:true,false。 默认值:true。 slot_name 要使用的复制槽的名称。 取值范围:字符串。 默认值:默认使用订阅名称作为复制槽的名称。
  • SDK列表 在开始使用之前,请确保您安装的是最新版本的SDK。使用过时的版本可能会导致兼容性问题或无法使用最新功能。您可以在 SDK中心 查询版本信息。 表1提供了 DataArts Studio 服务支持的SDK列表,您可以在GitHub仓库查看SDK更新历史、获取安装包以及查看指导文档。 如果无法正常打开GitHub仓库,请检查您所使用的网络是否可以正常访问公网。由于GitHub的服务器部署在国外,国内用户访问时容易遇到无法打开的情况,请切换网络后再尝试打开。 表1 SDK列表 编程语言 Github地址 参考文档 Java huaweicloud-sdk-java-v3 Java SDK使用指导 Python huaweicloud-sdk-python-v3 Python SDK使用指导 Go huaweicloud-sdk-go-v3 Go SDK使用指导
  • 调用API示例 在工程中引入sdk(signer.go)。 import "apig-sdk/go/core" 生成一个新的Signer,输入AppKey和AppSecret。 // 认证用的ak和sk编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全; // 本示例以ak和sk保存在环境变量中来实现身份验证为例,运行本示例前请先在本地环境中设置环境变量SDK_AK和SDK_SK。 ak = os.Getenv("SDK_AK"); sk = os.Getenv("SDK_SK"); s := core.Signer{ Key: ak, Secret: sk, } 生成一个新的Request,指定域名、方法名、请求url、query和body。 r, _ := http.NewRequest("POST", "http:/c967a237-cd6c-470e-906f-a8655461897e.apigw.cn-north-1.huaweicloud.com/api?a=1&b=2", ioutil.NopCloser(bytes.NewBuffer([]byte("foo=bar")))) 给请求添加header头,内容为具体参数数据。如有需要,添加需要签名的其他头域。 r.Header.Add("x-stage", "RELEASE") r.Header.Add("name","value") 进行签名,执行此函数会在请求中添加用于签名的X-Sdk-Date头和Authorization头。然后为请求添加x-Authorization头,值与Authorization头相同。 s.Sign(r) authorization := r.Header.Get("Authorization") r.Header.Add("x-Authorization", authorization) 访问API,查看访问结果。 resp, err := http.DefaultClient.Do(r) body, err := ioutil.ReadAll(resp.Body)
  • 准备环境 已获取API的域名、请求url、请求方法、AppKey和AppSecret等信息,具体参见认证前准备。 获取并安装Nodejs安装包,如果未安装,请至Nodejs官方网站下载。 Nodejs安装后,在命令行中,用npm安装“moment”和“moment-timezone”模块。 npm install moment --save npm install moment-timezone --save 获取并安装IntelliJ IDEA,如果未安装,请至IntelliJ IDEA官方网站下载。 已在IntelliJ IDEA中安装NodeJS插件,如果未安装,请按照图1所示安装。 图1 安装NodeJS插件
共100000条
提示

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