金仓数据库 KingbaseES SQL 语言参考手册 (12. SQL语句:ALTER LANGUAGE 到 ALTER SUBSCRIPTION)

12. SQL语句:ALTER LANGUAGE 到 ALTER SUBSCRIPTION

本章包含以下SQL语句:

12.1. ALTER LANGUAGE

用途

ALTER LANGUAGE更改一种过程语言的定义。唯一的功能是重命名该语言或者为它赋予一个新的拥有者。

前置条件

要使用 ALTER LANGUAGE,你必须是超级用户或者该 语言的拥有者。

语法

ALTER [ PROCEDURAL ] LANGUAGE name RENAME TO new_name
ALTER [ PROCEDURAL ] LANGUAGE name OWNER TO { new_owner | CURRENT_USER | SESSION_USER }

语义

name

语言的名称

new_name

该语言的新名称

new_owner

该语言的新拥有者

示例

重命名

ALTER  LANGUAGE name RENAME TO new_name;

兼容性

在 SQL 标准中没有ALTER LANGUAGE语句。

12.2. ALTER LARGE OBJECT

用途

ALTER LARGE OBJECT更改一个大对象的定义。 唯一的功能是为它赋予一个新的拥有者。

前置条件

要使用``ALTER LARGE OBJECT``,你必须是超级用户或者 该大对象的拥有者。

语法

ALTER LARGE OBJECT large_object_oid OWNER TO { new_owner | CURRENT_USER | SESSION_USER }

语义

large_object_oid

要被修改的大对象的 OID

new_owner

该大对象的新拥有者

示例

变更拥有者

ALTER  LARGE OBJECT 16399 OWNER TO new_owner;

12.3. ALTER MATERIALIZED VIEW

用途

ALTER MATERIALIZED VIEW — 更改一个物化视图的定义

前置条件

ALTER MATERIALIZED VIEW更改一个现有物化视图的 多个辅助属性。

要使用ALTER MATERIALIZED VIEW,你必须拥有该物化视图。要 更改一个物化视图的模式,你还必须拥有新模式上的CREATE特权。要更 物化视图所在模式上的CREATE特权(这些限制强制修改拥有者不 能做一些通过删除和重建该物化视图做不到的事情。不过,超级用户怎么都能更改 任何视图的所有权。)。

DEPENDS ON EXTENSION形式把该物化视图标记为依赖于一个 扩展,这样该扩展被删除时会自动地删除掉这个物化视图。

可用于ALTER MATERIALIZED VIEW的语句形式和动作是 ALTER TABLE的一个子集,并且在用于物化视图时具有相 同的含义。

语法

ALTER MATERIALIZED VIEW [ IF EXISTS ] name
    action [, ... ]
ALTER MATERIALIZED VIEW name
    DEPENDS ON EXTENSION extension_name
ALTER MATERIALIZED VIEW [ IF EXISTS ] name
    RENAME [ COLUMN ] column_name TO new_column_name
ALTER MATERIALIZED VIEW [ IF EXISTS ] name
    RENAME TO new_name
ALTER MATERIALIZED VIEW [ IF EXISTS ] name
    SET SCHEMA new_schema
ALTER MATERIALIZED VIEW ALL IN TABLESPACE name [ OWNED BY role_name [, ... ] ]
    SET TABLESPACE new_tablespace [ NOWAIT ]

其中 action是下列之一:

    ALTER [ COLUMN ] column_name SET STATISTICS integer
    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 }
    CLUSTER ON index_name
    SET WITHOUT CLUSTER
    SET ( storage_parameter = value [, ... ] )
    RESET ( storage_parameter [, ... ] )
    OWNER TO { new_owner | CURRENT_USER | SESSION_USER }

语义

该部分描述组成语法的关键字、参数、子句的用途。以及可能适用于他们的限制条件和其他用法说明。

示例

name

一个现有物化视图的名称(可以是模式限定的)。

column_name

一个新的或者现有的列的名称。

extension_name

该物化视图所依赖的扩展的名称。

new_column_name

一个现有列的新名称。

new_owner

该物化视图的新拥有者的用户名。

new_name

该物化视图的新名称。

new_schema

该物化视图的新模式。

12.4. ALTER OPERATOR

用途

ALTER OPERATOR — 更改一个操作符的定义

前置条件

要使用ALTER OPERATOR,你必须是该操作符的所有者。要更改操作符的所有者, 你还必须是新所有者角色的一个直接或者间接成员,并且该角色必须具有该操作符所在 模式上的CREATE特权(这些限制强制修改拥有者不能做一些通过 删除和重建操作符做不到的事情。不过,超级用户怎么都能更改任何操作符的所 有权。)。

语法

ALTER OPERATOR name ( { left_type | NONE } , { right_type | NONE } )
    OWNER TO { new_owner | CURRENT_USER | SESSION_USER }

ALTER OPERATOR name ( { left_type | NONE } , { right_type | NONE } )
    SET SCHEMA new_schema

ALTER OPERATOR name ( { left_type | NONE } , { right_type | NONE } )
    SET ( {  RESTRICT = { res_proc | NONE }
           | JOIN = { join_proc | NONE }
         } [, ... ] )

语义

name

一个现有操作符的名称(可以是模式限定的)。

left_type

该操作符左操作数的数据类型,如果该操作符没有左操作数可以写成 NONE

right_type

该操作符右操作数的数据类型,如果该操作符没有右操作数可以写成 NONE

new_owner

该操作符的新拥有者。

new_schema

该操作符的新模式。

res_proc

这个操作符的约束选择度估算器函数,写成 NONE可以移除现有的选择度估算器。

join_proc

这个操作符的连接选择度估算器函数,写成 NONE 可以移除现有的选择度估算器。

示例

更改类型text的一个自定义操作符a @@ b 的拥有者:

