华为云用户手册

  • transaction_sync_timeout 参数说明:为保证数据一致性,当本地事务与GTM上snapshot中状态不一样时会阻塞其他事务的运行,需要等待本地节点上事务状态与GTM状态一致后再运行。当CN上等待时长超过transaction_sync_timeout时会报错,回滚事务,避免由于sync lock等其他情况长时间进程停止响应造成对系统的阻塞。 该参数属于USERSET类型参数,请参考表1中对应设置方法进行设置。 取值范围:整型,0 ~ 2147483,单位为秒(s)。 默认值:10min
  • CM相关参数 CM相关参数的修改对 GaussDB 的运行机制有影响,建议由GaussDB的工程师协助修改。修改CM相关参数的方法,请参考表2中方式一进行设置。 cm_agent相关参数可通过cm_agent数据目录下的cm_agent.conf文件查看,cm_server相关参数可通过cm_server数据目录下的cm_server.conf文件查看。 cm_agent参数 cm_server参数 父主题: GUC参数说明
  • td_compatible_truncation 参数说明:控制是否开启与Teradata数据库相应兼容的特征。该参数在用户连接上与TD兼容的数据库时,可以将参数设置成为on(即超长字符串自动截断功能启用),该功能启用后,在后续的insert语句中,对目标表中char和varchar类型的列插入超长字符串时,会按照目标表中相应列定义的最大长度对超长字符串进行自动截断。保证数据都能插入目标表中,而不是报错。 超长字符串自动截断功能不适用于insert语句包含外表的场景。 如果向字符集为字节类型编码(SQL_ASCII,LATIN1等)的数据库中插入多字节字符数据(如汉字等),且字符数据跨越截断位置,这种情况下,按照字节长度自动截断,自动截断后会在尾部产生非预期结果。如果用户有对于截断结果正确性的要求,建议用户采用UTF8等能够按照字符截断的输入字符集作为数据库的编码集。 该参数属于USERSET类型参数,请参考表1中对应设置方法进行设置。 取值范围:布尔型 on表示启动超长字符串自动截断功能。 off表示停止超长字符串自动截断功能。 默认值:off
  • nls_timestamp_tz_format 参数说明:设置带时区时间戳默认格式。 该参数属于USERSET类型参数,请参考表1中对应设置方法进行设置。 取值范围:字符串,支持格式同nls_timestamp_format。 默认值:DD-Mon-YYYY HH:MI:SS.FF AM 此参数在参数a_format_version值为10c和a_format_dev_version值为s1的情况下有效。
  • a_format_version 参数说明:数据库平台兼容性行为配置项,该参数的值为字符串枚举值。 该参数属于USERSET类型参数,请参考表1中对应设置方法进行设置。 取值范围:字符串 默认值:"" 当前只支持兼容性配置项如表2所示。 兼容性配置项时设置字符串,例如:set a_format_version='10c'; 表2 兼容性配置项 兼容性配置项 兼容性行为控制 10c ORA平台兼容10C版本
  • a_format_dev_version 参数说明:数据库平台迭代小版本兼容性行为配置项,该参数的值为字符串枚举值。 该参数属于USERSET类型参数,请参考表1中对应设置方法进行设置。 取值范围:字符串 默认值:"" 当前只支持兼容性配置项如表3所示。 兼容性配置项时设置字符串,例如:set a_format_dev_version='s1'; 表3 兼容性配置项 兼容性配置项 兼容性行为控制 s1 ORA平台兼容迭代小版本,影响函数(TRUNC(date, fmt),ROUND(date, fmt),NVL2,LPAD,RPAD,ADD_MONTHS,MONTHS_BETWEEN,REGEXP_REPLACE,REGEXP_COUNT,TREAT,EMPTY_CLOB,INSTRB,trunc(number),greatest,least,mod,round(number),cast,to_date,to_timestamp,chr,rtrim,translate,to_char,to_number,to_timestamp_tz)。 数据类型转换:小数字符串转换成整数类型(int1/int2/int4/int8/int16)时进行四舍五入。 数据类型转换:支持timestamp with time zone到timestamp without time zone的隐式转换。 s2 A平台兼容迭代小版本,影响函数(dump, to_single_byte, to_multi_byte, nls_upper, nls_lower, initcap, ascii2, asciistr, unistr, vsize, cosh, remainder, sinh, tanh, nanvl, current_date, current_timestamp, dbtimezone, numtodsinterval, numtoyminterval, new_time, sessiontimezone, sys_extract_utc, tz_offset, to_binary_double, to_binary_float, to_dsinterval, to_yminterval, lnnvl, ora_hash)。 兼容配置项为s1时的所有行为。
  • plpgsql.variable_conflict 参数说明:设置同名的存储过程变量和表的列的使用优先级。 该参数属于USERSET类型参数,仅支持表1中对应设置方法3进行设置。 取值范围:字符串 error表示遇到存储过程变量和表的列名同名则编译报错。 use_variable表示存储过程变量和表的列名同名则优先使用变量。 use_column表示存储过程变量和表的列名同名则优先使用列名。 默认值:error
  • transform_null_equals 参数说明:控制表达式expr = NULL(或NULL = expr)当做expr IS NULL处理。如果expr得出NULL值则返回真,否则返回假。 正确的SQL标准兼容的expr = NULL总是返回NULL(未知)。 Microsoft Access里的过滤表单生成的查询使用expr = NULL来测试空值。打开这个选项,可以使用该接口来访问数据库。 该参数属于USERSET类型参数,请参考表1中对应设置方法进行设置。 取值范围:布尔型 on表示控制表达式expr = NULL(或NULL = expr)当做expr IS NULL处理。 off表示不控制,即expr = NULL总是返回NULL(未知)。 默认值:off 新用户经常在涉及NULL的表达式上语义混淆,故默认值设为off。
  • 参数说明 GRANT的权限分类如下所示。 SELECT 允许对指定的表、视图、序列执行SELECT语句。 INSERT 允许对指定的表执行INSERT语句。 UPDATE 允许对声明的表中任意字段执行UPDATE语句。SELECT… FOR UPDATE和SELECT… FOR SHARE除了需要SELECT权限外,还需要UPDATE权限。 DELETE 允许执行DELETE语句删除指定表中的数据。 TRUNCATE 允许执行TRUNCATE语句删除指定表中的所有记录。 REFEREN CES 创建一个外键约束,必须拥有参考表和被参考表的REFERENCES权限,分布式场景暂不支持。 TRIGGER 允许在指定的表上创建触发器。 CREATE 对于数据库,允许在数据库里创建新的模式。 对于模式,允许在模式中创建新的对象。如果要重命名一个对象,用户除了必须是该对象的所有者外,还必须拥有该对象所在模式的CREATE权限。 对于表空间,允许在表空间中创建表,允许在创建数据库和模式的时候把该表空间指定为缺省表空间。 对于子集群,允许在子集群中创建表对象。 CONNECT 允许用户连接到指定的数据库。 EXECUTE 允许使用指定的函数,以及利用这些函数实现的操作符。 USAGE 对于过程语言,允许用户在创建函数的时候指定过程语言。 对于模式,USAGE允许访问包含在指定模式中的对象,若没有该权限,则只能看到这些对象的名称。 对于序列,USAGE允许使用nextval函数。 对于子集群, 对包含在指定模式中的对象有访问权限时,USAGE允许访问指定子集群下的表对象。 对于Data Source对象,USAGE是指访问权限,也是可赋予的所有权限,即USAGE与ALL PRIVILEGES等价。 对于密钥对象,USAGE是使用密钥的权限。 COMPUTE 针对计算子集群,允许用户在具有compute权限的计算子集群上进行弹性计算。 ALTER 允许用户修改指定对象的属性,但不包括修改对象的所有者和修改对象所在的模式。 DROP 允许用户删除指定的对象。 COMMENT 允许用户定义或修改指定对象的注释。 INDEX 允许用户在指定表上创建索引,并管理指定表上的索引,还允许用户对指定表执行REINDEX和CLUSTER操作。 VACUUM 允许用户对指定的表执行ANALYZE和VACUUM操作。 ALL PRIVILEGES 一次性给指定用户/角色赋予所有可赋予的权限。只有系统管理员有权执行GRANT ALL PRIVILEGES。 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 已存在的子集群名称。 src_name 已存在的Data Source对象名称。 argmode 参数模式。 取值范围:字符串,要符合标识符命名规范。 arg_name 参数名称。 取值范围:字符串,要符合标识符命名规范。 arg_type 参数类型。 取值范围:字符串,要符合标识符命名规范。 loid 包含本页的大对象的标识符。 取值范围:字符串,要符合标识符命名规范。 tablespace_name 表空间名称。 client_master_key 客户端加密主密钥的名称。 取值范围:字符串,要符合标识符命名规范。 column_encryption_key 列加密密钥的名称。 取值范围:字符串,要符合标识符命名规范。 directory_name 目录名称。 取值范围:字符串,要符合标识符命名规范。 WITH GRANT OPTION 如果声明了WITH GRANT OPTION,则被授权的用户也可以将此权限赋予他人,否则就不能授权给他人。这个选项不能赋予PUBLIC。 非对象所有者给其他用户授予对象权限时,命令按照以下规则执行: 如果用户没有该对象上指定的权限,命令立即失败。 如果用户有该对象上的部分权限,则GRANT命令只授予他有授权选项的权限。 如果用户没有可用的授权选项,GRANT ALL PRIVILEGES形式将发出一个警告信息,其他命令形式将发出在命令中提到的且没有授权选项的相关警告信息。 数据库系统管理员可以访问所有对象,而不会受对象的权限设置影响。除了必要的情况外,建议不要总是以系统管理员身份进行操作。
  • 语法格式 将表或视图的访问权限赋予指定的用户或角色。 123456 GRANT { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER | ALTER | DROP | COMMENT | INDEX | VACUUM } [, ...] | ALL [ PRIVILEGES ] } ON { [ TABLE ] table_name [, ...] | ALL TABLES IN SCHEMA schema_name [, ...] } TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]; 将表中字段的访问权限赋予指定的用户或角色。 12345 GRANT { {{ SELECT | INSERT | UPDATE | REFERENCES | COMMENT } ( column_name [, ...] )} [, ...] | ALL [ PRIVILEGES ] ( column_name [, ...] ) } ON [ TABLE ] table_name [, ...] TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]; 将序列的访问权限赋予指定的用户或角色。 123456 GRANT { { SELECT | UPDATE | USAGE | ALTER | DROP | COMMENT } [, ...] | ALL [ PRIVILEGES ] } ON { [ SEQUENCE ] sequence_name [, ...] | ALL SEQUENCES IN SCHEMA schema_name [, ...] } TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]; 将数据库的访问权限赋予指定的用户或角色。 12345 GRANT { { CREATE | CONNECT | TEMPORARY | TEMP | ALTER | DROP | COMMENT } [, ...] | ALL [ PRIVILEGES ] } ON DATABASE database_name [, ...] TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]; 将域的访问权限赋予指定的用户或角色。 1234 GRANT { USAGE | ALL [ PRIVILEGES ] } ON DOMAIN domain_name [, ...] TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]; 本版本暂时不支持赋予域的访问权限。 将客户端加密主密钥CMK的访问权限赋予指定的用户或角色。 1234 GRANT { { USAGE | DROP } [, ...] | ALL [ PRIVILEGES ] } ON { CLIENT_MASTER_KEY client_master_key TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]; 将列加密密钥CEK的访问权限赋予指定的用户或角色。 1234 GRANT { { USAGE | DROP } [, ...]| ALL [ PRIVILEGES ] } ON { COLUMN_ENCRYPTION_KEY column_encryption_key TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]; 将外部数据源的访问权限赋予给指定的用户或角色。 1234 GRANT { USAGE | ALL [ PRIVILEGES ] } ON FOREIGN DATA WRAPPER fdw_name [, ...] TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]; 将外部服务器的访问权限赋予给指定的用户或角色。 1234 GRANT { { USAGE | ALTER | DROP | COMMENT } [, ...] | ALL [ PRIVILEGES ] } ON FOREIGN SERVER server_name [, ...] TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]; 将函数的访问权限赋予给指定的用户或角色。 12345 GRANT { { EXECUTE | ALTER | DROP | COMMENT } [, ...] | 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 ]; 将存储过程的访问权限赋予给指定的用户或角色。 1234 GRANT { { EXECUTE | ALTER | DROP | COMMENT } [, ...] | ALL [ PRIVILEGES ] } ON { PROCEDURE {proc_name ( [ {[ argmode ] [ arg_name ] arg_type} [, ...] ] )} [, ...] TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]; 将过程语言的访问权限赋予给指定的用户或角色。 1234 GRANT { USAGE | ALL [ PRIVILEGES ] } ON LANGUAGE lang_name [, ...] TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]; 本版本只有C函数支持所有用户创建,而Java和Internal只支持拥有sysadmin权限的用户创建。 拥有sysadmin权限的用户通过grant语法来将创建C函数的权限授权给普通用户时,不支持grant usage on language c to public,只支持授权给特定用户。 拥有sysadmin权限的用户通过grant语法来将创建C函数的权限授权给普通用户时,不支持with grant option。 将子集群的访问权限赋予指定的用户或角色。 1234 GRANT { { CREATE | USAGE | COMPUTE | ALTER | DROP } [, ...] | ALL [ PRIVILEGES ] } ON NODE GROUP group_name [, ...] TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]; 将子集群的create权限赋予指定用户或角色时,会默认把usage和compute权限赋予指定用户或角色。 将模式的访问权限赋予指定的用户或角色。 1234 GRANT { { CREATE | USAGE | ALTER | DROP | COMMENT } [, ...] | ALL [ PRIVILEGES ] } ON SCHEMA schema_name [, ...] TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]; 将模式中的表或者视图对象授权给其他用户时,需要将表或视图所属的模式的USAGE权限同时授予该用户,若没有该权限,则只能看到这些对象的名称,并不能实际进行对象访问。 将大对象的访问权限赋予指定的用户或角色。 1234 GRANT { { SELECT | UPDATE } [, ...] | ALL [ PRIVILEGES ] } ON LARGE OBJECT loid [, ...] TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]; 本版本暂时不支持大对象。 将表空间的访问权限赋予指定的用户或角色。 1234 GRANT { { CREATE | ALTER | DROP | COMMENT } [, ...] | ALL [ PRIVILEGES ] } ON TABLESPACE tablespace_name [, ...] TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]; 将类型的访问权限赋予指定的用户或角色。 1234 GRANT { { USAGE | ALTER | DROP | COMMENT } [, ...] | ALL [ PRIVILEGES ] } ON TYPE type_name [, ...] TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]; 本版本暂时不支持赋予类型的访问权限。 将Data Source对象的权限赋予指定的角色。 1234 GRANT { USAGE | ALL [PRIVILEGES]} ON DATA SOURCE src_name [, ...] TO { [GROUP] role_name | PUBLIC } [, ...] [WITH GRANT OPTION]; 将directory对象的权限赋予指定的角色。 1234 GRANT { { READ | WRITE | ALTER | DROP } [, ...] | ALL [PRIVILEGES] } ON DIRECTORY directory_name [, ...] TO { [GROUP] role_name | PUBLIC } [, ...] [WITH GRANT OPTION]; 将package对象的权限赋予指定的角色。 1234 GRANT { { EXECUTE | ALTER | DROP | COMMENT } [, ...] | ALL [PRIVILEGES] } ON PACKAGE package_name [, ...] TO { [GROUP] role_name | PUBLIC } [, ...] [WITH GRANT OPTION]; 将角色的权限赋予其他用户或角色的语法。 123 GRANT role_name [, ...] TO role_name [, ...] [ WITH ADMIN OPTION ]; 将sysadmin权限赋予指定的角色。 12 GRANT ALL { PRIVILEGES | PRIVILEGE } TO role_name;
  • 功能描述 对角色和用户进行授权操作。 使用GRANT命令进行用户授权包括以下场景: 将系统权限授权给角色或用户 系统权限又称为用户属性,包括SYSADMIN、CREATEDB、CREATEROLE、AUDITADMIN、MONADMIN、OPRADMIN、POLADMIN、INHERIT、REPLICATION、VCADMIN和 LOG IN等。 系统权限一般通过CREATE/ALTER ROLE语法来指定。其中,SYSADMIN权限可以通过GRANT/REVOKE ALL PRIVILEGE授予或撤销。但系统权限无法通过ROLE和USER的权限被继承,也无法授予PUBLIC。 将数据库对象授权给角色或用户 将数据库对象(表和视图、指定字段、数据库、函数、模式、表空间等)的相关权限授予特定角色或用户; GRANT命令将数据库对象的特定权限授予一个或多个角色。这些权限会追加到已有的权限上。 关键字PUBLIC表示该权限要赋予所有角色,包括以后创建的用户。PUBLIC可以看做是一个隐含定义好的组,它总是包括所有角色。任何角色或用户都将拥有通过GRANT直接赋予的权限和所属的权限,再加上PUBLIC的权限。 如果声明了WITH GRANT OPTION,则被授权的用户也可以将此权限赋予他人,否则就不能授权给他人。这个选项不能赋予PUBLIC,这是GaussDB特有的属性。 GaussDB会将某些类型的对象上的权限授予PUBLIC。默认情况下,对表、表字段、序列、外部数据源、外部服务器、模式或表空间对象的权限不会授予PUBLIC,而以下这些对象的权限会授予PUBLIC:数据库的CONNECT权限和CREATE TEMP TABLE权限、函数的EXECUTE特权、语言和数据类型(包括域)的USAGE特权。当然,对象拥有者可以撤销默认授予PUBLIC的权限并专门授予权限给其他用户。为了更安全,建议在同一个事务中创建对象并设置权限,这样其他用户就没有时间窗口使用该对象。这些初始的默认权限可以使用ALTER DEFAULT PRIVILEGES命令修改。 对象的所有者缺省具有该对象上的所有权限,出于安全考虑所有者可以舍弃部分权限,但ALTER、DROP、COMMENT、INDEX、VACUUM以及对象的可再授予权限属于所有者固有的权限,隐式拥有。 将角色或用户的权限授权给其他角色或用户 将一个角色或用户的权限授予一个或多个其他角色或用户。在这种情况下,每个角色或用户都可视为拥有一个或多个数据库权限的集合。 当声明了WITH ADMIN OPTION,被授权的用户可以将该权限再次授予其他角色或用户,以及撤销所有由该角色或用户继承到的权限。当授权的角色或用户发生变更或被撤销时,所有继承该角色或用户权限的用户拥有的权限都会随之发生变更。 数据库系统管理员可以给任何角色或用户授予/撤销任何权限。拥有CREATEROLE权限的角色可以赋予或者撤销任何非系统管理员角色的权限。 将ANY权限授予给角色或用户 将ANY权限授予特定的角色和用户,ANY权限的取值范围参见语法格式。当声明了WITH ADMIN OPTION,被授权的用户可以将该ANY权限再次授予其他角色/用户,或从其他角色/用户处回收该ANY权限。ANY权限可以通过角色被继承,但不能赋予PUBLIC。初始用户和三权分立关闭时的系统管理员用户可以给任何角色/用户授予或撤销ANY权限。 目前支持以下ANY权限:CREATE ANY TABLE、ALTER ANY TABLE、DROP ANY TABLE、SELECT ANY TABLE、INSERT ANY TABLE、UPDATE ANY TABLE、DELETE ANY TABLE、CREATE ANY SEQUENCE、CREATE ANY INDEX、CREATE ANY FUNCTION、EXECUTE ANY FUNCTION、 CREATE ANY PACKAGE、EXECUTE ANY PACKAGE、CREATE ANY TYPE、ALTER ANY TYPE、DROP ANY TYPE、ALTER ANY SEQUENCE、DROP ANY SEQUENCE、SELECT ANY SEQUENCE、ALTER ANY INDEX、DROP ANY INDEX、CREATE ANY SYNONYM、DROP ANY SYNONYM、CREATE ANY TRIGGER、ALTER ANY TRIGGER、DROP ANY TRIGGER。详细的ANY权限范围描述参考表1。
  • 注意事项 不允许将ANY权限授予PUBLIC,也不允许从PUBLIC回收ANY权限。 ANY权限属于数据库内的权限,只对授予该权限的数据库内的对象有效,例如SELECT ANY TABLE只允许用户查看当前数据库内的所有用户表数据,对其他数据库内的用户表无查看权限。 即使用户被授予ANY权限,也不能对私有用户下的对象进行访问操作(INSERT、DELETE、UPDATE、SELECT)。 ANY权限与原有的权限相互无影响。 如果用户被授予CREATE ANY TABLE权限,在同名schema下创建表的属主是该同名模式的属主,用户对表进行其他操作时,需要授予相应的操作权限。与此类似的还有CREATE ANY FUNCTION、CREATE ANY PACKAGE、CREATE ANY TYPE、CREATE ANY SEQUENCE和CREATE ANY INDEX,在同名模式下创建的对象的属主是同名模式的属主;而对于CREATE ANY TRIGGER和CREATE ANY SYNONYM,在同名模式下创建的对象的属主为创建者。 需要谨慎授予用户CREATE ANY FUNCTION或CREATE ANY PACKAGE的权限,以免其他用户利用DEFINER类型的函数或PACKAGE进行权限提升。 通过GRANT授予用于使用表的权限时,如果用户使用不当,可能通过ALTER在表的默认值、约束增加表达式,通过创建索引在INDEX上增加表达式等操作,导致权限被利用的风险。 通过GRANT授予用户使用TRIGGER的权限时,如果用户使用不当,可能通过WHEN条件创建表达式,当触发器被触发时,存在权限被利用的风险。 给用户赋权时,需要特别注意定义者函数/PACKAGE,定义者函数/PACKAGE会使用函数/PACKAGE的owner权限执行,若赋权不当(包括GRANT ROLE TO ROLE),则存在权限被利用风险。
  • 语法格式 设置所处的时区。 1 SET [ SESSION | LOCAL ] TIME ZONE { timezone | LOCAL | DEFAULT }; 设置所属的模式。 123 SET [ SESSION | LOCAL ] {CURRENT_SCHEMA { TO | = } { schema | DEFAULT } | SCHEMA 'schema'}; 设置客户端编码集。 1 SET [ SESSION | LOCAL ] NAMES encoding_name; 设置XML的解析方式。 1 SET [ SESSION | LOCAL ] XML OPTION { DOCUMENT | CONTENT }; 设置其他运行时参数。 123 SET [ LOCAL | SESSION ] { {config_parameter { { TO | = } { value | DEFAULT } | FROM CURRENT }}};
  • 参数说明 SESSION 声明的参数只对当前会话起作用。如果SESSION和LOCAL都没出现,则SESSION为缺省值。 如果在事务中执行了此命令,命令的产生影响将在事务回滚之后消失。如果该事务已提交,影响将持续到会话的结束,除非被另外一个SET命令重置参数。 LOCAL 声明的参数只在当前事务中有效。在COMMIT或ROLLBACK之后,会话级别的设置将再次生效。 不论事务是否提交,此命令的影响只持续到当前事务结束。一个特例是:在一个事务里面,即有SET命令,又有SET LOCAL命令,且SET LOCAL在SET后面,则在事务结束之前,SET LOCAL命令会起作用,但事务提交之后,则是SET命令会生效。 TIME ZONE timezone 用于指定当前会话的本地时区。 取值范围:有效的本地时区。该选项对应的运行时参数名称为TimeZone,DEFAULT缺省值为PRC。 CURRENT_SCHEMA schema CURRENT_SCHEMA用于指定当前的模式。 取值范围:已存在模式名称。 SCHEMA schema 同CURRENT_SCHEMA。此处的schema是个字符串。 例如:set schema 'public'; NAMES encoding_name 用于设置客户端的字符编码。等价于set client_encoding to encoding_name。 取值范围:有效的字符编码。该选项对应的运行时参数名称为client_encoding,默认编码为UTF8。 XML OPTION option 用于设置XML的解析方式。 取值范围:CONTENT(缺省)、DOCUMENT config_parameter 可设置的运行时参数的名称。可用的运行时参数可以使用SHOW ALL命令查看。 部分通过SHOW ALL查看的参数不能通过SET设置。如max_datanodes。 value config_parameter的新值。可以声明为字符串常量、标识符、数字,或者逗号分隔的列表。DEFAULT用于把这些参数设置为它们的缺省值。
  • 功能描述 SET CONSTRAINTS设置当前事务检查行为的约束条件。 IMMEDIATE约束是在每条语句后面进行检查。DEFERRED约束一直到事务提交时才检查。每个约束都有自己的模式。 从创建约束条件开始,一个约束总是设定为DEFERRABLE INITIALLY DEFERRED,DEFERRABLE INITIALLY IMMEDIATE,NOT DEFERRABLE三个特性之一。第三种总是IMMEDIATE,并且不会受SET CONSTRAINTS影响。前两种以指定的方式启动每个事务,但是其行为可以在事务里用SET CONSTRAINTS改变。 带着一个约束名列表的SET CONSTRAINTS改变这些约束的模式(都必须是可推迟的)。如果有多个约束匹配某个名称,则所有都会被影响。SET CONSTRAINTS ALL改变所有可推迟约束的模式。 当SET CONSTRAINTS把一个约束从DEFERRED改成IMMEDIATE的时候,新模式反作用式地起作用:任何将在事务结束准备进行的数据修改都将在SET CONSTRAINTS的时候执行检查。如果违反了任何约束,SET CONSTRAINTS都会失败(并且不会修改约束模式)。因此,SET CONSTRAINTS可以用于强制在事务中某一点进行约束检查。 检查和唯一约束总是不可推迟的。
  • 示例 1 2 3 4 5 6 7 8 91011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556 --创建一个新表。gaussdb=# CREATE TABLE table1(a int);--开启事务。gaussdb=# START TRANSACTION;--插入数据。gaussdb=# INSERT INTO table1 VALUES (1);--建立保存点。gaussdb=# SAVEPOINT my_savepoint;--插入数据。gaussdb=# INSERT INTO table1 VALUES (2);--回滚保存点。gaussdb=# ROLLBACK TO SAVEPOINT my_savepoint;--插入数据。gaussdb=# INSERT INTO table1 VALUES (3);--提交事务。gaussdb=# COMMIT;--查询表的内容,会同时看到1和3,不能看到2,因为2被回滚。gaussdb=# SELECT * FROM table1;--删除表。gaussdb=# DROP TABLE table1;--创建一个新表。gaussdb=# CREATE TABLE table2(a int);--开启事务。gaussdb=# START TRANSACTION;--插入数据。gaussdb=# INSERT INTO table2 VALUES (3);--建立保存点。gaussdb=# SAVEPOINT my_savepoint;--插入数据。gaussdb=# INSERT INTO table2 VALUES (4);--回滚保存点。gaussdb=# RELEASE SAVEPOINT my_savepoint;--提交事务。gaussdb=# COMMIT;--查询表的内容,会同时看到3和4。gaussdb=# SELECT * FROM table2;--删除表。gaussdb=# DROP TABLE table2;
  • 注意事项 使用ROLLBACK TO SAVEPOINT回滚到一个保存点。使用RELEASE SAVEPOINT删除一个保存点,但是保留该保存点建立后执行的命令的效果。 保存点只能在一个事务块里面建立。在一个事务里面可以定义多个保存点。 由于节点故障或者通信故障引起的分布式节点线程或进程退出导致的报错,以及由于COPY FROM操作中源数据与目标表的表结构不一致导致的报错,均不能正常回滚到保存点之前,而是整个事务回滚。 SQL标准要求,使用savepoint建立一个同名保存点时,需要自动删除前面那个同名保存点。在 GaussDB数据库 里,我们将保留旧的保存点,但是在回滚或者释放的时候,只使用最近的那个。释放了新的保存点将导致旧的再次成为ROLLBACK TO SAVEPOINT和RELEASE SAVEPOINT可以访问的保存点。除此之外,SAVEPOINT是完全符合SQL标准的。
  • 示例 1 2 3 4 5 6 7 8 9101112131415161718 --撤销 my_savepoint 建立之后执行的命令的影响。gaussdb=# START TRANSACTION;gaussdb=# SAVEPOINT my_savepoint;gaussdb=# ROLLBACK TO SAVEPOINT my_savepoint;--游标位置不受保存点回滚的影响。gaussdb=# DECLARE foo CURSOR FOR SELECT 1 UNION SELECT 2;gaussdb=# SAVEPOINT foo;gaussdb=# FETCH 1 FROM foo; ?column? ---------- 1gaussdb=# ROLLBACK TO SAVEPOINT foo;gaussdb=# FETCH 1 FROM foo; ?column? ---------- 2gaussdb=# RELEASE SAVEPOINT my_savepoint;gaussdb=# COMMIT;
  • 注意事项 不能回滚到一个未定义的保存点,语法上会报错。 在保存点方面,游标有一些非事务性的行为。任何在保存点里打开的游标都会在回滚掉这个保存点之后关闭。如果一个前面打开了的游标在保存点里面,并且游标被一个FETCH命令影响,而这个保存点稍后回滚了,那么这个游标的位置仍然在FETCH让它指向的位置(也就是FETCH不会被回滚)。关闭一个游标的行为也不会被回滚给撤消掉。如果一个游标的操作导致事务回滚,那么这个游标就会置于不可执行状态,所以,尽管一个事务可以用ROLLBACK TO SAVEPOINT重新恢复,但是游标不能再使用了。 使用ROLLBACK TO SAVEPOINT回滚到一个保存点。使用RELEASE SAVEPOINT删除一个保存点,但是保留该保存点建立后执行的命令的效果。
  • 参数说明 INDEX 重新建立指定的索引。 INTERNAL TABLE 重建列存表的Desc表的索引,如果表有从属的"TOAST"表,则这个表也会重建索引。 TABLE 重新建立指定表的所有索引,如果表有从属的"TOAST"表,则这个表也会重建索引。如果表上有索引已经被alter unusable失效,则这个索引无法被重新创建。当指定CONCURRENTLY选项时,暂不支持重建从属"TOAST"表上的索引。 DATABASE 重建当前数据库里的所有索引。当指定CONCURRENTLY选项时,暂不支持重建数据库中表的从属"TOAST"表上的索引。 SYSTEM 在当前数据库上重建所有系统表上的索引。不会处理在用户表上的索引。 CONCURRENTLY 以不阻塞DML的方式重建索引(加ShareUpdateExclusiveLock锁)。重建索引时,一般会阻塞其他语句对该索引所依赖表的访问。指定此关键字,可以实现重建过程中不阻塞DML。不支持在线重建系统表上的索引。不支持REINDEX INTERNAL TABLE CONCURRENTLY和REINDEX SYSTEM CONCURRENTLY。当执行REINDEX DATABASE CONCURRENTLY时,在线重建当前数据库中用户表上的所有索引(不会处理系统表上的索引)。REINDEX CONCURRENTLY不可以在事务内执行。在线重建索引只支持B-tree索引和UB-tree索引,只支持普通索引、GLOBAL索引、LOCAL索引。在线并行重建索引只支持Astore的普通索引、GLOBAL索引、LOCAL索引。如果在线重建索引失败,可能会留下非法的新索引,在系统无法自动清理失败新索引的情况下(比如数据库宕机),需要尽快手动清除(使用DROP INDEX语句)非法新索引,以防占用更多资源。一般来说,非法的新索引的后缀名为_ccnew。REINDEX INDEX CONCURRENTLY对表加4级会话锁,且其前几个阶段与CREATE INDEX CONCURRENTLY相似,因此也可能产生卡住或死锁的问题,具体场景与CREATE INDEX CONCURRENTLY相似(比如两个会话同时对同一个索引或表进行REINDEX CONCURRENTLY操作,会引发死锁问题),详见CONCURRENTLY章节。 name 需要重建索引的索引、表、数据库的名称。表和索引可以有模式修饰。 REINDEX DATABASE和SYSTEM只能重建当前数据库的索引,所以name必须和当前数据库名称相同。 FORCE 废弃选项,仅为保持前向兼容,故继续保留。 partition_name 需要重建索引的分区的名称或者索引分区的名称。 取值范围: 如果前面是REINDEX INDEX,则这里应该指定索引分区的名称; 如果前面是REINDEX TABLE,则这里应该指定分区的名称; 如果前面是REINDEX INTERNAL TABLE,则这里应该指定列存分区表的分区的名称。 REINDEX DATABASE和SYSTEM这种形式的重建索引不能在事务块中执行。
  • 语法格式 1 2 3 4 5 6 7 8 9101112131415 MERGE [/*+ plan_hint */] INTO table_name [ [ AS ] alias ]USING { { table_name | view_name } | subquery } [ [ AS ] alias ]ON ( condition )[ WHEN MATCHED THEN UPDATE SET { column_name = { expression | subquery | DEFAULT } | ( column_name [, ...] ) = ( { expression | subquery | DEFAULT } [, ...] ) } [, ...] [ WHERE condition ]][ WHEN NOT MATCHED THEN INSERT { DEFAULT VALUES | [ ( column_name [, ...] ) ] VALUES ( { expression | subquery | DEFAULT } [, ...] ) [, ...] [ WHERE condition ] }];NOTICE: 'subquery' in the UPDATE and INSERT clauses are only avaliable in CENTRALIZED mode!
  • 示例 1 2 3 4 5 6 7 8 9101112131415161718192021222324252627282930313233343536373839404142434445464748495051 -- 创建目标表products和源表newproducts,并插入数据gaussdb=# CREATE TABLE products(product_id INTEGER,product_name VARCHAR2(60),category VARCHAR2(60));gaussdb=# INSERT INTO products VALUES (1501, 'vivitar 35mm', 'electrncs');gaussdb=# INSERT INTO products VALUES (1502, 'olympus is50', 'electrncs');gaussdb=# INSERT INTO products VALUES (1600, 'play gym', 'toys');gaussdb=# INSERT INTO products VALUES (1601, 'lamaze', 'toys');gaussdb=# INSERT INTO products VALUES (1666, 'harry potter', 'dvd');gaussdb=# CREATE TABLE newproducts(product_id INTEGER,product_name VARCHAR2(60),category VARCHAR2(60));gaussdb=# INSERT INTO newproducts VALUES (1502, 'olympus camera', 'electrncs');gaussdb=# INSERT INTO newproducts VALUES (1601, 'lamaze', 'toys');gaussdb=# INSERT INTO newproducts VALUES (1666, 'harry potter', 'toys');gaussdb=# INSERT INTO newproducts VALUES (1700, 'wait interface', 'books');-- 进行MERGE INTO操作gaussdb=# MERGE INTO products p USING newproducts np ON (p.product_id = np.product_id) WHEN MATCHED THEN UPDATE SET p.product_name = np.product_name, p.category = np.category WHERE p.product_name != 'play gym' WHEN NOT MATCHED THEN INSERT VALUES (np.product_id, np.product_name, np.category) WHERE np.category = 'books';MERGE 4-- 查询更新后的结果gaussdb=# SELECT * FROM products ORDER BY product_id; product_id | product_name | category ------------+----------------+----------- 1501 | vivitar 35mm | electrncs 1502 | olympus camera | electrncs 1600 | play gym | toys 1601 | lamaze | toys 1666 | harry potter | toys 1700 | wait interface | books(6 rows)-- 删除表gaussdb=# DROP TABLE products;gaussdb=# DROP TABLE newproducts;
  • 参数说明 plan_hint子句 以/*+ */的形式在MERGE关键字后,用于对MERGE对应的语句块生成的计划进行hint调优,详细用法请参见章节使用Plan Hint进行调优。每条语句中只有第一个/*+ plan_hint */注释块会作为hint生效,里面可以写多条hint。 INTO子句 指定正在更新或插入的目标表。目标表为复制表时,暂不支持目标表中某列默认值为volatile函数(如自增列),enable_stream_operator=off时目标表需要包含主键或带有unique not null。 talbe_name 目标表的表名。 alias 目标表的别名。 取值范围:字符串,符合标识符命名规范。 USING子句 指定源表,源表可以为表、视图或子查询。目标表为复制表时,暂不支持USING子句中包含非复制表。 ON子句 关联条件,用于指定目标表和源表的关联条件。不支持更新关联条件中的字段。 WHEN MATCHED子句 当源表和目标表中数据针对关联条件可以匹配上时,选择WHEN MATCHED子句进行UPDATE操作。 不支持更新分布列。不支持更新系统表、系统列。 WHEN NOT MATCHED子句 当源表和目标表中数据针对关联条件无法匹配时,选择WHEN NOT MATCHED子句进行INSERT操作。 不支持INSERT子句中包含多个VALUES。 WHEN MATCHED和WHEN NOT MATCHED子句顺序可以交换,可以缺省其中一个,但不能同时缺省,不支持同时指定两个WHEN MATCHED或WHEN NOT MATCHED子句。 DEFAULT 用对应字段的缺省值填充该字段。 如果没有缺省值,则为NULL。 WHERE condition UPDATE子句和INSERT子句的条件,只有在条件满足时才进行更新操作,可缺省。不支持WHERE条件中引用系统列。不建议使用int等数值类型作为condition,因为int等数值类型可以隐式转换为bool值(非0值隐式转换为true,0转换为false),可能导致非预期的结果。
  • 示例 1 2 3 4 5 6 7 8 91011121314151617181920212223242526 --创建一个新表。gaussdb=# CREATE TABLE tpcds.table1(a int);--开启事务。gaussdb=# START TRANSACTION;--插入数据。gaussdb=# INSERT INTO tpcds.table1 VALUES (3);--建立保存点。gaussdb=# SAVEPOINT my_savepoint;--插入数据。gaussdb=# INSERT INTO tpcds.table1 VALUES (4);--删除保存点。gaussdb=# RELEASE SAVEPOINT my_savepoint;--提交事务。gaussdb=# COMMIT;--查询表的内容,会同时看到3和4。gaussdb=# SELECT * FROM tpcds.table1;--删除表。gaussdb=# DROP TABLE tpcds.table1;
  • 参数说明 configuration_parameter 运行时参数的名称。 取值范围:可以使用SHOW ALL命令查看运行时参数。 部分通过SHOW ALL查看的参数不能通过SET设置。如max_datanodes。 CURRENT_SCHEMA 当前模式 TIME ZONE 时区。 TRANSACTION ISOLATION LEVEL 事务的隔离级别。 SESSION AUTHORIZATION 当前会话的用户标识符。 ALL 所有运行时参数。
  • 功能描述 RELEASE SAVEPOINT删除一个当前事务先前定义的保存点。 把一个保存点删除就令其无法作为回滚点使用,除此之外它没有其它用户可见的行为。它并不能撤销在保存点建立起来之后执行的命令的影响。要撤销那些命令可以使用ROLLBACK TO SAVEPOINT 。在不再需要的时候删除一个保存点可以令系统在事务结束之前提前回收一些资源。 RELEASE SAVEPOINT也删除所有在指定的保存点建立之后的所有保存点。
  • 示例 --创建一个普通表gaussdb=# CREATE TABLE my_table (c1 int, c2 int);--创建全量物化视图gaussdb=# CREATE MATERIALIZED VIEW my_mv AS SELECT * FROM my_table;--创建增量物化视图gaussdb=# CREATE INCREMENTAL MATERIALIZED VIEW my_imv AS SELECT * FROM my_table;--基表写入数据gaussdb=# INSERT INTO my_table VALUES(1,1),(2,2);--对全量物化视图my_mv进行全量刷新gaussdb=# REFRESH MATERIALIZED VIEW my_mv;--对增量物化视图my_imv进行全量刷新gaussdb=# REFRESH MATERIALIZED VIEW my_imv;
  • 语法格式 LOCK [ TABLE ] {[ ONLY ] name [, ...]| {name [ * ]} [, ...]} [ IN {ACCESS SHARE | ROW SHARE | ROW EXCLUSIVE | SHARE UPDATE EXCLUSIVE | SHARE | SHARE ROW EXCLUSIVE | EXCLUSIVE | ACCESS EXCLUSIVE} MODE ] [ NOWAIT ][CANCELABLE];
  • 功能描述 LOCK TABLE获取表级锁。 GaussDB在为一个引用了表的命令自动请求锁时,尽可能选择最小限制的锁模式。如果用户需要一种更为严格的锁模式,可以使用LOCK命令。例如,一个应用是在Read Committed隔离级别上运行事务,并且它需要保证表中的数据在事务的运行过程中不被修改。为实现这个目的,则可以在查询之前对表使用SHARE锁模式进行锁定。这样将防止数据不被并发修改,从而保证后续的查询可以读到已提交的持久化的数据。因为SHARE锁模式与任何写操作需要的ROW EXCLUSIVE模式冲突,并且LOCK TABLE name IN SHARE MODE语句将等到所有当前持有ROW EXCLUSIVE模式锁的事务提交或回滚后才能执行。因此,一旦获得该锁,就不会存在未提交的写操作,并且其他操作也只能等到该锁释放之后才能开始。 允许扩容重分布工具等锁时内核自动CANCEL业务。
  • 参数说明 表1 冲突的锁模式 请求的锁模式/当前锁模式 ACCESS SHARE ROW SHARE ROW EXCLUSIVE SHARE UPDATE EXCLUSIVE SHARE SHARE ROW EXCLUSIVE EXCLUSIVE ACCESS EXCLUSIVE ACCESS SHARE - - - - - - - X ROW SHARE - - - - - - X X ROW EXCLUSIVE - - - - X X X X SHARE UPDATE EXCLUSIVE - - - X X X X X SHARE - - X X - X X X SHARE ROW EXCLUSIVE - - X X X X X X EXCLUSIVE - X X X X X X X ACCESS EXCLUSIVE X X X X X X X X LOCK的参数说明如下所示: name 要锁定的表的名称,可以有模式修饰。 LOCK TABLE命令中声明的表的顺序就是上锁的顺序。 取值范围:已存在的表名。 ONLY 如果指定ONLY,只有该表被锁定。如果没有声明,该表和他的所有子表将都被锁定。 ACCESS SHARE ACCESS锁只允许对表进行读取,而禁止对表进行修改。所有对表进行读取而不修改的SQL语句都会自动请求这种锁。例如,SELECT命令会自动在被引用的表上请求一个这种锁。 ROW SHARE ROW SHARE锁允许对表进行并发读取,禁止对表进行其他操作。 SELECT FOR UPDATE和SELECT FOR SHARE命令会自动在目标表上请求ROW SHARE锁(且所有被引用但不是FOR SHARE/FOR UPDATE的其他表上,还会自动加上ACCESS SHARE锁)。 对于分区表,SELECT FOR SHARE操作还会在DN上获取partition对象的ROW EXCLUSIVE锁进行并发控制。 ROW EXCLUSIVE 与ROW SHARE锁相同,ROW EXCLUSIVE允许并发读取表,但是禁止修改表中数据。UPDATE,DELETE,INSERT命令会自动在目标表上请求这个锁(且所有被引用的其他表上还会自动加上的ACCESS SHARE锁)。通常情况下,所有会修改表数据的命令都会请求表的ROW EXCLUSIVE锁。 SHARE UPDATE EXCLUSIVE 这个模式保护一个表的模式不被并发修改,以及禁止在目标表上执行垃圾回收命令(VACUUM)。 VACUUM(不带FULL选项)、ANALYZE、CREATE INDEX CONCURRENTLY命令会自动请求这样的锁。 SHARE SHARE锁允许并发的查询,但是禁止对表进行修改。 CREATE INDEX(不带CONCURRENTLY)语句会自动请求这种锁。 SHARE ROW EXCLUSIVE SHARE ROW EXCLUSIVE锁禁止对表进行任何的并发修改,而且是独占锁,因此一个会话中只能获取一次。 任何SQL语句都不会自动请求这个锁模式。 EXCLUSIVE EXCLUSIVE锁允许对目标表进行并发查询,但是禁止任何其他操作。 这个模式只允许并发加ACCESS SHARE锁,也就是说,只有对表的读动作可以和持有这个锁模式的事务并发执行。 任何SQL语句都不会在用户表上自动请求这个锁模式。然而在某些操作的时候,会在某些系统表上请求它。 ACCESS EXCLUSIVE 这个模式保证其所有者(事务)是可以访问该表的唯一事务。 ALTER TABLE,DROP TABLE,TRUNCATE,REINDEX,CLUSTER,VACUUM FULL命令会自动请求这种锁。 在LOCK TABLE命令没有明确声明需要的锁模式时,它是缺省锁模式。 NOWAIT 声明LOCK TABLE不去等待任何冲突的锁释放,如果无法立即获取该锁,该命令退出并且发出一个错误信息。 在不指定NOWAIT的情况下获取表级锁时,如果有其他互斥锁存在的话,则等待其他锁的释放。 CANCELABLE 通过指定该参数允许等锁线程给持锁线程和等锁线程发送CANCEL信号。 只允许重分布工具使用,其它用户使用将报错。
共100000条