ALTER FOREIGN TABLE

修改外表的定义。

概要

ALTER FOREIGN TABLE [ IF EXISTS ] name
    action [, ... ]
ALTER FOREIGN TABLE [ IF EXISTS ] name
    RENAME [ COLUMN ] column_name TO new_column_name
ALTER FOREIGN TABLE [ IF EXISTS ] name
    RENAME TO new_name
ALTER FOREIGN TABLE [ IF EXISTS ] name
    SET SCHEMA new_schema

其中 action 如下:

    ADD [ COLUMN ] column_name column_type [ COLLATE collation ] [ column_constraint [ ... ] ]
    DROP [ COLUMN ] [ IF EXISTS ] column_name [ RESTRICT | CASCADE ]
    ALTER [ COLUMN ] column_name [ SET DATA ] TYPE data_type
    ALTER [ COLUMN ] column_name SET DEFAULT expression
    ALTER [ COLUMN ] column_name DROP DEFAULT
    ALTER [ COLUMN ] column_name { SET | DROP } NOT NULL
    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 OPTIONS ( [ ADD | SET | DROP ] option ['value'] [, ... ])
    DISABLE TRIGGER [ trigger_name | ALL | USER ]
    ENABLE TRIGGER [ trigger_name | ALL | USER ]
    ENABLE REPLICA TRIGGER trigger_name
    ENABLE ALWAYS TRIGGER trigger_name
    OWNER TO new_owner
    OPTIONS ( [ ADD | SET | DROP ] option ['value'] [, ... ] )

描述

ALTER FOREIGN TABLE 修改一个已存在的外表的定义,命令有以下的几种形式:

ADD COLUMN

  • 这种方式往外表中新增一列,和 CREATE FOREIGN TABLE 使用相同的语法。这个不像往通常的表中新加一列,它其实在存储层面 不做任何操作,仅仅只是往现在访问的外表中定义了一些新列。

DROP COLUMN [ IF EXISTS ]

  • 这种形式从外表中删除一列,如果有表之外的其他对象,比如说视图依赖于此列,必须指定 CASCADE 关键字。如果指定了 IF EXISTS 关键字而这个列不存在,YMatrix 数据库只会产生一个提醒而不是抛出错误。

IF EXISTS

  • 如果指定了 IF EXISTS 关键字而外表不存在,YMatrix 数据库只会产生一个提醒而不是抛出错误。

SET DATA TYPE

  • 这种形式修改外表中一列的类型。

SET/DROP DEFAULT

  • 这种形式设置或者删除了列的默认值,默认值只会应用在随后的 INSERT 或者 UPDATE 命令;不会触发那些表中已经存在的行做修改。

SET/DROP NOT NULL

  • 标志一个列允许或者不允许空值。

SET STATISTICS

  • 这种形式为随后的 ANALYZE 操作设置每列的统计信息收集目标。

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

RESET ( attribute_option [, ... ] )

  • 这种形式设置或者重置了每个属性的选项。

DISABLE/ENABLE [ REPLICA | ALWAYS ] TRIGGER

  • 这些形式配置了触发那些属于外表的触发器。

OWNER

  • 这种形式修改外表的所有者为指定的用户。

RENAME

  • RENAME 修改一个外表的名字或者外表中个别列的名字。

SET SCHEMA

  • 这种形式将外表移到其他的模式下。

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

  • 为外表修改选项。ADD,SET 和 DROP 指定了要执行的操作。 如果没有明确指出操作,默认的操作是 ADD。选项名 必须是唯一的。YMatrix 数据库用外部数据包装器来验证名字和值。

你可以将除 RENAME 和 SET SCHEMA 之外的所有操作写在一个列表里让 YMatrix 数据库来并行的应用这些修改。 比如,可以在一个命令中增加多列或者修改多列的属性。

你必须是拥有这个表才能使用 ALTER FOREIGN TABLE 操作。为了修改外表的模式,你还必须在新的模式下拥有 CREATE 的权限。为了修改所有者,你必须是新的角色的直接或者间接成员,而且那个角色必须在表的模式下拥有 CREATE 权限。这些限制强制要求通过删除和重新创建表来更改所有者不会执行任何操作。 但是,超级用户无论如何都可以更改任何表的所有权。为了新增或者修改一个列的类型,你必须在数据类型上拥有 USAGE 权限。

参数

name

  • 要更改的现有外部表的名称(可能是模式限定的)。

column_name

  • 新的或者已存在的列的名称。

new_column_name

  • 已存在的列的新名称

new_name

  • 外表的新的名称。

data_type

  • 新的列的数据类型,或者已存在的列的新数据类型。

CASCADE

  • 自动删除依赖于要删除列的对象(比如说,关联到列的视图)。

RESTRICT

  • 拒绝删除有任何对象依赖的列。这是默认的表现。

trigger_name

  • 要启用或者禁用的单个触发器名称。

ALL

  • 禁用或启用属于外表的所有触发器。 (如果任何触发器是内部生成的触发器,则需要超级用户权限。核心系统不会将此类触发器添加到外表,但附加代码可以这样做。)

USER

  • 除内部生成的触发器外,禁用或启用属于外表的所有触发器。

new_owner

  • 外表的新所有者的用户名。

new_schema

  • 外表将移动到的模式的名称

示例

标志一个列为 NOT NULL:

ALTER FOREIGN TABLE distributors ALTER COLUMN street SET NOT NULL;

修改一个外表的选项:

ALTER FOREIGN TABLE myschema.distributors 
    OPTIONS (ADD opt1 'value', SET opt2 'value2', DROP opt3 'value3');

兼容性

这些 ADD,DROP 和 SET DATA TYPE 的形式于 SQL 标准相符。其他形式为 YMatrix 数据库在 SQL 标准的扩展。在单个 ALTER FOREIGN TABLE 命令中指定多个操作的功能也是 YMatrix 数据库的扩展。

你可以使用 ALTER FOREIGN TABLE ... DROP COLUMN 来删除外表中唯一的列,留下一个零列的表。这也是 SQL 的扩展,允许存在零列的外表。

另见

CREATE FOREIGN TABLEDROP FOREIGN TABLEALTER TABLE