ALTER OPERATOR @@ (text, text) OWNER TO joe;

更改类型int[]的自定义操作符a && b的约束和连接选择度估算器函数:

ALTER OPERATOR && (_int4, _int4) SET (RESTRICT = _int_contsel, JOIN = _int_contjoinsel);

12.5. ALTER OPERATOR CLASS

用途

ALTER OPERATOR CLASS更改一个操作符类的定义。

前置条件

要使用ALTER OPERATOR CLASS,你必须拥有该操作符类。要修改操作符类的拥有者,你还必须是新拥有者角色的一个直接或间接成员,并且该角色必须具有该操作符类所在模式上的CREATE特权(这些限制强制修改拥有者不能做一些通过删除和重建操作符类做不到的事情。不过,超级用户怎么都能更改任何操作符类的所有权。)。

语法

ALTER OPERATOR CLASS name USING index_method
    RENAME TO new_name

ALTER OPERATOR CLASS name USING index_method
    OWNER TO { new_owner | CURRENT_USER | SESSION_USER }

ALTER OPERATOR CLASS name USING index_method
    SET SCHEMA new_schema

语义

name

一个现有操作符类的名称(可以是模式限定的)。

index_method

这个操作符类所服务的索引方法的名称。

new_name

该操作符类的新名称。

new_owner

该操作符类的新拥有者。

new_schema

该操作符类的新模式。

示例

修改操作符类名称

ALTER OPERATOR CLASS org_name RENAME TO new_name;

兼容性

在 SQL 标准中没有ALTER OPERATOR CLASS语句。

其他

CREATE OPERATOR CLASS , DROP OPERATOR CLASS , ALTER OPERATOR FAMILY

12.6. ALTER OPERATOR FAMILY

用途

ALTER OPERATOR FAMILY更改一个操作符族的定义。你能增加操作符以及支持函数到该家族、从该族中移除它们或者更改该族的名称或者拥有者。

在用ALTER OPERATOR FAMILY增加操作符和支持函数到一个族中时,它们不是族内任何特定操作符类的组成部分,而只是“松散”地存在于该族中。这表示这些操作符和函数与该族的语义兼容,但是没有被任何特定索引的正确功能所要求(所要求的操作符和函数应该被作为一个操作符类的一部分声明,见 CREATE OPERATOR CLASS 。KingbaseES将允许一个族的松散成员在任何时候被从该族中删除,但是在删除一个操作符类的成员之前,必须已经删除整个类以及依赖于该成员的索引。具有代表性的是,单一数据类型操作符和函数是操作符类的一部分,因为在特定数据类型上的索引需要它们的支持。而多数据类型操作符和函数则被作为该族的松散成员。

ALTER OPERATOR FAMILY目前不检测操作符族定义是否包括该索引方法所要求的所有操作符和函数,也不检查操作符和函数是否形成了一个有理的集合。定义一个合法的操作符族是用户的责任。

前置条件

要使用ALTER OPERATOR FAMILY,你必须是超级用户(这样的限制是因为一个错误的操作符族定义可能会迷惑服务器甚至让它崩溃)。

语法

ALTER OPERATOR FAMILY name USING index_method ADD
  {  OPERATOR strategy_number operator_name ( op_type, op_type )
              [ FOR SEARCH | FOR ORDER BY sort_family_name ]
   | FUNCTION support_number [ ( op_type [ , op_type ] ) ]
              function_name [ ( argument_type [, ...] ) ]
  } [, ... ]

ALTER OPERATOR FAMILY name USING index_method DROP
  {  OPERATOR strategy_number ( op_type [ , op_type ] )
   | FUNCTION support_number ( op_type [ , op_type ] )
  } [, ... ]

ALTER OPERATOR FAMILY name USING index_method
    RENAME TO new_name

ALTER OPERATOR FAMILY name USING index_method
    OWNER TO { new_owner | CURRENT_USER | SESSION_USER }

ALTER OPERATOR FAMILY name USING index_method
    SET SCHEMA new_schema

语义

name

一个现有操作符族的名称(可以是模式限定的)。

index_method

这个操作符族所应用的索引方法的名称。

strategy_number

与该操作符族相关的一个操作符的索引方法策略号。

operator_name

与该操作符族相关的一个操作符的名称(可以是模式限定的)。

op_type

在一个OPERATOR子句中指定该操作符的操作数数据类型, 或者用NONE来表示一个左一元或者右一元操作符。不同于 CREATE OPERATOR CLASS中类似的语法,操作数数据 类型总是必须被指定。

在一个ADD FUNCTION子句中指定该函数意图支持的操作数数据类型(如果不同于该函数的输入数据类型)。对于 B-树比较函数和哈希函数,有必要指定 op_type ,因为该函数的输入数据类型总是正确的。对于 B-树排序支持函数和 GiST、SP-GiST 和 GIN 操作符类中的所有函数,有必要指定该函数要使用的操作数数据类型。

在一个DROP FUNCTION子句中,必须指定该函数要支持的参数的数据类型。

sort_family_name

一个现有btree操作符族的名称(可能是模式限定的),它描述与一个排序操作符相关的排序顺序。

如果既没有指定FOR SEARCH也没有指定FOR ORDER BY,默认值是FOR SEARCH

support_number

一个与该操作符族相关的函数的索引方法支持过程编号。

function_name

作为该操作符族的一种索引方法支持函数的函数名称(可以是模式限定的)。如果没有指定参数列表,则该名称必须在其模式中唯一。

argument_type

该函数的参数数据类型。

new_name

该操作符族的新名称。

new_owner

该操作符族的新拥有者。

new_schema

该操作符族的新模式。

OPERATORFUNCTION子句可以以任何顺序出现。

示例

下列示例命令为一个操作符族增加跨数据类型的操作符和支持函数,该操作符族已经包含用于数据类型int4以及int2的 B-树操作符类。

ALTER OPERATOR FAMILY integer_ops USING btree ADD

  -- int4 vs int2
  OPERATOR 1 < (int4, int2) ,
  OPERATOR 2 <= (int4, int2) ,
  OPERATOR 3 = (int4, int2) ,
  OPERATOR 4 >= (int4, int2) ,
  OPERATOR 5 > (int4, int2) ,
  FUNCTION 1 btint42cmp(int4, int2) ,

  -- int2 vs int4
  OPERATOR 1 < (int2, int4) ,
  OPERATOR 2 <= (int2, int4) ,
  OPERATOR 3 = (int2, int4) ,
  OPERATOR 4 >= (int2, int4) ,
  OPERATOR 5 > (int2, int4) ,
  FUNCTION 1 btint24cmp(int2, int4) ;

再次移除这些项:

ALTER OPERATOR FAMILY integer_ops USING btree DROP

  -- int4 vs int2
  OPERATOR 1 (int4, int2) ,
  OPERATOR 2 (int4, int2) ,
  OPERATOR 3 (int4, int2) ,
  OPERATOR 4 (int4, int2) ,
  OPERATOR 5 (int4, int2) ,
  FUNCTION 1 (int4, int2) ,

  -- int2 vs int4
  OPERATOR 1 (int2, int4) ,
  OPERATOR 2 (int2, int4) ,
  OPERATOR 3 (int2, int4) ,
  OPERATOR 4 (int2, int4) ,
  OPERATOR 5 (int2, int4) ,
  FUNCTION 1 (int2, int4) ;

兼容性

在 SQL 标准中没有 ALTER OPERATOR FAMILY语句。

其他

对于DROP FUNCTION,要指定的类型是该函数意图支持的输入数据类型。对于 GiST、SP-GiST 以及 GIN索引,可能无需对该函数的 实际输入参数类型做任何事情。

因为索引机制在使用函数之前不会检查其上的访问权限,包括一个操作符族中的函数或操作符都等同于授予了其上的公共执行权限。这对于操作符族中很有用的这类函数来说,这通常不成问题。

操作符应该由 SQL 函数定义。一个 SQL 函数很可能被内联到调用查询中,这将阻止优化器识别出该查询匹配一个索引。

12.7. ALTER PACKAGE

用途

ALTER PACKAGE  --  修改一个包的定义,修改包的属性,包括:名称、属主和模式。需要注意,包属性的修改是没有包规范和包体之分的,包体总是和包规范具有相同属性。包被修改后,该包的对象(变量、常量、游标、函数和存储过程)的相关属性也会被修改。

前置条件

执行ALTER PACKAGE的用户必须是包的属主或非受限数据库管理员,并且要具有包所在模式的USAGE权限。

执行OWNER TO时,如果执行ALTER PACKAGE命令的用户是包的属主但不是非受限数据库管理员,那么新的用户要具有该模式的CREATE权限。

执行RENAME TO时,要求用户具有包所在模式下的CREATE权限。

执行SET SCHEMA时,要求用户在新模式下拥有CREATE权限。

语法

ALTER PACKAGE name OWNER TO { new_owner | CURRENT_USER | SESSION_USER }
ALTER PACKAGE name RENAME TO new_name
ALTER PACKAGE name SET SCHEMA new_schema

语义

name

修改的包的名字。可以有数据库名和模式名修饰,但数据库名只能是当前数据库。

new_name

包的新名字。

new_owner

包的新属主。

new_schema

包的新归属模式。

示例

ALTER PACKAGE pkg OWNER TO user_a;
ALTER PACKAGE pkg RENAME TO pkg2;
ALTER PACKAGE test.public.pkg RENAME TO pkg3;(当前数据库为 TEST)
ALTER PACKAGE pkg SET SCHEMA sch;

12.8. ALTER POLICY

用途

ALTER POLICY更改一条现有行级安全性策略的定义。 请注意,ALTER POLICY只允许修改策略所应用的角色集合, 和要修改的USINGWITH CHECK表达式。 要更改策略的其他属性,例如其应用的命令,或者是允许还是限制, 则必须删除并重新创建策略。

ALTER POLICY的第二种形式中,如果指定了角色列表、 ``using_expression``以及 ``check_expression``, 它们会被独立地替换。当这些子句之一被省略时,策略的对应部分不会被更改。

前置条件

要使用ALTER POLICY,你必须拥有该策略所适用的表。

语法

ALTER POLICY name ON table_name RENAME TO new_name

ALTER POLICY name ON table_name
    [ TO { role_name | PUBLIC | CURRENT_USER | SESSION_USER } [, ...] ]
    [ USING ( using_expression ) ]
    [ WITH CHECK ( check_expression ) ]

语义

name

要更改的现有策略的名称。

table_name

该策略所在的表的名称(可以被模式限定)。

new_name

该策略的新名称。

role_name

该策略适用的角色。可以一次指定多个角色。要把该策略 应用于所有角色,可使用PUBLIC

using_expression

该策略的USING表达式。详见 CREATE POLICY 。

check_expression

该策略的WITH CHECK表达式。详见 CREATE POLICY 。

示例

修改策略名称

ALTER POLICY policy_name ON mytable RENAME TO new_policy_name;

兼容性

ALTER POLICY是一种KingbaseES扩展。

12.9. ALTER PROCEDURE

用途

ALTER PROCEDURE — 更改一个过程的定义

前置条件

要使用ALTER PROCEDURE,你必须拥有该过程。要更改一个过程的方案,你还必须有新方案上的CREATE特权。要更改拥有者,你还必须是新拥有角色的直接或间接成员,并且那个角色在该过程的方案上拥有CREATE特权(这些限制强制更新拥有者无法做到通过删除和重建该过程无法做到的事情。不过,超级用户总是能够更改任何过程的拥有关系)。

语法

ALTER PROCEDURE name [ ( [ [ argmode ] [ argname ] argtype [, ...] ] ) ]
    action [ ... ] [ RESTRICT ]
ALTER PROCEDURE name [ ( [ [ argmode ] [ argname ] argtype [, ...] ] ) ]
    RENAME TO new_name
ALTER PROCEDURE name [ ( [ [ argmode ] [ argname ] argtype [, ...] ] ) ]
    OWNER TO { new_owner | CURRENT_USER | SESSION_USER }
ALTER PROCEDURE name [ ( [ [ argmode ] [ argname ] argtype [, ...] ] ) ]
    SET SCHEMA new_schema
ALTER PROCEDURE name [ ( [ [ argmode ] [ argname ] argtype [, ...] ] ) ]
    DEPENDS ON EXTENSION extension_name

其中action是下列之一:

    [ EXTERNAL ] SECURITY INVOKER | [ EXTERNAL ] SECURITY DEFINER
    SET configuration_parameter { TO | = } { value | DEFAULT }
    SET configuration_parameter FROM CURRENT
    RESET configuration_parameter
    RESET ALL

语义

name

一个现有的过程的名字(可以被方案限定)。如果没有指定参数列表,这个名字必须在其方案中唯一。

argmode

参数的模式:INVARIADIC。如果被省略,默认是IN

argname

参数的名字。注意ALTER PROCEDURE实际上并不关心参数名,因为只需要参数的数据类型来确定过程的身份。

argtype

如果该过程有参数,这是参数的数据类型(可以被方案限定)。

new_name

该过程的新名字。

new_owner

该过程的新拥有者。注意,如果这个过程被标记为SECURITY DEFINER,接下来它将被作为新拥有者执行。

new_schema

该过程的新方案。

extension_name

该过程所依赖的扩展的名称。

[ EXTERNAL ] SECURITY INVOKER [ EXTERNAL ] SECURITY DEFINER

更改该过程是否为一个安全性定义器。关键词EXTERNAL由于SQL符合性的原因被忽略。更多有关这个能力的信息请见 CREATE PROCEDURE语句 。

configuration_parameter value

增加或者更改在调用该过程时,要对一个配置参数做的赋值。如果``value``DEFAULT或者等效的值,则会使用RESET,过程本地的设置会被移除,这样该过程的执行就会使用其所处环境中的值。使用RESET ALL可以清除所有的过程本地设置。SET FROM CURRENT会把ALTER PROCEDURE执行时该参数的当前值保存为进入该过程时要被应用的值。

关于允许的参数名和参数值的更多信息请见 SET 和 服务器配置参数参考手册 。

RESTRICT

为了符合SQL标准会被忽略。

示例

要重命名具有两个integer类型参数的过程insert_datainsert_record

ALTER PROCEDURE insert_data(integer, integer) RENAME TO insert_record;

要把具有两个integer类型参数的过程insert_data的拥有者改为joe

ALTER PROCEDURE insert_data(integer, integer) OWNER TO joe;

要重把具有两个integer类型参数的过程insert_data的方案改为accounting

ALTER PROCEDURE insert_data(integer, integer) SET SCHEMA accounting;

把过程insert_data(integer, integer)标记为依赖于扩展myext

ALTER PROCEDURE insert_data(integer, integer) DEPENDS ON EXTENSION myext;

要调整一个过程自动设置的搜索路径:

ALTER PROCEDURE check_password(text) SET search_path = admin, sys_temp;

要为一个过程禁用search_path的自动设置:

ALTER PROCEDURE check_password(text) RESET search_path;

现在这个过程将用其调用者所使用的任何搜索路径执行。

12.10. ALTER PUBLICATION

用途

命令ALTER PUBLICATION可以更改发布的属性。

前三个语句更改哪些表是该发布的一部分。SET TABLE子句用指定的表替换发布中的表的列表。ADD TABLEDROP TABLE子句将从发布中添加和删除一个或多个表。请注意,将表添加到已订阅的发布中将需要在订阅端执行ALTER SUBSCRIPTION ... REFRESH PUBLICATION操作才能生效。

第四条语句可以改变在 CREATE PUBLICATION 中指定的所有发布属性。 该命令中未提及的属性保留其先前的设置。

其余语句更改所有者和发布的名称。

前置条件

你必须拥有该发布才能使用ALTER PUBLICATION。要改变所有者,你也必须是新所有者角色的直接或间接成员。新的所有者必须在数据库上拥有 CREATE权限。此外,``FOR ALL TABLES``发布的新所有者必须是超级用户。但是,超级用户可以在避开这些限制的情况下更改发布的所有权。

语法

ALTER PUBLICATION name ADD TABLE [ ONLY ] table_name [ * ] [, ...]
ALTER PUBLICATION name SET TABLE [ ONLY ] table_name [ * ] [, ...]
ALTER PUBLICATION name DROP TABLE [ ONLY ] table_name [ * ] [, ...]
ALTER PUBLICATION name SET ( publication_parameter [= value] [, ... ] )
ALTER PUBLICATION name OWNER TO { new_owner | CURRENT_USER | SESSION_USER }
ALTER PUBLICATION name RENAME TO new_name

语义

name

要修改定义的现有发布的名称。

table_name

现有表的名称。如果在表名之前指定了ONLY,则只有该表受到影响。 如果没有指定ONLY,则该表及其所有后代表(如果有的话)都会受到影响。 可选地,可以在表名之后指定*以明确指示包含后代表。

SET ( publication_parameter [= value] [, ... ] )

该子句修改最初由 CREATE PUBLICATION 设置的发布参数。

new_owner

发布的新所有者的用户名。

new_name

发布的新名称。

示例

将发布修改为只发布删除和更新:

ALTER PUBLICATION noinsert SET (publish = 'update, delete');

给发布添加一些表:

ALTER PUBLICATION mypublication ADD TABLE users, departments;

兼容性

ALTER PUBLICATION是KingbaseES的一个扩展。

其他

参见 CREATE PUBLICATION , DROP PUBLICATION , CREATE SUBSCRIPTION , ALTER SUBSCRIPTION

12.11. ALTER ROLE

用途

ALTER ROLE更改一个 KingbaseES角色的属性。

前面列出的这个命令的第一种变体能够更改 CREATE ROLE 中指定的很多角色属性(覆盖了所有可能的属性,不过没有增加和移除成员关系的选项,如果要增加和移除成员关系可使用 GRANT 和 REVOKE )。该命令中没有提到的属性保持它们之前的设置。 数据库超级用户能够更改任何角色的任何这些设置。具有CREATEROLE 特权的角色能够更改任何这些设置,但是只能为非超级用户和非复制角色修改。普通角色只能更改它们自己的口令。

第二种变体更改该角色的名称。数据库超级用户能重命名任何角色。具有 CREATEROLE特权的角色能够重命名任何非超级用户角色。当前的会话 用户不能被重命名(如果需要这样做,请以一个不同的用户连接)。由于 MD5加密的口令使用角色名作为 salt,因此如果一个角色的口令是 MD5加密的,重命名该角色会清空其口令。

其余的变体用于更改一个角色的配置变量的会话默认值,可以为所有数据库设置,或者 只为IN DATABASE中指定的数据库设置。如果指定的是 ALL而不是一个角色名,将会为所有角色更改该设置。把 ALLIN DATABASE一起使用实际上和使用命 令ALTER DATABASE ... SET ...相同。

只要改角色后续开始一个新会话,指定的值将会成为该会话的默认值,并且会覆盖 kingbase.conf 中存在的值或者从 kingbase 命令行收到的值。这只在登录时发生,执行 SET ROLE 或者 SET SESSION AUTHORIZATION 不会导致新的配置值被设置。对于所有数据库设置的值会被附加到一个角色的数据库相关的设置所覆盖。特定数据库或角色的设置会覆盖为所有角色所作的设置。

前置条件

超级用户能够更改任何人的会话默认值。具有CREATEROLE特权的角色能够更改非超级用户的默认值。普通角色只能为它们自己设置默认值。某些配置变量不能以这种方式设置,或者只能由超级用户发出的命令设置。只有超级用户能够更改所有角色在所有数据库中的设置。

语法

ALTER ROLE role_specification [ WITH ] option [ ... ]

其中option可以是:

      SUPERUSER | NOSUPERUSER
    | CREATEDB | NOCREATEDB
    | CREATEROLE | NOCREATEROLE
    | INHERIT | NOINHERIT
    | LOGIN | NOLOGIN
    | REPLICATION | NOREPLICATION
    | BYPASSRLS | NOBYPASSRLS
    | CONNECTION LIMIT connlimit
    | [ ENCRYPTED ] PASSWORD 'password' | PASSWORD NULL
    | VALID UNTIL 'timestamp'

ALTER ROLE name RENAME TO new_name

ALTER ROLE { role_specification | ALL } [ IN DATABASE database_name ] SET
configuration_parameter { TO | = } { value | DEFAULT }
ALTER ROLE { role_specification | ALL } [ IN DATABASE database_name ] SET
configuration_parameter FROM CURRENT
ALTER ROLE { role_specification | ALL } [ IN DATABASE database_name ] RESET
configuration_parameter
ALTER ROLE { role_specification | ALL } [ IN DATABASE database_name ] RESET
ALL

其中role_specification可以是:

    role_name
  | CURRENT_USER
  | SESSION_USER

语义

name

要对其属性进行修改的角色的名称。

CURRENT_USER

修改当前用户而不是一个显式标识的角色。

SESSION_USER

修改当前会话用户而不是一个显式标识的角色。

SUPERUSER NOSUPERUSER CREATEDB NOCREATEDB CREATEROLE NOCREATEROLE INHERIT NOINHERIT LOGIN NOLOGIN REPLICATION NOREPLICATION BYPASSRLS NOBYPASSRLS CONNECTION LIMIT connlimit [ ENCRYPTED ] PASSWORD 'password' PASSWORD NULL VALID UNTIL 'timestamp'

这些子句修改原来有 CREATE ROLE 设置的属性。更多信息请见 CREATE ROLE参考页。

new_name

该角色的新名称。

database_name

要在其中设置该配置变量的数据库名称。

configuration_parameter value

把这个角色的指定配置参数的会话默认值设置为给定值。如果 value 为DEFAULT或者等效地使用了RESET,角色相关的变量设置会被移除,这样该角色将会在新会话中继承系统范围的默认 设置。使用 RESET ALL 可清除所有角色相关的设置。SET FROM CURRENT可以把会话中该参数的当前值保存为角色相关的值。如果指定了 IN DATABASE ,只会为给定的角色和数据库设置或者移除该配置参数。

角色相关的变量设置只在登录时生效, SET ROLE 以及 SET SESSION AUTHORIZATION 不会处理角色相关的变量设置。

关于允许的参数名称和值详见 SET 和 服务器配置参数参考手册 。

示例

更改一个角色的口令:

ALTER ROLE davide WITH PASSWORD 'hu8jmn3';

移除一个角色的口令:

ALTER ROLE davide WITH PASSWORD NULL;

更改一个口令的失效日期,指定该口令应该在 2015 年 5 月 4 日中午(在一个比UTC快 1 小时的时区)过期:

ALTER ROLE chris VALID UNTIL 'May 4 12:00:00 2015 +1';

让一个口令永远有效:

ALTER ROLE fred VALID UNTIL 'infinity';

让一个角色能够创建其他角色和新的数据库:

ALTER ROLE miriam CREATEROLE CREATEDB;

为一个角色指定maintenance_work_mem参数的非默认设置:

ALTER ROLE worker_bee SET maintenance_work_mem = 100000;

为一个角色指定 client_min_messages 参数的数据库相关的非默认设置:

ALTER ROLE fred IN DATABASE devel SET client_min_messages = DEBUG;

其他

使用 CREATE ROLE 增加新角色,使用 DROP ROLE 移除一个角色。

ALTER ROLE无法更改一个角色成员关系。可以使用 GRANT 和 REVOKE 来实现。

在使用这个命令指定一个未加密口令时要多加小心。该口令将会以明文传送到服务器,并且它还可能会被记录在客户端的命令历史或者服务器日志中。 ksql 包含了一个命令password,它可以被用来更改一个角色 的口令而不暴露明文口令。

也可以把一个会话默认值绑定到一个指定的数据库而不是一个角色,详见 : ALTER_DATABASE 。如果出现冲突,数据库角色相关的设置会覆盖角色相关的设置,角色相关的又会覆盖数据库相关的设置。

12.12. ALTER ROUTINE

用途

ALTER ROUTINE更改一个例程的定义,它可以是聚集函数、普通函数或者过程。参数的描述、更多的例子以及进一步的细节请参考 ALTER AGGREGATE 、 ALTER FUNCTION语句 以及 ALTER PROCEDURE语句 。

前置条件

你必须拥有该例程以使用 ALTER ROUTINE 。要重命名例程名或更改例程名的属主,那么这个例程名必须不存在。要修改某个模式下的例程,那么这个模式下必须存在这个例程。

语法

ALTER ROUTINE name [ ( [ [ argmode ] [ argname ] argtype [, ...] ] ) ]

action [ ... ] [ RESTRICT ]

ALTER ROUTINE name [ ( [ [ argmode ] [ argname ] argtype [, ...] ] ) ]

RENAME TO new_name

ALTER ROUTINE name [ ( [ [ argmode ] [ argname ] argtype [, ...] ] ) ]

OWNER TO { new_owner | CURRENT_USER | SESSION_USER }

ALTER ROUTINE name [ ( [ [ argmode ] [ argname ] argtype [, ...] ] ) ]

SET SCHEMA new_schema

ALTER ROUTINE name [ ( [ [ argmode ] [ argname ] argtype [, ...] ] ) ]

DEPENDS ON EXTENSION extension_name

其中action是下列之一:

IMMUTABLE | STABLE | VOLATILE | [ NOT ] LEAKPROOF [ EXTERNAL ] SECURITY INVOKER | [ EXTERNAL ] SECURITY DEFINER PARALLEL { UNSAFE | RESTRICTED | SAFE } COST execution_cost ROWS result_rows SET configuration_parameter { TO | = } { value | DEFAULT } SET configuration_parameter FROM CURRENT RESET configuration_parameter RESET ALL

语义

待补充

示例

将类型integer的例程foo重命名为foobar

ALTER ROUTINE foo(integer) RENAME TO foobar;

不管foo是聚集、函数还是过程,这个命令都能使用。

兼容性

这个语句与SQL标准中的ALTER ROUTINE语句部分兼容。更多细节请参考 ALTER FUNCTION语句 和 ALTER PROCEDURE语句 。允许例程名称引用聚集函数是一种KingbaseES的扩展。

其他

参见 ALTER AGGREGATE , ALTER FUNCTION语句 , ALTER PROCEDURE语句 , DROP ROUTINE 注意没有CREATE ROUTINE命令。

12.13. ALTER RULE

用途

ALTER RULE更改一条现有规则的定义。当前,唯一可用的动作是更改规则的名称。

前置条件

要使用ALTER RULE,你必须拥有该规则适用的表或者视图。

语法

ALTER RULE name ON table_name RENAME TO new_name

语义

name

要修改的一条现有规则的名称。

table_name

该规则适用的表或视图的名称(可以是模式限定的)。

new_name

该规则的新名称。

示例

要重命名一条现有的规则:

ALTER RULE notify_all ON emp RENAME TO notify_me;

兼容性

ALTER RULE是一种KingbaseES的语言扩展,整个查询重写系统也是。

12.14. ALTER SCHEMA

用途

ALTER SCHEMA更改一个模式的定义。

前置条件

要使用ALTER SCHEMA,你必须拥有该模式。要重命名一个模式,你还必须拥有该数据库的CREATE特权。要更改拥有者,你还必须是新拥有角色的一个直接或者间接成员,并且该角色必须具有该数据库上的 CREATE特权(注意超级用户自动拥有所有这些特权)。

语法

ALTER SCHEMA name RENAME TO new_name
ALTER SCHEMA name OWNER TO { new_owner | CURRENT_USER | SESSION_USER }

语义

name

一个现有模式的名称。

new_name

该模式的新名称。新名称不能以sys_开始,因为这些名称被保留用于系统模式。

new_owner

该模式的新拥有者。

示例

要重命名一条现有的规则:

ALTER RULE notify_all ON emp RENAME TO notify_me;

兼容性

在 SQL 标准中没有ALTER SCHEMA语句。

12.15. ALTER SEQUENCE

用途

ALTER SEQUENCE更改一个现有序列发生器的参数。 任何没有在ALTER SEQUENCE命令中明确设置的参数 保持它们之前的设置。

前置条件

要使用ALTER SEQUENCE,你必须拥有该序列。要更改一个序列 的模式,你还必须拥有新模式上的CREATE特权。要更改拥有者,你还必须 是新拥有角色的一个直接或者间接成员,并且该角色必须具有该域的模式上的 CREATE特权(这些限制强制修改拥有者不能做一些通过删除和重 建该序列做不到的事情。不过,超级用户怎么都能更改任何序列的所有权。)。

语法

ALTER SEQUENCE [ IF EXISTS ] name
    [ AS data_type ]
    [ INCREMENT [ BY ] increment ]
    [ MINVALUE minvalue | NO MINVALUE ] [ MAXVALUE maxvalue | NO MAXVALUE ]
    [ START [ WITH ] start ]
    [ RESTART [ [ WITH ] restart ] ]
    [ CACHE cache ] [ NOCACHE ]
    [ [ NO ] CYCLE ] [ NOCYCLE ]
    [ ORDER ] [ NOORDER ]
    [ OWNED BY { table_name.column_name | NONE } ]
ALTER SEQUENCE [ IF EXISTS ] name OWNER TO { new_owner | CURRENT_USER |
SESSION_USER }
ALTER SEQUENCE [ IF EXISTS ] name RENAME TO new_name
ALTER SEQUENCE [ IF EXISTS ] name SET SCHEMA new_schema

语义

name

要修改的序列的名称(可以是模式限定的)。

IF EXISTS

在序列不存在时不要抛出一个错误。这种情况下会发出一个提示。

data_type

可选子句AS data_type 改变序列的数据类型。有效类型是smallintinteger 和bigint

当且仅当先前的最小值和最大值是旧数据类型的最小值或最大值时(换句话说, 如果序列是使用NO MINVALUENO MAXVALUE, 隐式或显式创建的),则更改数据类型会自动更改序列的最小值和最大值。 否则,将保留最小值和最大值,除非将新值作为同一命令的一部分给出。 如果最小值和最大值不符合新的数据类型,则会生成错误。

increment

子句INCREMENT BY increment是可选的。 一个正值将产生一个上升序列,一个负值会产生一个下降序列。如果 没有指定,旧的增量值将被保持。

minvalue NO MINVALUE

可选的子句MINVALUE minvalue决定一个序列 能产生的最小值。如果指定了NO MINVALUE,上升序列和下降序列的默认值分别是 1 和 数据类型的最小值。如果这些选项都没有被指定,将保持当前的 最小值。

maxvalue NO MAXVALUE

可选的子句MAXVALUE maxvalue决定一个序列 能产生的最大值。如果指定了NO MAXVALUE,上升序列和下降序列的默认值分别是 数据类型的最大值和 -1。如果这些选项都没有被指定,将保持当前的 最大值。

start

可选的子句START WITH start更改该序列被记录的开始值。 这对于当前序列值没有影响,它会简单地设置 未来ALTER SEQUENCE RESTART命令将会使用的值。

restart

可选的子句RESTART [ WITH restart ]更改该序列的 当前值。这类似于用is_called = false 调用setval函数:被指定的值将会被 下一次nextval调用返回。写上没有 ``restart``值的 RESTART等效于提供被 CREATE SEQUENCE记录的或者上一次被 ALTER SEQUENCE START WITH设置的开始值。

setval调用相比,序列上的RESTART 操作是事务性的并阻止并发事务从同一序列中获取数字。 如果这不是所需的操作模式,则应使用setval

cache NOCYCLE

子句CACHE cache使得序列数字被预先 分配并且保存在内存中以便更快的访问。最小值是 1(每次只产生一个值,即 无缓存)。如果没有指定,旧的缓冲值将被保持。

指定NOCACHE,即没有缓存,缓存值为1。

CYCLE

可选的CYCLE关键词可以被用来允许该序列在达到 ``maxvalue``(上升序列)或 ``minvalue``(下降序列)时 回卷。如果到达该限制,下一个被产生的数字将分别是 ``minvalue``或者 ``maxvalue``

NO CYCLE NOCYCLE

如果指定了可选的NO CYCLE关键词,任何在该 序列到达其最大值后的nextval调用将会返回 一个错误。如果既没有指定CYCLE也没有指定 NO CYCLE,旧的循环行为将被保持。

NOCYCLE等价于NO CYCLE

ORDER NOORDER

ORDERNOORDER只在语法层面兼容Oracle数据库,并没有实现相应的功能。

OWNED BY table_name.column_name OWNED BY NONE

OWNED BY选项导致该序列与一个特定的表列相关联, 这样如果该列(或者整个表)被删除,该序列也会被自动删除。如果指定, 这种关联会替代之前为该序列指定的任何关联。被指定的表必须具有相同的 拥有者并且与该序列在同一个模式中。指定 OWNED BY NONE可以移除任何现有的关联,让该序列 “自立”。

new_owner

该序列的新拥有者的用户名。

new_name

该序列的新名称。

new_schema

该序列的新模式。

示例

从 105 重启一个被称为serial的序列:

ALTER SEQUENCE serial RESTART WITH 105;

其他

ALTER SEQUENCE将不会立即影响除当前后端外 其他后端中的nextval结果,因为它们有预分配(缓存)的序列 值。在注意到序列生成参数被更改之前它们将用尽所有缓存的值。当前后端将被 立刻影响。

ALTER SEQUENCE不会影响该序列的 currval状态(在 KingbaseES V8 之前有时会影响)。

ALTER SEQUENCE阻塞并发nextval、 currvallastval和 setval调用。

由于历史原因,ALTER TABLE也可以被用于序列,但是只有等效于上述形式的ALTER TABLE变体才被 允许用于序列。

12.16. ALTER SERVER

用途

ALTER SERVER更改一个外部服务器的定义。 第一种形式更改该服务器的版本字符串或者该服务器的一般选项(至少要求一个子句)。第二种形式更改该服务器的拥有者。

前置条件

要修改该服务器,你必须是它的拥有者。此外为了修改拥有者,你必须拥有该服务器并且是新拥有角色的一个直接或者间接成员,并且你必须具有该服务器的外部数据包装器上的USAGE特权(注意超级用户自动满足所有这些政策)。

语法

ALTER SERVER name [ VERSION 'new_version' ]
    [ OPTIONS ( [ ADD | SET | DROP ] option ['value'] [, ... ] ) ]
ALTER SERVER name OWNER TO { new_owner | CURRENT_USER | SESSION_USER }
ALTER SERVER name RENAME TO new_name

语义

name

一个现有服务器的名称。

new_version

新的服务器版本。

OPTIONS ( [ ADD | SET | DROP ] option ['value'] [, ... ] )

更改该服务器的选项。ADDSET和 DROP指定要执行的动作。如果没有显式地指定操作,将会假定为ADD。选项名称必须唯一,名称和值也会使用该服务器的外部数据包装器库进行验证。

new_owner

该外部服务器的新拥有者的用户名。

new_name

该外部服务器的新名称。

示例

修改服务器foo,增加连接选项:

ALTER SERVER foo OPTIONS (host 'foo', dbname 'foodb');

修改服务器foo,更改版本、更改host选项:

ALTER SERVER foo VERSION '8.4' OPTIONS (SET host 'baz');

兼容性

ALTER SERVER符合 ISO/IEC 9075-9 (SQL/MED)。 OWNER TORENAME形式是 KingbaseES 扩展。

12.17. ALTER STATISTICS

用途

ALTER STATISTICS更改现有扩展统计对象的参数。任何在ALTER STATISTICS命令中没有明确设定的参数保持它们之前的设置。

前置条件

您必须拥有统计对象才能使用ALTER STATISTICS。要更改统计对象的模式,还必须在新模式上具有CREATE权限。 要更改所有者,还必须是新所有者角色的直接或间接成员,且该角色在统计对象的模式上必须具有CREATE权限。 (这些限制强制了通过删除和重新创建统计对象来改变所有者不会做任何你不能做的事情,但是超级用户可以改变任何统计对象的所有权。)

语法

ALTER STATISTICS name OWNER TO { new_owner | CURRENT_USER | SESSION_USER }
ALTER STATISTICS name RENAME TO new_name
ALTER STATISTICS name SET SCHEMA new_schema

语义

name

要修改的统计对象的名称(可能有模式修饰)。

new_owner

统计对象的新所有者的用户名。

new_name

统计对象的新名称。

new_schema

统计对象的新模式。

示例

修改服务器foo,增加连接选项:

ALTER SERVER foo OPTIONS (host 'foo', dbname 'foodb');

修改服务器foo,更改版本、更改host选项:

ALTER SERVER foo VERSION '8.4' OPTIONS (SET host 'baz');

兼容性

SQL标准中没有ALTER STATISTICS命令。

12.18. ALTER SUBSCRIPTION

用途

ALTER SUBSCRIPTION可以修改大部分可以在 CREATE SUBSCRIPTION 中指定的订阅属性。

前置条件

要使用ALTER SUBSCRIPTION,你必须拥有该订阅。要改变所有者,你也必须是新所有者的直接或间接成员。新所有者必须是超级用户。(目前,所有的订阅所有者必须是超级用户,所以所有者的检查将在实践中被绕过,但这可能在未来发生变化。)

语法

ALTER SUBSCRIPTION name CONNECTION 'conninfo'
ALTER SUBSCRIPTION name SET PUBLICATION publication_name [, ...] [ WITH (set_publication_option [= value] [, ... ] ) ]
ALTER SUBSCRIPTION name REFRESH PUBLICATION [ WITH ( refresh_option [= value] [, ... ] ) ]
ALTER SUBSCRIPTION name ENABLE
ALTER SUBSCRIPTION name DISABLE
ALTER SUBSCRIPTION name SET ( subscription_parameter [= value] [, ... ] )
ALTER SUBSCRIPTION name OWNER TO { new_owner | CURRENT_USER | SESSION_USER }
ALTER SUBSCRIPTION name RENAME TO new_name

语义

name

要修改属性的订阅的名称。

CONNECTION 'conninfo'

该子句修改最初由 CREATE SUBSCRIPTION 设置的连接属性。

SET PUBLICATION publication_name

更改订阅发布的列表。参阅 CREATE SUBSCRIPTION 获取更多信息。默认情况下,此命令也将像REFRESH PUBLICATION一样工作。

``set_publication_option``指定了这个操作的附加选项。 支持的选项是:

refresh (boolean)

如果为false,则该命令将不会尝试刷新表信息。然后应单独执行REFRESH PUBLICATION。默认值是true

此外,可以指定REFRESH PUBLICATION下描述的刷新选项。

REFRESH PUBLICATION

从发布者获取缺少的表信息。这将开始复制自上次调用REFRESH PUBLICATION或从CREATE SUBSCRIPTION以来添加到订阅发布中的表。

``refresh_option``指定了刷新操作的附加选项。 支持的选项有:

copy_data (boolean)

指定在复制启动后是否应复制正在订阅的发布中的现有数据。 默认值是true

ENABLE

启用先前禁用的订阅,在事务结束时启动逻辑复制工作。

DISABLE

禁用正在运行的订阅,在事务结束时停止逻辑复制工作。

SET ( subscription_parameter [= value] [, ... ] )

该子句修改原先由 CREATE SUBSCRIPTION 设置的参数。 允许的选项是slot_namesynchronous_commit

new_owner

订阅的新所有者的用户名。

new_name

订阅的新名称。

示例

将订阅的发布更改为insert_only

ALTER SUBSCRIPTION mysub SET PUBLICATION insert_only;

禁用(停止)订阅:

ALTER SUBSCRIPTION mysub DISABLE;

兼容性

ALTER SUBSCRIPTION是KingbaseES 的一个扩展。

其他

参见 CREATE SUBSCRIPTION , DROP SUBSCRIPTION , CREATE PUBLICATION , ALTER PUBLICATION

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值