ALTER TABLE 语句
ALTER TABLE 语句将更改表的定义。
调用
此语句可以嵌入在应用程序中,也可通过动态 SQL 语句来发出。 它是一个可执行语句,仅当 DYNAMICRULES 运行行为对于程序包有效时才能动态编译 (SQLSTATE 42509)。
权限
- 对要更改的表的 ALTER 特权
- 对要更改的表的 CONTROL 特权
- 对表模式的 ALTERIN 特权
- 对表的模式的 SCHEMAADM 权限
- DBADM 权限
- 对表的 REFERENCES 特权
- 对指定父键的每一列的 REFERENCES 特权
- 对表的 CONTROL 特权
- 对表的模式的 SCHEMAADM 权限
- DBADM 权限
- 对表的 ALTER 特权
- 对表的 CONTROL 特权
- 对表模式的 ALTERIN 特权
- 对表的模式的 SCHEMAADM 权限
- DBADM 权限
- 对表的 CONTROL 特权
- 对表的模式的 SCHEMAADM 权限
- DBADM 权限
- 所有以下项:
- 对表或视图的 SELECT 权限或对表或视图的模式的 SELECTIN 权限
- 对表或视图的 ALTER 特权或对表或视图的模式的 ALTERIN 特权(包括组特权)
- 该表或视图上的 CONTROL 特权
- 对表或视图的模式上的 DATAACCESS
- 对于数据库的 DATAACCESS 权限
- 对表或视图的 ALTER 特权
- 该表或视图上的 CONTROL 特权
- 对表或视图的模式的 ALTERIN 特权
- 对表的模式的 SCHEMAADM 权限
- DBADM 权限
要将类型为 DB2SECURITYLABEL 的列添加至表,该语句的授权标识的特权必须至少包含来自与该表相关联的安全策略的安全标号。
要从表中移除安全策略,该语句的授权标识所拥有的特权必须包括 SECADM 权限。
- 对表的 SELECT 特权或对包含源表的模式的 SELECTIN 特权以及对表的模式的 DROPIN 特权
- 对表的 CONTROL 特权
- 对表模式的 DATAACCESS 权限
- 对于数据库的 DATAACCESS 权限
- 所有以下项:
- 对表的 ALTER 特权或对表的模式的 ALTERIN 特权
- 对表的 INSERT 特权或对表的模式的 INSERTIN 特权
- 对表的 CONTROL 特权
- 对表模式的 DATAACCESS 权限
- 对于数据库的 DATAACCESS 权限
- 对数据库的 CREATETAB 权限,以及对表使用的表空间的 USE 特权,以及下列特权之一:
- 对数据库的 IMPLICIT_SCHEMA 权限(如果新表的隐式或显式模式名不存在)
- 对模式的 CREATEIN 特权(如果新表的模式名指的是现有模式)
- 对表模式的 SCHEMAADM 权限以及对表使用的表空间的 USE 权限
- DBADM 权限
- 所有以下项:
- 对表的 SELECT 特权或对表的模式的 SELECTIN 特权
- 对表的 ALTER 特权或对表的模式的 ALTERIN 特权
- 对表的 DELETE 特权或对表的模式的 DELETEIN 特权
- 对表的 CONTROL 特权
- 对表模式的 DATAACCESS 权限
- 对于数据库的 DATAACCESS 权限
- 所有以下项:
- 对表的 ALTER 特权或对表的模式的 ALTERIN 特权
- 对表的 DELETE 特权或对表的模式的 DELETEIN 特权
- 对表的 CONTROL 特权
- 对表的模式的 SCHEMAADM 权限
- DBADM 权限
- 对表的 CONTROL 特权
- 对表的模式的 SCHEMAADM 权限
- DBADM 权限
要将表更改为 ACTIVATE 和 DEACTIVATE 行和列访问控制,语句的授权标识拥有的特权必须包括 SECADM 权限。
- 对表的 CONTROL 特权
- 对表的模式的 SCHEMAADM 权限
- DBADM 权限
- 对历史记录表的 ALTER 特权
- 对历史记录表的 CONTROL 特权
- 对历史记录表的模式的 ALTERIN 特权
- 对历史记录表的模式的 SCHEMAADM 权限
- DBADM 权限
语法
- 1 The same clause must not be specified more than once (SQLSTATE 42614).
- 2 If an ACTIVATE or DEACTIVATE clause is specified for row access control, no other clause except ACTIVATE or DEACTIVATE column access control can be specified in the same ALTER TABLE statement (SQLSTATE 42613).
- 3 If an ACTIVATE or DEACTIVATE clause is specified for column access control, no other clause except ACTIVATE or DEACTIVATE row access control can be specified in the same ALTER TABLE statement (SQLSTATE 42613).
- 4 If the first column option chosen is generated-clause, data-type can be omitted; it is computed by the generation expression.
- 5 The lob-options clause applies to large object types (CLOB, DBCLOB, and BLOB), and to distinct types that are based on large object types only.
- 6 The SCOPE clause applies to the REF type only.
- 7 The default-clause and generated-clause cannot both be specified for the same column definition (SQLSTATE 42614).
- 8 Data type is optional for a row change timestamp column if the first column-option specified is a generated-clause. The data type default is TIMESTAMP(6). Data type is optional for row-begin, row-end, and transaction-start-ID columns if the first column-option is a generated-clause; the data type default is TIMESTAMP(12).
- 9 The same clause must not be specified more than once.
- 10 The specified distinct type cannot have any data type constraints and the source type cannot be an anchored data type (SQLSTATE 428H2).
- 11 The FOR BIT DATA clause can be specified in any order with the other column constraints that follow. The FOR BIT DATA clause cannot be specified with string units CODEUNITS32 (SQLSTATE 42613).
描述
- 表名
- table-name 必须标识当前服务器中的表。 它不能是昵称 (SQLSTATE 42809),也不能是视图、目录表、已创建临时表或已声明临时表 (SQLSTATE 42995)。
如果 table-name 标识具体化查询表,则改变仅限于添加或删除具体化查询、启动 ACTIVATING NOT LOGGED INITIALLY 子句、添加或删除 RESTRICT ON DROP、修改数据捕获、可用百分比、锁定大小、连接、易失性、数据行压缩、值压缩以及激活或停用行和列访问控制。
如果 table-name 标识影子表,则除了具体化查询表支持的更改之外,更改还可以包括添加或删除主键。
如果 table-name 标识范围集群表,则更改仅限于添加、更改或删除约束、激活初始未记录、添加或删除 RESTRICT ON DROP、更改锁定大小、数据捕获或易失性以及设置列缺省值。
- ADD column-definition
- 将列添加到表中。无法将列添加到以下表中:对于表中的所有现有列,新列的值将设置为其缺省值。 新列是表中的最后一列;即,如果最初存在 N 列,那么添加的列是列 N+1。
- 系统周期临时表的历史记录表 (SQLSTATE 428HZ)
- 类型化表 (SQLSTATE 428DH)
- 要在异步后台操作中创建压缩字典的表 (SQL20054N)
添加新列不会导致所有列的总字节计数超过最大记录大小。
如果该表是系统周期临时表,那么还会将该列添加到关联的历史记录表。
如果所添加的列是基于表达式的生成列,那么该表达式不得引用为其定义了列掩码的列 (SQLSTATE 42621)。
如果将列添加到定义了掩码或许可权的表,或者添加到在掩码或许可权定义中引用的表,那么该掩码或许可权将失效。 对激活列访问控制的表及其上定义的无效掩码的访问将被阻止,直到禁用、删除或重新创建无效掩码 (SQLSTATE 560D0)。 对激活行访问控制的表及其定义的无效行权限的访问被阻止,直到无效权限被禁用、删除或重新创建 (SQLSTATE 560D0)。
- column-name
- 是要添加到表中的列的名称。 无法限定该名称。 不能使用表中的现有列名或周期名称 (SQLSTATE 42711)。
- 数据类型
- 是在
CREATE TABLE
下列出的数据类型之一。 - NOT NULL
- 防止列包含空值。 此外,还必须指定 default-clause (SQLSTATE 42601)。
- LOB-选项
- 指定 LOB 数据类型的选项。 请参阅
CREATE TABLE
中的 lob-options。 - 作用域
- 指定引用类型列的作用域。
- typed-table-name2
- 类型化表的名称。 column-name 的数据类型必须为 REF(S),其中 S 是 typed-table-name2 的类型 (SQLSTATE 428DM)。 不会检查 column-name 的缺省值以确保该值引用 typed-table-name2 中的现有行。
- typed-view-name2
- 类型视图的名称。 column-name 的数据类型必须是 REF (S),其中 S 是 typed-view-name2 的类型 (SQLSTATE 428DM)。 不会检查 column-name 的缺省值以确保这些值引用 typed-view-name2 中的现有行。
- CONSTRAINT constraint-name
- 命名约束。 constraint-name 不能标识已在同一 ALTER TABLE 语句中指定的约束,或标识为表上任何其他现有约束的名称 (SQLSTATE 42710)。
如果用户未指定约束名称,则系统会生成在表上定义的现有约束的标识中唯一的长度为 18 个字节的标识。 (该标识由 "SQL" 组成,后跟基于时间戳记的函数所生成的 15 个数字字符的序列)。
与 PRIMARY KEY 或 UNIQUE 约束一起使用时:- constraint-name 可能用作为支持约束而创建的索引的名称。 有关与唯一约束关联的索引名的详细信息,请参阅 Notes 。
- 如果适用,您可以使用使用 RANDOM 列定义的现有索引作为键索引。 如果有多个索引可以满足主要或唯一要求,则无法预测所选择的索引。 现有的主键或唯一键索引不能更改为随机排序的索引。 如果需要随机排序的主键或唯一键索引,则必须首先使用 RANDOM 关键字定义合适的索引。 然后,必须更改该表以添加主键或唯一键。
- 主键
- 提供定义由单个列组成的主键的简写方法。 因此,如果在列 C 的定义中指定了 PRIMARY KEY,则效果与将 PRIMARY KEY(C) 子句指定为单独的子句相同。 该列不能包含空值,因此还必须指定 NOT NULL 属性 (SQLSTATE 42831)。
请参阅 unique-constraint 描述中的 PRIMARY KEY。
- UNIQUE
- 提供定义由单个列组成的唯一键的简写方法。 因此,如果在列 C 的定义中指定了 UNIQUE,则效果与将 UNIQUE(C) 子句指定为单独的子句相同。
请参阅 unique-constraint 描述中的 UNIQUE。
- references-clause
- 提供定义由单个列组成的外键的简写方法。 因此,如果在列 C 的定义中指定了 references-clause,则效果与将 references-clause 指定为 FOREIGN KEY 子句的一部分一样,其中 C 是唯一已标识列。
请参阅
CREATE TABLE
中的 references-clause。- rule-clause
- 请参阅
CREATE TABLE
中的 rule-clause。
- CHECK (check-condition)
- 提供定义适用于单个列的检查约束的简写方法。 请参阅
CREATE TABLE
中的 check-condition。 - constraint-attributes
- 请参阅
CREATE TABLE
中的 constraint-attributes。
- default-clause
- 指定列的缺省值。
- WITH
- 可选关键字。
- 缺省值
- 在 INSERT 上未提供值或在 INSERT 或 UPDATE 上指定为 DEFAULT 时,提供缺省值。 如果未在 DEFAULT 关键字后面指定特定缺省值,那么缺省值取决于列的数据类型,如 表 1中所示。 如果列定义为 XML 或结构化类型,那么不能指定 DEFAULT 子句。
如果定义了使用单值类型的列,那么该列的缺省值是强制类型转换为单值类型的源数据类型的缺省值。
表 1. 缺省值(未指定值时) 数据类型 缺省值 数值 0 定长字符串 空白字符串 可变长度字符串 长度为 0 的字符串 固定长度图形字符串 由双字节空格组成的字符串 可变长度图形字符串 长度为 0 的字符串 固定长度二进制字符串 十六进制零的字符串 可变长度二进制字符串 长度为 0 的字符串 日期 对于现有行,为对应 0001 年 1 月 1 日的日期。 对于添加的行,为当前日期。 时间 对于现有行,为对应 0 小时 0 分 0 秒的时间。 对于添加的行,为当前时间。 时间戳记 对于现有行,为对应 0001 年 1 月 1 日的日期和对应 0 时 0 分 0 秒 0 微秒的时间。 对于添加的行,为当前时间戳记。 二进制字符串 (blob) 长度为 0 的字符串 布尔值 FALSE 从 column-definition 中省略 DEFAULT 会导致使用空值作为列的缺省值。
可以使用 DEFAULT 关键字指定的具体值类型如下。
- constant
- 将常量指定为该列的缺省值。 指定的常量必须:
- 表示根据第 3 章中描述的分配规则可能分配给列的值
- 不是浮点常量,除非使用浮点数据类型定义该列
- 为数值常量或十进制浮点特殊值,如果列的数据类型是十进制浮点。 浮点常量首先被解释为 DOUBLE,然后转换为十进制浮点。 对于 DECFLOAT (16) 列,十进制常量必须具有小于或等于 16 的精度值。
- 如果常量是十进制常量(例如,1.234 不能是 DECIMAL(5,2) 列的缺省值),则不能有超出列数据类型刻度的非零数字
- 常量必须以不超过 254 个字节的形式表示,包括引号字符、任何引入字符(例如,十六进制常量的 X)以及完全限定函数名称和括号中的字符(当常量是 cast-function 的参数时)。
- datetime-special-register
- 将在执行 INSERT、UPDATE 或 LOAD 时日期时间专用寄存器(CURRENT DATE、CURRENT TIME 或 CURRENT TIMESTAMP)的值指定为该列的缺省值。 该列的数据类型必须是与指定的专用寄存器对应的数据类型(例如,指定 CURRENT DATE 时,数据类型必须是 DATE)。 对于现有行,该值是处理 ALTER TABLE 语句时的当前日期、当前时间或当前时间戳记。
- user-special-register
- 将在执行 INSERT、UPDATE 或 LOAD 时用户专用寄存器(CURRENT USER、SESSION_USER、SYSTEM_USER)的值指定为该列的缺省值。 该列的数据类型必须是长度不小于用户专用寄存器的长度属性的字符串。 可以指定 USER 来代替 SESSION_USER,并且可以指定 CURRENT_USER 来代替 CURRENT USER。 对于现有行,该值为 ALTER TABLE 语句的 CURRENT USER、SESSION_USER 或 SYSTEM_USER。
- CURRENT SCHEMA
- 将在执行 INSERT、UPDATE 或 LOAD 时 CURRENT SCHEMA 专用寄存器的值指定为该列的缺省值。 如果指定了 CURRENT SCHEMA,那么该列的数据类型必须是长度大于或等于 CURRENT SCHEMA 专用寄存器的长度属性的字符串。 对于现有行,为处理 ALTER TABLE 语句时 CURRENT SCHEMA 特殊寄存器的值。
- CURRENT MEMBER
- 指定在 INSERT、UPDATE 或 LOAD 时 CURRENT MEMBER 特殊寄存器的值作为列的缺省值。 如果指定了 CURRENT MEMBER,则列的数据类型必须允许通过整数赋值。 对于现有行,为处理 ALTER TABLE 语句时 CURRENT MEMBER 专用寄存器的值。
- NULL
- 指定空值作为列的缺省值。 如果指定了 NOT NULL,则不能在同一列定义中指定 DEFAULT NULL。
- cast-function
- 此形式的缺省值可以与定义为单值类型、BLOB 或日期时间(DATE、TIME 或 TIMESTAMP)数据类型的列一起使用。 仅用于单值类型:函数的名称必须与列的单值类型的名称匹配,基于 BLOB 或日期时间类型的单值类型除外。 如果使用模式名进行限定,那么它必须与单值类型的模式名相同。 如果未进行限定,那么函数解析中的模式名必须与单值类型的模式名相同。 对于基于日期时间类型的单值类型(缺省值是一个常量),必须使用一个函数,并且该函数的名称必须与其隐式或显式模式名为 SYSIBM 的单值类型的源类型名称匹配。 对于其他日期时间列,也可以使用相应的日期时间函数。 对于 BLOB 或基于 BLOB 的单值类型,必须使用一个函数,并且该函数的名称必须是隐式或显式模式名为 SYSIBM 的 BLOB。
- constant
- 指定一个常量作为参数。 该常量必须符合单值类型的源类型或非单值类型的数据类型的常量规则。 如果 cast-function 是 BLOB,那么该常量必须是字符串常量。
- datetime-special-register
- 指定 CURRENT DATE、CURRENT TIME 或 CURRENT TIMESTAMP。 该列的单值类型的源类型必须是与指定的专用寄存器对应的数据类型。
- user-special-register
- 指定 CURRENT USER、SESSION_USER 或 SYSTEM_USER。 该列的单值类型的源类型的数据类型必须是长度至少为 8 字节的字符串数据类型。 如果 cast-function 为 BLOB,那么长度属性必须至少为 8 个字节。
- CURRENT SCHEMA
- 指定 CURRENT SCHEMA 专用寄存器的值。 该列的单值类型的源类型的数据类型必须是长度大于或等于 CURRENT SCHEMA 专用寄存器的长度属性的字符串。 如果 cast-function 为 BLOB,那么长度属性必须至少为 8 个字节。
- EMPTY_CLOB()、EMPTY_DBCLOB() 或 EMPTY_BLOB()
- 指定长度为零的字符串作为该列的缺省值。 该列必须具有与函数的结果数据类型相对应的数据类型。
如果指定的值无效,那么将返回错误 (SQLSTATE 42894)。
- generated-clause
- 指定该列的生成值。 在列定义中不能将此子句与 default-clause 一起指定 (SQLSTATE 42623)。 无法将生成的列添加到系统周期临时表 (SQLSTATE 428HZ)。 有关列生成的详细信息,请参阅
CREATE TABLE
。- 已生成
指定数据库管理器将为该列生成值。 必须指定 GENERATED 列是否被视为标识列、行更改时间戳记列、行起始列、行结束列、事务起始标识列或生成的表达式列。
如果该列可空,那么会将空值指定为现有行中该列的值。 否则,现有行中该列的值取决于该列的定义:- ROW CHANGE TIMESTAMP 使用对应于一月 1 , 0001 的日期以及对应于 0 小时, 0 分钟, 0 秒和 0 小数秒的时间
- ROW BEGIN 使用对应 0001 年 1 月 1 日的日期和对应 0 小时 0 分 0 秒 0 小数秒的时间
- ROW END 使用对应 9999 年 12 月 30 日的日期和对应 0 小时 0 分 0 秒和 0 小数秒的时间
- TRANSACTION START 标识使用对应于 0001 年 1 月 1 日的日期以及对应于 0 小时 0 分 0 秒 0 小数秒的时间。
- 表达式使用派生自该表达式的值
- ALWAYS
- 指定当插入或更新行并且必须生成值时,数据库管理器总是为该列生成一个值。 该表达式的结果将存储在表中。 GENERATED ALWAYS 是建议选项,除非正在运行数据传播或卸载和重新装入操作。 GENERATED ALWAYS 是生成列的缺省值。
- BY DEFAULT
- 指定数据库管理器在将行插入表或更新时为该列生成一个值,并为该列指定 DEFAULT,除非指定了显式值。 BY DEFAULT 只能与 as-row-change-timestamp-clause 一起指定。 当您使用数据传播或运行卸载和重新装入操作时,建议使用 BY DEFAULT 选项。
- FOR EACH ROW ON UPDATE AS ROW CHANGE TIMESTAMP
- 指定该列是一个时间戳记列,其中包含数据库管理器生成的值。 为插入的每一行中的列以及更新任何列的任何行生成一个值。 为 ROW CHANGE TIMESTAMP 列生成的值是对应于该行的插入时间或更新时间的时间戳记。 如果使用单个语句插入或更新了多行,那么对于每一行,ROW CHANGE TIMESTAMP 列的值可能不同。
一个表只能有一个 ROW CHANGE TIMESTAMP 列 (SQLSTATE 428C1)。 如果指定了 data-type,那么它必须是 TIMESTAMP 或 TIMESTAMP (6) (SQLSTATE 42842)。 ROW CHANGE TIMESTAMP 列不能具有 DEFAULT 子句 (SQLSTATE 42623)。 必须对 ROW CHANGE TIMESTAMP 列指定 NOT NULL (SQLSTATE 42831)。
- AS (generation-expression)
- 指定列的定义基于表达式。 通过使用带有 OFF NO ACCESS 选项的 SET INTEGRITY 语句,需要将表置于设置完整性暂挂无访问状态。 在 ALTER TABLE 语句之后,必须使用带有 IMMEDIATE CHECKED 和 FORCE GENERATED 选项的 SET INTEGRITY 语句来更新和检查该列中的所有值是否与新表达式相符。 有关使用 generation-expression 指定列的详细信息,请参阅
CREATE TABLE
。 - AS ROW BEGIN
- 指定每当向表中插入行或更新行中的任何列时,由数据库管理器分配该值。 该值是通过在事务中执行以下第一个事件期间使用时钟读取生成的:
- 需要为表中的行起始列或事务起始标识列分配值的数据更改语句
- 系统周期临时表中行的删除
对于系统周期临时表,数据库管理器确保跨事务的行开始列的生成值的唯一性。 可以调整时间戳记值以确保插入关联历史记录表的行的结束时间戳记值晚于开始时间戳记值 (SQLSTATE 01695)。 冲突事务更新系统周期临时表中的同一行时,可能会发生此情况。 必须将数据库配置参数 systime_period_adj 设置为 是,才能对时间戳记值进行此调整,否则将返回错误 (SQLSTATE 57062)。 如果在单个 SQL 事务中插入或更新多行并且不需要调整,则行起始列的值对于所有行都是相同的,并且不同于针对另一个事务的列生成的值。 行起始列作为 SYSTEM_TIME 周期的起始列是必需的,它是此类型生成列的预期用途。
一个表只能有一个行起始列 (SQLSTATE 428C1)。 如果未指定 data-type,那么该列将定义为 TIMESTAMP (12)。 如果指定 data-type,那么它必须是 TIMESTAMP (12) (SQLSTATE 42842)。 该列必须定义为 NOT NULL (SQLSTATE 42831)。 无法更新行起始列。
- AS ROW END
指定每当插入行或更新行中的任何列时,数据库管理器会为该列的数据类型分配一个值。 分配的值为 TIMESTAMP '9999-12-30-00.00.00.000000000000'。
作为 SYSTEM_TIME 周期的第二列,行结束列是必需的,这是此类型生成列的预期用途。
一个表只能有一个行结束列 (SQLSTATE 428C1)。 如果未指定 data-type,则该列定义为 TIMESTAMP(12)。 如果指定 data-type,那么它必须是 TIMESTAMP (12) (SQLSTATE 42842)。 该列必须定义为 NOT NULL (SQLSTATE 42831)。 无法更新行结束列。
- AS TRANSACTION START ID
- 指定每当向表中插入行或更新行中的任何列时,由数据库管理器分配该值。 数据库管理器为每个事务分配唯一时间戳记值或空值。 如果该列可空,并且该表中不需要调整该值的行开始列存在,那么会将空值分配给事务开始标识列。 否则,在事务中执行以下第一个事件期间,将通过读取时间时钟来生成该值:
- 需要为表中的行起始列或事务起始标识列分配值的数据更改语句
- 系统周期临时表中行的删除
系统周期临时表需要事务起始标识列,该表是此类生成列的预期用途。
一个表只能有一个事务起始标识列 (SQLSTATE 428C1)。 如果未指定 data-type,则该列定义为 TIMESTAMP(12)。 如果指定了 data-type,那么它必须是 TIMESTAMP (12)。 事务起始标识列无法更新。
- COMPRESS SYSTEM DEFAULT
- 指定系统缺省值(即未指定特定值时用于数据类型的缺省值)将存储在最小空间中。 如果未指定 VALUE COMPRESSION 子句,那么将返回警告 (SQLSTATE 01648),并且系统缺省值不会存储在最小空间中。
允许以这种方式存储系统缺省值将导致在对列执行插入和更新操作期间由于执行额外检查而产生轻微的性能损失。
基本数据类型不能是 DATE、TIME、TIMESTAMP、XML 或结构化数据类型 (SQLSTATE 42842)。 如果基本数据类型是可变长度的字符串,那么将忽略此子句。 如果使用 VALUE COMPRESSION 设置表,那么将自动压缩长度为 0 的字符串值。
- COLUMN SECURED WITH security-label-name
- 标识与该表关联的安全策略的安全标号。 不能限定该名称 (SQLSTATE 42601)。 必须将该表与安全策略关联 (SQLSTATE 55064)。 该表不能是系统周期临时表。
- NOT HIDDEN 或 IMPLICITLY HIDDEN
- 指定是否将该列定义为隐藏列。 隐藏属性确定该列是否包含在对该表的隐式引用中,或者能否在 SQL 语句中显式引用该列。 缺省值为 NOT HIDDEN。
- NOT HIDDEN
- 指定该列包含在对该表的隐式引用中,并且可显式引用该列。
- IMPLICITLY HIDDEN
- 指定除非按名称显式引用该列,否则该列在 SQL 语句中不可视。 例如,假定某个表包含使用 IMPLICITLY HIDDEN 子句定义的列,那么
SELECT *的结果不包含隐式隐藏列。 但是,显式引用隐式隐藏列的名称的 SELECT 结果将该列包含在结果表中。
- ADD unique-constraint
- 定义唯一或主键约束。 无法将主键或唯一约束添加至作为子表的表 (SQLSTATE 429B3)。 如果该表是位于层次结构顶部的超表,那么该约束将应用于该表及其所有子表。
- CONSTRAINT constraint-name
- 指定主键或唯一约束。 有关更多信息,请参阅 CREATE TABLE 语句中的 constraint-name 。
- UNIQUE (column-name, ... BUSINESS_TIME WITHOUT OVERLAPS)
- 定义由已标识列和周期组成的唯一键。 已标识列必须定义为 NOT NULL。 每个 column-name 都必须标识该表的一列,并且同一列不得多次标识。 无法限定该名称。 已标识列的数量加上标识的周期数的两倍不得超过 64,并且它们的存储长度之和不得超过页大小的索引键长度限制。 对于存储的列长度,请参阅
CREATE TABLE
中的Byte Counts
。 有关键长度限制,请参阅SQL 和 XML 限制
。 任何 LOB、基于任何这些类型的单值类型或结构化类型都不能用作唯一键的一部分,即使列的长度属性足够小以适合页大小的索引键长度限制(SQLSTATE 54008)。 唯一键中的列集不能与主键或另一个唯一键的列集相同 (SQLSTATE 01543)。 如果 LANGLEVEL 为 SQL92E 或 MIA,那么会返回错误 (SQLSTATE 42891)。 已标识列的集合中的任何现有值都必须唯一 (SQLSTATE 23515)。运行检查以确定现有索引是否与唯一键定义匹配(忽略索引中的任何 INCLUDE 列)。 如果索引定义标识相同的列集而不考虑列的顺序或方向(ASC/DESC/RANDOM)规范,则索引定义匹配。 但是,对于分区表,其列不是表分区键列的超集的非唯一分区索引不被视为匹配索引。
如果发现匹配索引定义,则更改索引的描述以表明它是系统需要的,如果为非唯一索引,则在确保唯一性后更改为唯一。 如果该表具有多个匹配的索引,则将选择现有的唯一索引。 如果存在多个唯一索引,那么选择是任意的,但有一个例外:- 对于分区表,匹配唯一分区索引优于匹配唯一非分区索引或匹配非唯一索引(分区或非分区)。
- BUSINESS_TIME WITHOUT OVERLAPS
- 对于约束,BUSINESS_TIME 指示此表中的周期名称。 该周期必须存在于表中 (SQLSTATE 42727)。
BUSINESS_TIME WITHOUT OVERLAPS 指定不允许 BUSINESS_TIME 的重叠周期,对于 BUSINESS_TIME 的任何时间段,其余键的值都必须唯一。 指定 BUSINESS_TIME WITHOUT OVERLAPS 时,周期 BUSINESS_TIME 的结束列和开始列(按此列顺序)将按升序自动添加到索引键,并强制在时间上不存在任何重叠。 不能在约束中指定用于定义的 BUSINESS_TIME 的列 (SQLSTATE 428HW)。
当分区连接到具有分区 BUSINESS_TIME WITHOUT OVERLAPS 索引的范围分区应用程序周期临时表时,源表必须具有与分区 BUSINESS_TIME WITHOUT OVERLAPS 索引匹配的索引。 此外,索引上的 PERIODNAME 和 PERIODPOLICY 属性也必须匹配。
- PRIMARY KEY (column-name, ... BUSINESS_TIME WITHOUT OVERLAPS)
- 定义由已标识的列组成的主键。 每个 column-name 都必须标识该表的一列,并且同一列不能多次标识。 无法限定该名称。 已标识列的数量不得超过 64,并且它们的存储长度之和不得超过页大小的索引键长度限制。 对于存储的列长度,请参阅
CREATE TABLE
中的Byte Counts
。 有关键长度限制,请参阅SQL 限制
。 该表不能具有主键,并且已标识的列必须定义为 NOT NULL。 任何 LOB、基于任何这些类型的单值类型或结构化类型都不能用作主键的一部分,即使列的长度属性足够小以适合页大小的索引键长度限制 (SQLSTATE 54008)。 主键中的列集不能与唯一键中的列集相同 (SQLSTATE 01543)。 (如果 LANGLEVEL 为 SQL92E 或 MIA,那么会返回错误 (SQLSTATE 42891))。 已标识列的集合中的任何现有值都必须唯一 (SQLSTATE 23515)。 column-name 不能是行更改时间戳记的名称,也不能是周期的起始列或结束列 (SQLSTATE 428HW)。运行检查以确定现有索引是否与主键定义匹配(忽略索引中的任何 INCLUDE 列)。 如果索引定义标识相同的列集而不考虑列的顺序或方向(ASC/DESC/RANDOM)规范,则索引定义匹配。 但是,对于分区表,其列不是表分区键列的超集的非唯一分区索引不被视为匹配索引。
如果发现匹配索引定义,则根据系统的要求将索引的描述更改为主索引,如果为非唯一索引,则在确保唯一性后更改为唯一索引。 如果该表具有多个匹配的索引,则将选择现有的唯一索引。 如果存在多个唯一索引,那么选择是任意的,但有一个例外:- 对于分区表,匹配唯一分区索引优于匹配唯一非分区索引或匹配非唯一索引(分区或非分区)。
如果将主键添加到影子表,则主键的列必须与在 materizalized-query-definition 的 fullselect 中引用的基本表的强制主键约束或强制唯一约束的列匹配。
不能在未使用 MAINTAINED BY REPLICATION 定义的具体化查询表上创建主键。
在一个表上只能定义一个主键。
- BUSINESS_TIME WITHOUT OVERLAPS
- 对于约束,BUSINESS_TIME 指示此表中的周期名称。 该周期必须存在于表中 (SQLSTATE 42727)。
BUSINESS_TIME WITHOUT OVERLAPS 指定不允许 BUSINESS_TIME 的重叠周期,对于 BUSINESS_TIME 的任何时间段,其余键的值都必须唯一。 指定 BUSINESS_TIME WITHOUT OVERLAPS 时,周期 BUSINESS_TIME 的结束列和开始列(按此列顺序)将按升序自动添加到索引键,并强制在时间上不存在任何重叠。 不能在约束中指定用于定义的 BUSINESS_TIME 的列 (SQLSTATE 428HW)。
当分区连接到具有分区 BUSINESS_TIME WITHOUT OVERLAPS 索引的范围分区应用程序周期临时表时,源表必须具有与分区 BUSINESS_TIME WITHOUT OVERLAPS 索引匹配的索引。 此外,索引上的 PERIODNAME 和 PERIODPOLICY 属性也必须匹配。
- constraint-attributes
- 请参阅
CREATE TABLE
中的 constraint-attributes。
- ADD referential-constraint
- 定义引用约束。 请参阅
CREATE TABLE
中的 referential-constraint。 - ADD check-constraint
- 定义检查约束或函数依赖关系。 请参阅
CREATE TABLE
中的 check-constraint。- constraint-attributes
- 请参阅
CREATE TABLE
中的 constraint-attributes。
- ADD distribution-clause
- 定义分布键。 该表必须在单分区数据库分区组 (SQLSTATE 55037) 上的表空间中定义,并且必须没有分布键 (SQLSTATE 42889)。 如果存在该表的分布键,那么必须先删除现有键,然后再添加新的分布键。 不能将分布键添加到作为子表的表 (SQLSTATE 428DH)。
- DISTRIBUTE BY HASH (column-name...)
- 通过使用指定的列定义分布键。 每个 column-name 都必须标识该表的一列,并且同一列不能多次标识。 无法限定该名称。 如果列的数据类型是 BLOB、CLOB、DBCLOB、XML、任何这些类型的单值类型或结构化类型,则该列不能用作分布键的一部分。
- ADD RESTRICT ON DROP
- 指定无法删除该表,并且无法删除包含该表的表空间。
- ADD MATERIALIZED QUERY
- materialized-query-definition
- 将常规表更改为具体化查询表以在查询优化期间使用。 由 table-name 指定的表不得执行以下操作:
- 先前被定义为具体化查询表
- 是类型化表
- 定义了任何约束、唯一索引或触发器
- 引用标记为已禁用缓存的昵称
- 在另一个具体化查询表的定义中引用
- 在启用了查询优化的视图的定义中引用
如果对任何直接或间接在 materizalized-query-definition 的 fullselect 中引用的表激活了行级别或列级别访问控制,并且未对已更改的表激活行级别访问控制,那么将对已更改的表隐式激活行级别访问控制。 这将限制对具体化查询表内容的直接访问。 在定义此类行许可权之前显式引用该表的查询将返回警告:该表中不存在任何数据 (SQLSTATE 02000)。 要提供对具体化查询表的访问权,可以创建相应的行许可权,也可以输入对具体化查询表的 ALTER TABLE DEACTIVATE ROW ACCESS CONTROL 以移除行级别保护(如果适用)。
如果具体化查询表引用任何激活了行级别或列级别访问控制的表,那么必须带 SECURED 属性定义 materizalized-query-definition 的 fullselect 中引用的函数 (SQLSTATE 428EC)。
如果更改为具体化查询表的表具有任何权限(不包括系统生成的缺省权限)或在其上定义的掩码,则 ALTER 失败(SQLSTATE 428EW)。
- fullselect
- 定义该表所基于的查询。 现有表中的列必须:
- 具有相同列数
- 具有相同的数据类型
- 在相同的顺序位置中具有相同的列名
作为 fullselect 的结果列 (SQLSTATE 428EW)。 有关为具体化查询表指定 fullselect 的信息,请参阅
CREATE TABLE
。 一个额外的限制是 table-name 不能在全查询中直接或间接引用。 - refreshable-table-options
- 指定用于更改具体化查询表的可刷新选项。
- DATA INITIALLY DEFERRED
- 必须使用 REFRESH TABLE 或 SET INTEGRITY 语句来验证该表中的数据。
- 刷新
- 指示表中的数据的维护方式。
- DEFERRED
- 通过使用 REFRESH TABLE 语句以随时刷新该表中的数据。 仅当在处理 REFRESH TABLE 语句时,表中的数据才会将查询结果反映为快照。 使用此属性定义的具体化查询表不允许 INSERT、UPDATE 或 DELETE 语句 (SQLSTATE 42807)。
- IMMEDIATE
- 作为 DELETE、INSERT 或 UPDATE 的一部分对底层表所做的更改将级联到具体化查询表。 在此情况下,在任何时间点,表的内容都与处理指定的子查询时相同。 使用此属性定义的具体化查询表 (MQT) 不允许 INSERT、UPDATE 或 DELETE 语句 (SQLSTATE 42807)。 如果指定了 MAINTAINED BY SYSTEM 子句 (SQL20058N),那么不支持使用 REFRESH IMMEDIATE 选项的按列组织 MQT。
- ENABLE QUERY OPTIMIZATION
- 可以使用具体化查询表进行查询优化。
- DISABLE QUERY OPTIMIZATION
- 具体化查询表未用于优化查询。 仍可直接查询该表。
- MAINTAINED BY
- 指定具体化查询表中的数据是由系统、用户还是复制工具维护。
- SYSTEM
- 指定具体化查询表中的数据由系统维护。
- 用户
- 指定具体化查询表中的数据由用户维护。 允许该用户针对用户维护的具体化查询表运行更新、删除或插入操作。 REFRESH TABLE 语句用于系统维护的具体化查询表,不能对用户维护的具体化查询表启动此语句。 只有 REFRESH DEFERRED 具体化查询表才能定义为 MAINTAINED BY USER。
- 复制
- 指定具体化查询表中的数据由外部复制技术维护。 REFRESH TABLE 语句用于系统维护的具体化查询表,不能对复制维护的具体化查询表(称为 影子表)发出此语句。 只有 REFRESH DEFERRED 具体化查询表才能定义为 MAINTAINED BY REPLICATION,并且变更的表必须是按列组织的表。
- FEDERATED_TOOL
- 指定具体化查询表中的数据由联合复制工具维护。 REFRESH TABLE 语句用于系统维护的具体化查询表,不能对 federated_tool 维护的具体化查询表启动此语句。 只有 REFRESH DEFERRED 具体化查询表才能定义为 MAINTAINED BY FEDERATED_TOOL。
- ALTER FOREIGN KEY constraint-name
- 请更改引用约束 constraint-name 的约束属性。 constraint-name 必须标识现有的引用约束 (SQLSTATE 42704)。
- ALTER CHECK constraint-name
- 更改检查约束或函数依赖关系 constraint-name 的约束属性。 constraint-name 必须标识现有检查约束或函数依赖关系 (SQLSTATE 42704)。
- constraint-alteration
- 用于更改与引用约束或检查约束相关联的属性的选项。
- ENABLE QUERY OPTIMIZATION 或 DISABLE QUERY OPTIMIZATION
- 指定在适当的情况下能否将约束或函数依赖关系用于查询优化。
- ENABLE QUERY OPTIMIZATION
- 该约束假定为 true,并且可以用于查询优化。
- DISABLE QUERY OPTIMIZATION
- 不能将约束用于查询优化。
- ENFORCED 或 NOT ENFORCED
- 指定在插入、更新或删除等正常操作期间数据库管理器是否强制执行约束。 如果未强制执行父键,则无法将外键约束从 NOT ENFORCED 更改为 ENFORCED (SQLSTATE 42888)。
- ENFORCED
- 将约束更改为 ENFORCED。 不能对函数依赖性指定 ENFORCED(SQLSTATE 42621)。
- NOT ENFORCED
- 将约束更改为 NOT ENFORCED。
- TRUSTED
- 可信任这些数据以符合约束。 仅当表中的数据被独立地知道符合约束时,才必须使用 TRUSTED。 数据不符合该约束时,查询结果可能不可预测。 这是缺省选项。
- NOT TRUSTED
- 数据无法被信任符合约束。 NOT TRUSTED 适用于以下情况:数据符合大多数行的约束,但不能独立地知道所有行或将来的添加都符合约束。 如果约束不被信任并且启用了查询优化,那么它就不会用于运行依赖于完全符合约束的数据的优化。 只能对外键指定 NOT TRUSTED (SQLSTATE 42601)。
- ALTER column-alteration
- 修改列的定义。 仅更改指定的属性; 其他属性保持不变。 不能更改类型化表的列 (SQLSTATE 428DH)。 不能将该表定义为历史记录表 (SQLSTATE 428FR)。 不能更改在基于表达式的索引键中使用的列 (SQLSTATE 42893),除非该操作涉及以下列属性:
- 标识(通过使用 identity-alteration 下的子句)
- 缺省压缩(通过使用 COMPRESS 子句)
- 安全性(通过使用 SECURED WITH 或 DROP COLUMN SECURITY 子句)
- column-name
- 指定要改变的列的名称。 column-name 必须标识该表的现有列 (SQLSTATE 42703)。 名称不得限定。 该名称不得标识在同一 ALTER TABLE 语句中以其他方式添加、更改或删除的列 (SQLSTATE 42711)。
- SET DATA TYPE altered-data-type
- 指定列的新数据类型。 新数据类型必须可以从列的现有数据类型 (SQLSTATE 42837) 转换,除非其中一种数据类型是单值类型,在此情况下,将使用单值类型的源数据类型来确定数据类型是否可强制转型。 无法将 LOB 列变更为其他数据类型 (SQLSTATE 42837)。 无法将非 LOB 列变更为 LOB 数据类型 (SQLSTATE 42837)。
不允许将列更改为导致从现有数据中截断非空白字符的字符或图形字符串数据类型 (SQLSTATE 42837)。 同样,不允许将列更改为导致截断除十六进制零以外的字节的二进制字符串数据类型。
数据类型更改需要先进行经典表重组,然后才能完全访问表 (SQLSTATE 57016) ,但以下情况除外:- 增加 VARCHAR、VARGRAPHIC 或 VARBINARY 列的长度
- 列没有索引时,减少 VARCHAR、VARGRAPHIC 或 VARBINARY 列的长度而不截断现有数据的尾随空格
可以调用管理例程 SYSPROC.ADMIN_REVALIDATE_DB_OBJECTS 以执行表重组。 如果表处于 SET INTEGRITY PENDING 状态 (SQLSTATE 57007) ,那么不能指定需要表重组的数据类型更改。
如果该列是表分区键的列,那么不能改变字符串数据类型。
如果该列是分布键的列,那么新数据类型必须满足以下要求 (SQLSTATE 42997):- 与当前列类型具有相同数据类型
- 具有与当前列类型相同的长度,但增加 VARCHAR、VARGRAPHIC 和 VARBINARY 数据类型列的列长度时除外
- 对于 CHAR 和 VARCHAR 数据类型,不能修改为 FOR BIT DATA,反之亦然
如果数据类型是 LOB,则指定的长度属性不允许任何截断数据的可能性 (SQLSTATE 42837)。
不能更改标识列的数据类型 (SQLSTATE 42997)。
定义为 ROW BEGIN、ROW END 或 TRANSACTION START ID 的列的数据类型无法更改 (SQLSTATE 428FR)。
不能改变 BUSINESS_TIME 时间段列的数据类型和可空性 (SQLSTATE 428FR)。
该表不能启用数据捕获 (SQLSTATE 42997)。
如果满足以下任何条件,那么无法改变列的数据类型 (SQLSTATE 42893):- 该列是生成的表达式列,如果该列发生变化,那么生成的表达式列的数据将更改
- 在已生成表达式列的表达式中引用该列,并且如果更改该列,那么生成的表达式列的数据会更改
- 在检查约束中引用了该列,如果更改该列,则不满足检查约束
- 该列用于引用完整性约束,如果该列被更改,则不满足引用完整性约束
更改列不得导致所有列的总字节数超过最大记录大小 (SQLSTATE 54010)。 如果列用于唯一约束或索引,则新长度不得导致唯一约束或索引的存储长度总和超过页大小的索引键长度限制 (SQLSTATE 54008)。 对于存储的列长度,请参阅
CREATE TABLE
中的Byte Counts
。 有关键长度限制,请参阅SQL 和 XML 限制
。如果 auto_reval 设置为 DISABLED ,那么 表 2中显示了改变列的级联效应。
如果行权限或列掩码取决于更改的列(如 SYSCAT.CONTROLDEP 目录视图中记录的那样),则返回错误 (SQLSTATE 42917)。
表 2. 改变列的级联效果 操作 影响 更改由视图或检查约束引用的列 在变更处理期间将重新生成该对象。 如果更改操作后对象的视图、函数或方法解析不同,则更改对象的语义。 对于检查约束,如果对象的语义由于更改操作而改变,则操作失败。 更改具有依赖包、触发器或 SQL 例程的表中的列 该对象标记为无效,并在下次使用时重新验证。 改变已启用分解的 XSROBJECT 所引用的表中的列类型 XSROBJECT 标记为不可操作以进行分解。 重新启用 XSROBJECT 可能需要重新调整其映射;之后,针对 XSROBJECT 发出 ALTER XSROBJECT ENABLE DECOMPOSITION 语句。 更改在全局变量的缺省表达式中引用的列 在变更处理期间,将验证全局变量的缺省表达式。 如果无法解析在缺省表达式中使用的用户定义的函数,那么操作将失败。 如果该表是系统周期临时表,则该列也会在任何关联的历史表中更改。 如果表是系统周期临时表,则字符串数据类型列不能更改为需要数据截断的长度,并且数字数据类型列不能更改为较低精度的数据类型 (SQLSTATE 42837)。
- built-in-type
- 请参阅 "CREATE TABLE" 以获取内置数据类型的描述。
- SET NOT NULL
- 指定该列不能包含空值。 在表的现有行中,此列的任何值都不能为空值 (SQLSTATE 23502)。 如果在具有 DELETE 规则 SET NULL 的引用约束的外键中指定了该列,并且该外键中不存在其他可空列,那么不允许使用此子句 (SQLSTATE 42831)。
改变列的此属性需要 在允许完全表访问之前 进行经典表重组 (SQLSTATE 57016)。
如果存在取决于要更改的列的行权限或列掩码,则会发出错误 (SQLSTATE 42917)。
如果该表是系统周期临时表,则该列也会在任何关联的历史表中更改。
- SET INLINE LENGTH integer
- 更改现有结构化类型、XML 或 LOB 数据类型列的内联长度。 内联长度指示要存储在基本表行中的结构化类型、XML 或 LOB 数据类型的实例的最大大小(以字节为单位)。 无法内联存储在基本表行中的结构化类型或 XML 数据类型的实例单独存储,类似于 LOB 值的存储方式。
column-name 的数据类型必须是结构化类型、XML 或 LOB 数据类型 (SQLSTATE 42842)。
结构化类型列的缺省内联长度是其数据类型的内联长度(显式指定或在 CREATE 类型语句中缺省指定)。 如果结构化类型的内联长度小于 292,则值 292 用于列的内联长度。
只能增加显式内联长度值 (SQLSTATE 429B2);它不能超过 32673 (SQLSTATE 54010)。 对于结构化类型或 XML 数据类型列,它必须至少为 292。 对于 LOB 数据类型列,INLINE LENGTH 不得小于最大 LOB 描述符大小。
更改列不得导致所有列的总字节数超过行大小限制 (SQLSTATE 54010)。
此语句不会将已与行的其余部分分开存储的数据内联移动到基本表行中。
要利用已更改的结构化类型列的内联长度,请在更改其列的内联长度后对指定的表启动 REORG 命令。
要利用现有表中更改的 XML 数据类型列的内联长度,请使用 UPDATE 语句更新所有行。
REORG 命令对 XML 文档的行存储器没有任何影响。
要利用 LOB 数据类型列的更改的内联长度,请使用带有 LONGLOBDATA 选项的 REORG 命令或更新相应的 LOB 列。
例如:
其中,table-name 是具有已更改 LOB 数据类型列的内联长度的表,lob-column 是已更改的 LOB 数据类型列,chosen-inline-length 是为 INLINE LENGTH 选择的新值。UPDATE table-name SET lob-column = lob-column WHERE LENGTH(lob-column) <= chosen-inline-length - 4如果存在取决于要更改的列的行权限或列掩码,则返回错误 (SQLSTATE 42917)。
如果表是系统周期临时表,则内联长度更改会传播到历史表。
- SET default-clause
- 指定要更改的列的新缺省值。 该列不能已定义为已生成列 (SQLSTATE 42623)。 指定的缺省值必须表示可以根据
赋值和比较
中描述的分配规则分配给列的值。 更改缺省值不会更改与该列关联的现有行的值。 - SET EXPRESSION AS (generation-expression)
- 将列的表达式更改为指定的 generation-expression。 SET EXPRESSION 要求通过使用带有 OFF 选项的 SET INTEGRITY 语句将表置于设置完整性暂挂状态。 在 ALTER TABLE 语句之后,必须使用带有 IMMEDIATE CHECKED 和 FORCE GENERATED 选项的 SET INTEGRITY 语句来更新和检查该列中的所有值是否与新表达式相符。 该列必须已经定义为基于表达式的生成列 (SQLSTATE 42837),并且不得出现在表的 PARTITIONING KEY、DIMENSIONS 或 KEY SEQUENCE 子句中 (SQLSTATE 42997)。 generation-expression 必须符合定义已生成列时适用的相同规则。 generation-expression 的结果数据类型必须可分配给列的数据类型 (SQLSTATE 42821)。
generation-expression 不能引用为其定义了列掩码的列 (SQLSTATE 42621)。
- SET NOT HIDDEN 或 SET IMPLICITLY HIDDEN
- 指定该列的隐藏属性。
如果该表是系统周期临时表,则该列也会在任何关联的历史表中更改。
- NOT HIDDEN
- 指定该列包含在对该表的隐式引用中,并且可显式引用该列。
- IMPLICITLY HIDDEN
- 指定除非按名称显式引用该列,否则该列在 SQL 语句中不可视。 例如,假定某个表包含使用 IMPLICITLY HIDDEN 子句定义的列,那么
SELECT *的结果不包含隐式隐藏列。 但是,显式引用隐式隐藏列的名称的 SELECT 结果将该列包含在结果表中。不能对未隐藏的表的最后一列指定 IMPLICITLY HIDDEN (SQLSTATE 428GU)。
- SET generation-alteration
- 指定要更改该列的生成属性。 无论列是标识列还是行更改时间戳记列,都可以指定 GENERATED (SQLSTATE 42837)。 如果表是系统周期临时表,则关联历史表中的列不受更改的影响。 如果该列存在缺省值,则必须删除该缺省值,此操作可以通过使用 DROP DEFAULT 子句之一在同一 column-alteration 中完成。 不能对时间历史记录表的列指定 SET GENERATED (SQLSTATE 428FR)。
- GENERATED ALWAYS
- 指定当插入或更新行并且必须生成值时,数据库管理器总是为该列生成一个值。 除非正在执行数据传播或卸载和重新装入操作,否则建议使用 GENERATED ALWAYS 选项。 ALWAYS 是生成列的缺省值。
- GENERATED BY DEFAULT
- 指定数据库管理器在将行插入表或更新时为该列生成一个值,并为该列指定 DEFAULT,除非指定了显式值。 GENERATED BY DEFAULT 只能与 as-row-change-timestamp-clause 一起指定。 使用数据传播或执行卸载和重新装入操作时,建议使用 GENERATED BY DEFAULT 选项。
- identity-alteration
- 更改该列的标识属性。 该列必须是标识列。
- SET INCREMENT BY numeric-constant
- 指定标识列的连续值之间的时间间隔。 要为标识列生成的下一个值将根据应用了增量的最后一个分配值确定。 该列必须已使用 IDENTITY 属性定义 (SQLSTATE 42837)。
此值可以是可能分配给此列的任何正值或负值 (SQLSTATE 42815),并且不超过大整数常量 (SQLSTATE 42820) 的值,小数点右侧不存在非零数字 ( SQLSTATE 428FA)。
如果此值为负数,那么 ALTER 语句后面为降序序列。 如果此值为 0 或正数,那么 ALTER 语句后为升序序列。
- SET NO MINVALUE 或 MINVALUE numeric-constant
- 指定降序标识列循环或停止生成值的最小值,或升序标识列在达到最大值后循环到的值。 该列必须存在于指定的表中 (SQLSTATE 42703),并且必须已使用 IDENTITY 属性定义 (SQLSTATE 42837)。
- NO MINVALUE
- 对于升序序列,该值是原始的起始值。 对于降序序列,该值是该列的数据类型的最小值。
- MINVALUE numeric-constant
- 指定作为最小值的数字常量。 此值可以是可能分配给此列的任何正值或负值 (SQLSTATE 42815),小数点右侧不存在非零数字 (SQLSTATE 428FA),但该值必须小于或等于最大值 (SQLSTATE 42815)。
- SET NO MAXVALUE 或 MAXVALUE numeric-constant
- 指定升序标识列循环或停止生成值的最大值,或降序标识列在达到最小值后循环至的值。 该列必须存在于指定的表中 (SQLSTATE 42703),并且必须已使用 IDENTITY 属性定义 (SQLSTATE 42837)。
- NO MAXVALUE
- 对于升序序列,该值是列的数据类型的最大值。 对于降序序列,该值是原始的起始值。
- MAXVALUE numeric-constant
- 指定作为最大值的数值常数。 此值可以是可能分配给此列的任何正值或负值 (SQLSTATE 42815),小数点右侧存在非零数字 (SQLSTATE 428FA),但该值必须大于或等于最小值 (SQLSTATE 42815)。
- SET NO CYCLE 或 CYCLE
- 指定此标识列在生成其最大值或最小值后是否继续生成值。 该列必须存在于指定的表中 (SQLSTATE 42703),并且必须已使用 IDENTITY 属性定义 (SQLSTATE 42837)。
- NO CYCLE
- 指定在达到最大值或最小值之后,不会为标识列生成值。
- CYCLE
- 指定在达到最大值或最小值之后,将继续为此列生成值。 如果使用此选项,则在升序标识列达到最大值后,它会生成其最小值;或者在一个递减序列达到最小值之后,它会生成它的最大值。 标识列的最大值和最小值确定用于循环的范围。
当 CYCLE 生效时,可以为标识列生成重复的值。 虽然不是必需的,但如果需要唯一值,应通过使用标识列定义的单列唯一索引以确保唯一性。 如果此类标识列存在唯一索引,并且生成了非唯一值,那么会发生错误 (SQLSTATE 23505)。
- SET NO CACHE 或 CACHE integer-constant
- 指定是否将一些预先分配的值保留在内存中以便更快地访问。 这是一个性能和调整选项。 该列必须已使用 IDENTITY 属性定义 (SQLSTATE 42837)。
- NO CACHE
- 指定不预分配身份列的值。
在 Db2® pureScale® 环境中,如果 必须 按请求顺序生成身份值,那么必须使用 NO CACHE 选项。
如果指定了此选项,那么标识列的值将不会存储在缓存中。 在此情况下,对新身份值的每个请求都会导致对日志进行同步 I/O。
- CACHE integer-constant
- 指定预先分配并保存在内存中的标识序列的值数。 为标识列生成值时,在缓存中预分配和存储值会减少对日志的同步 I/O。
如果标识列需要新值,并且缓存中不存在未使用的值,那么分配该值需要等待对日志执行 I/O 操作。 但是,当标识列需要新值并且缓存中存在未使用的值时,通过避免对日志进行 I/O 操作,可以更快地分配该标识值。
如果数据库在正常情况下或由于系统故障而取消激活,那么所有未在已落实语句中使用的已缓存序列值都将丢失(即,从不使用这些值)。 可丢失的最大标识列值的计算方法如下:- 如果指定了 ORDER,那么最大值为对 CACHE 选项指定的值。
- 在多分区 或 Db2 pureScale中, 最大值是对 CACHE 选项指定的值乘以生成新身份值的成员数。
最小值为 2 (SQLSTATE 42815)。
在 Db2 pureScale 环境中,如果同时指定了 CACHE 和 ORDER ,那么 ORDER 的规范将覆盖 CACHE 的规范,而 NO CACHE 将生效。
- 如果指定了 ORDER,那么最大值为对 CACHE 选项指定的值。
- SET NO ORDER 或 ORDER
- 指定标识列值是否必须按请求的顺序生成。 该列必须存在于指定的表中 (SQLSTATE 42703),并且必须已使用 IDENTITY 属性定义 (SQLSTATE 42837)。
- NO ORDER
- 指定不需要按请求的顺序生成标识列值。
- ORDER
- 指定必须按照请求的顺序生成标识列值。
- RESTART 或 RESTART WITH numeric-constant
- 重新设置与标识列关联的序列的状态。 如果未指定 WITH numeric-constant,那么在最初创建标识列时,将以隐式或显式指定的值作为起始值来重新启动标识列的序列。
该列必须存在于指定的表中 (SQLSTATE 42703),并且必须已使用 IDENTITY 属性定义 (SQLSTATE 42837)。 RESTART 不会更改原始 START WITH 值。
numeric-constant 是一个精确的数字常量,可以是可以分配给该列的任何正值或负值 (SQLSTATE 42815),小数点右侧不存在非零数字 (SQLSTATE 428FA)。 将使用 numeric-constant 作为该列的下一个值。
- SET generation-attribute as-identity-clause
- 将该列更改为标识列。 无论该列具有缺省值还是已生成列,都不得指定此列更改 (SQLSTATE 42837)。 如果表是系统周期临时表,则关联历史表中的列不受更改的影响。
- GENERATED ALWAYS
- 指定当插入或更新行并且必须生成值时,数据库管理器总是为该列生成一个值。 ALWAYS 是已生成列的缺省值。
- GENERATED BY DEFAULT
- 指定数据库管理器在插入或更新行时为列生成值,并且必须生成缺省值(除非指定了显式值)。
- as-identity-clause
- 指定该列是该表的标识列。 一个表可以具有一个标识列 (SQLSTATE 428C1)。 必须仅将该列指定为不可空 (SQLSTATE 42997),与该列关联的数据类型必须是精确的数字数据类型,并且小数位为零 (SQLSTATE 42815)。 精确的数字数据类型是以下其中之一:SMALLINT、INTEGER、BIGINT、DECIMAL 或 NUMERIC,小数位数为零,或基于这些类型之一的单值类型。 有关标识选项的详细信息,请参阅
CREATE TABLE
。
- SET GENERATED ALWAYS
- 将该列更改为已生成表达式列、行起始列、行结束列或事务起始标识列。 GENERATED ALWAYS 指定当插入或更新行且必须生成值时,数据库管理器始终为该列生成值。
- AS (generation-expression)
- 指定列的定义基于表达式。 该列不能已使用生成表达式定义,不能是标识列,也不能有显式缺省值 (SQLSTATE 42837)。 generation-expression 必须符合定义生成的列时所适用的相同规则。 generation-expression 的结果数据类型必须可指定给该列的数据类型 (SQLSTATE 42821)。 不能在分布键列或多维集群 (MDC) 键中引用该列 (SQLSTATE 42997)。
generation-expression 不能引用为其定义了列掩码的列 (SQLSTATE 42621)。
- AS ROW BEGIN
- 指定每当向表中插入行或更新行中的任何列时,由数据库管理器分配该值。 该值是通过在事务中执行以下第一个事件期间使用时钟读取生成的:
- 需要为表中的行起始列或事务起始标识列分配值的数据更改语句
- 系统周期临时表中行的删除
对于系统周期临时表,数据库管理器确保跨事务的行开始列的生成值的唯一性。 可以调整时间戳记值以确保插入关联历史记录表的行的结束时间戳记值晚于开始时间戳记值 (SQLSTATE 01695)。 冲突事务更新系统周期临时表中的同一行时,可能会发生此情况。 必须将数据库配置参数 systime_period_adj 设置为 是,才能对时间戳记值进行此调整,否则将返回错误 (SQLSTATE 57062)。 如果在单个 SQL 事务中插入或更新多行并且不需要调整,则行起始列的值对于所有行都是相同的,并且不同于针对另一个事务的列生成的值。 行起始列作为 SYSTEM_TIME 周期的起始列是必需的,它是此类型生成列的预期用途。
一个表只能有一个行起始列 (SQLSTATE 428C1)。 如果未指定 data-type,那么该列将定义为 TIMESTAMP (12)。 如果指定 data-type,那么它必须是 TIMESTAMP (12) (SQLSTATE 42842)。 该列必须定义为 NOT NULL (SQLSTATE 42831)。 无法更新行起始列。
- AS ROW END
指定每当插入行或更新行中的任何列时,数据库管理器都将指定该列的数据类型的最大值。
作为 SYSTEM_TIME 周期的第二列,行结束列是必需的,这是此类型生成列的预期用途。
一个表只能有一个行结束列 (SQLSTATE 428C1)。 如果未指定 data-type,则该列定义为 TIMESTAMP(12)。 如果指定 data-type,那么它必须是 TIMESTAMP (12) (SQLSTATE 42842)。 该列必须定义为 NOT NULL (SQLSTATE 42831)。 无法更新行结束列。
- AS TRANSACTION START ID
- 指定每当向表中插入行或更新行中的任何列时,由数据库管理器分配该值。 数据库管理器为每个事务分配唯一时间戳记值或空值。 如果该列可空,并且在不需要调整该值的表中存在行起始列,那么会将空值分配给事务起始标识列。 否则,在事务中执行以下第一个事件期间,将通过读取时间时钟来生成该值:
- 需要为表中的行起始列或事务起始标识列分配值的数据更改语句
- 系统周期临时表中行的删除
系统周期临时表需要事务起始标识列,该表是此类生成列的预期用途。
一个表只能有一个事务起始标识列 (SQLSTATE 428C1)。 如果未指定 data-type,则该列定义为 TIMESTAMP(12)。 如果指定了 data-type,那么它必须是 TIMESTAMP (12)。 事务起始标识列无法更新。
- DROP DEFAULT
- 删除列的当前缺省值。 指定的列必须具有缺省值 (SQLSTATE 42837)。 此操作将传播到系统周期临时表的历史记录表。
- DROP GENERATED
- 删除列的已生成属性。 必须将该列定义为已生成列 (SQLSTATE 42837)。 该列不得定义为系统周期临时表中的行起始列、行结束列或事务起始标识列 (SQLSTATE 428FR)。
- DROP NOT NULL
- 删除该列的 NOT NULL 属性,从而允许该列具有空值。 如果在主键、表的唯一约束 (SQLSTATE 42831)、行起始列或行结束列 (SQLSTATE 42837) 中指定列,则不允许使用此子句。
改变列的此属性需要 在允许完全表访问之前 进行经典表重组 (SQLSTATE 57016)。
该表不能启用数据捕获 (SQLSTATE 42997)。 对于属于 BUSINESS_TIME 周期的列,DROP NOT NULL 会被阻止 (SQLSTATE 428FR)。
如果该表是系统周期临时表,那么还会从任何关联历史记录表中的相应列中删除 NOT NULL 属性。
如果存在取决于要更改的列的行权限或列掩码,则会发出错误 (SQLSTATE 42917)。
- ADD SCOPE
- 将范围添加到尚未定义已定义范围的现有引用类型列 (SQLSTATE 428DK)。 如果更改的表是类型化表,则该列不能从超表继承 (SQLSTATE 428DJ)。
- typed-table-name
- 类型化表的名称。 column-name 的数据类型必须是 REF(S),其中 S 是 typed-table-name 的类型(SQLSTATE 428DM)。 不会对 column-name 中的任何现有值执行任何检查,以确保这些值引用 typed-table-name 中的现有行。
- typed-view-name
- 类型视图的名称。 column-name 的数据类型必须是 REF (S),其中 S 是 typed-view-name 的类型 (SQLSTATE 428DM)。 不会对 的类型。 中的任何现有值执行任何检查,以确保这些值引用 typed-view-name 中的现有行。
- COMPRESS
- 指定是否要更有效地存储此列的缺省值。
- SYSTEM DEFAULT
- 指定系统缺省值(即,未指定特定值时用于数据类型的缺省值)将使用最小空间进行存储。 如果尚未在激活 VALUE COMPRESSION 属性的情况下设置表,则会返回警告 (SQLSTATE 01648),并且不会使用最小空间存储系统缺省值。
允许以这种方式存储系统缺省值会在对列进行插入和更新操作期间导致轻微的性能损失(因为会执行额外的检查)。
不会更改列中的现有数据。 考虑脱机表重组,以使现有数据能够使用最小空间来存储系统缺省值。
- OFF
- 指定系统缺省值将作为常规值存储在该列中。 不会更改列中的现有数据。 建议脱机重组以更改现有数据。
基本数据类型不能是 DATE、TIME 或 TIMESTAMP (SQLSTATE 42842)。 如果基本数据类型是可变长度的字符串,那么将忽略此子句。 如果使用 VALUE COMPRESSION 设置表,则会自动压缩长度为 0 的字符串值。
如果更改的表是类型化表,则该列不能从超表继承 (SQLSTATE 428DJ)。
- SECURED WITH security-label-name
- 标识与该表关联的安全策略的安全标号。 不能限定该名称 (SQLSTATE 42601)。 必须将该表与安全性关联 (SQLSTATE 55064)。 该表不能是系统周期临时表。
- DROP COLUMN SECURITY
- 更改列以使其成为不受保护的列。
- ACTIVATE ROW ACCESS CONTROL
对表激活行级别访问控制。 该表不能是类型化表、目录表 (SQLSTATE 55019)、已创建临时表、已声明临时表 (SQLSTATE 42995)、昵称 (SQLSTATE 42809)、视图 (SQLSTATE 42809) 或外部表 (SQLSTATE 42858)。 此表不能标识影子表或影子表的基本表 (SQLSTATE 428HZ)。
缺省行权限是隐式创建的,并且不允许访问表的任何行,除非具有 SECADM 权限的用户显式创建的行权限许可。
在数据操作语句中引用表时,为表创建的所有已启用行权限(包括缺省行权限)都由数据库管理器隐式应用以控制表中可访问的行集。
如果表存在触发器,则必须使用 SECURED 属性定义触发器 (SQLSTATE 55019)。
如果视图存在使用 NOT SECURED 属性定义的 INSTEAD OF 触发器,则不能在视图定义中引用该表 (SQLSTATE 55019)。
如果具体化查询表引用该表,那么必须使用 SECURED 属性来定义 materizalized-query-definition 的 fullselect 中引用的函数 (SQLSTATE 55019)。
如果具体化查询表(或暂存表)依赖于要激活行级访问控制的表(直接或间接通过视图)并且该具体化查询表(或暂存表)尚未激活行级访问控制,那么系统对该具体化查询表(或暂存表)隐式激活行级访问控制。 这将限制对具体化查询表(或暂存表)的内容的直接访问。 在定义此类行许可权之前显式引用该表的查询将返回警告:该表中不存在任何数据 (SQLSTATE 02000)。 要提供对具体化查询表(或暂存表)的访问,可以创建适当的行权限,或者可以对具体化查询表(或暂存表)发出 ALTER TABLE DEACTIVATE ROW ACCESS CONTROL 语句来根据情况移除行级别保护。
对于该表,如果已将行访问控制定义为激活,则忽略 ACTIVATE ROW ACCESS CONTROL。
如果表是系统周期临时表,数据库管理器会自动激活对历史表的行访问控制,并为历史表创建缺省行权限。
如果该表是按列组织的表,那么数据库管理器会自动激活概要表上的行访问控制,并为概要表创建缺省行权限。
- ACTIVATE COLUMN ACCESS CONTROL
对表激活列级别访问控制。 该表不能是类型化表、目录表 (SQLSTATE 55019)、已创建临时表、已声明临时表 (SQLSTATE 42995)、昵称 (SQLSTATE 42809)、视图 (SQLSTATE 42809) 或外部表 (SQLSTATE 42858)。 此表不能标识影子表或影子表的基本表 (SQLSTATE 428HZ)。
对表的访问不受限制,但是当在数据操作语句中引用该表时,对该表创建的所有已启用列掩码由数据库管理器隐式应用以屏蔽对查询的最终结果表中引用的列返回的值。
如果表存在触发器,则必须使用 SECURED 属性定义触发器 (SQLSTATE 55019)。
如果具体化查询表引用该表,那么必须使用 SECURED 属性来定义 materizalized-query-definition 的 fullselect 中引用的函数 (SQLSTATE 55019)。
如果视图存在使用 NOT SECURED 属性定义的 INSTEAD OF 触发器,则不能在视图定义中引用该表 (SQLSTATE 55019)。 如果具体化查询表依赖于要激活列级别访问控制的表(直接或间接通过视图),并且该具体化查询表尚未激活行级别访问控制,那么系统对该具体化查询表隐式激活行级别访问控制。 这将限制对具体化查询表内容的直接访问。 在定义此类行许可权之前显式引用该表的查询将返回警告:该表中不存在任何数据 (SQLSTATE 02000)。 为了提供对具体化查询表的访问,可以创建适当的行权限,或者可以对具体化查询表发出 ALTER TABLE DEACTIVATE ROW ACCESS CONTROL 语句以根据情况删除行级别保护。
如果已将列级别访问控制定义为对表激活,那么将忽略 ACTIVATE COLUMN ACCESS CONTROL 。
如果表是系统周期临时表,数据库管理器会自动激活对历史表的行访问控制,并为历史表创建缺省行权限。
如果该表是按列组织的表,那么数据库管理器会自动激活概要表上的行访问控制,并为概要表创建缺省行权限。
- DEACTIVATE ROW ACCESS CONTROL
对表停用行级别访问控制。 在数据操作语句中引用表时,数据库管理器不会应用在表上定义的任何现有启用的行权限来控制表中可访问的行集。 此表不能标识影子表或影子表的基本表 (SQLSTATE 428HZ)。
如果未对表激活行访问控制,那么将忽略 DEACTIVATE ROW ACCESS CONTROL。
- DEACTIVATE COLUMN ACCESS CONTROL
对表停用列级别访问控制。 在数据操作语句中引用表时,数据库管理器不会应用对表定义的任何现有已启用列掩码来控制对查询的最终结果表中引用的列返回的值。 此表不能标识影子表或影子表的基本表 (SQLSTATE 428HZ)。
如果未对表激活列访问控制,那么将忽略 DEACTIVATE COLUMN ACCESS CONTROL 。
- RENAME COLUMN source-column-name TO target-column-name
- 将 source-column-name 中指定的列重命名为 target-column-name 中指定的名称。 如果 auto_reval 数据库配置参数设置为 DISABLED,那么 ALTER TABLE 语句的 RENAME COLUMN 选项的行为就像它在重新验证即时语义的控制下一样。
不能将该表定义为历史记录表 (SQLSTATE 42986)。 如果该表是系统周期临时表,那么该列也会在任何关联的历史记录表中重命名。
不能重命名基于表达式的索引键中使用的列 (SQLSTATE 42893)。
- DROP PRIMARY KEY
- 删除主键的定义以及所有依赖于该主键的引用约束。 该表必须具有主键 (SQLSTATE 42888)。
- DROP FOREIGN KEY constraint-name
- 删除引用约束 constraint-name。 constraint-name 必须标识引用约束 (SQLSTATE 42704)。 有关删除引用约束的含义的信息,请参阅 注释。
- DROP UNIQUE 约束-名称
- 删除唯一约束 constraint-name 的定义,以及依赖于此唯一约束的所有引用约束。 constraint-name 必须标识现有的唯一约束 (SQLSTATE 42704)。 有关删除唯一约束的含义的信息,请参阅 注释。
- DROP CHECK constraint-name
- 删除检查约束 constraint-name。 constraint-name 必须标识对该表定义的现有检查约束 (SQLSTATE 42704)。
- DROP CONSTRAINT constraint-name
- 删除约束 constraint-name。 constraint-name 必须标识在表上定义的现有检查约束、引用约束、主键或唯一约束 (SQLSTATE 42704)。 有关删除约束的含义的信息,请参阅 注释。
- DROP COLUMN
- 从表中删除已标识列。 该表不能是类型化表 (SQLSTATE 428DH)。 该表不能启用数据捕获 (SQLSTATE 42997)。
删除列需要经典表重组 ,然后才允许完全表访问 (SQLSTATE 57016)。
仅当同时删除表中的所有其他 XML 列时,才能删除 XML 列。
DROP COLUMN 不能删除在行许可权或列掩码的定义中引用的列 (SQLSTATE 42917)。 但是,可以删除已为其定义列掩码的列。 删除该列时,也会删除该列上定义的任何列掩码。
- column-name
- 标识将删除的列。 不能对列名进行限定。 该名称必须标识指定表的一列 (SQLSTATE 42703)。 该名称不能标识表的唯一列 (SQLSTATE 42814),或在周期定义中引用的列 (SQLSTATE 42817)。 该名称不能标识未隐藏的表的最后一列 (SQLSTATE 428GU)。 该名称不能标识定义为系统周期临时表或历史记录表的表中的列 (SQLSTATE 428FR)。 该名称不能标识作为分布键、表分区键或组织维的一部分的列 (SQLSTATE 42997)。
- CASCADE
- 根据对象,指定以下操作:
- 任何依赖于所删除列的视图都将标记为不可用
- 依赖于所删除的列的任何索引、触发器、SQL 函数、约束或全局变量也会被删除
- 任何依赖于包含该列的表的已启用分解的 XSROBJECTs 都将使其无法进行分解。
- RESTRICT
- 指定如果任何视图、索引、触发器、约束或全局变量依赖于列,或者任何启用分解的 XSROBJECT 依赖于包含该列的表,则不能删除该列 (SQLSTATE 42893)。 如果在 UPDATE OF 列列表中或在触发操作中的任何位置引用了触发器,那么它将依赖于该列。 如果支持分解的 XSROBJECT 包含 XML 元素或属性到该表的映射,那么它依赖于该表。 在管理日志中标识了检测到的第一个从属对象。
表 3. 删除列的级联效果 操作 RESTRICT 效果 CASCADE 效果 删除由视图或触发器所引用的列 不允许删除该列。 将删除该对象以及依赖于该对象的所有对象。 删除索引的键中所引用的列 如果在同一 ALTER TABLE 语句中删除了该索引中引用的所有列,那么允许删除该索引。 否则,不允许删除该列。 索引被删除。 删除在唯一约束中所引用的列 如果在同一 ALTER TABLE 语句中删除了唯一约束中引用的所有列,并且该唯一约束未由引用约束引用,那么将删除这些列和约束。 (用于满足该约束的索引也会被删除)。 否则,不允许删除该列。 唯一约束以及引用该唯一约束的任何引用约束都将被删除。 (这些约束所使用的任何索引也会被删除)。 删除在引用约束中所引用的列 如果在同一个 ALTER TABLE 语句中删除了引用约束中引用的所有列,则删除列和约束。 否则,不允许删除该列。 引用约束被删除。 删除系统生成的列所引用的列,但未删除该列。 不允许删除该列。 不允许删除该列。 删除在检查约束中所引用的列 不允许删除该列。 检查约束已删除。 删除在启用了分解的 XSROBJECT 中引用的列 不允许删除该列。 XSROBJECT 标记为不可操作以进行分解。 重新启用 XSROBJECT 可能需要重新调整其映射;之后,针对 XSROBJECT 发出 ALTER XSROBJECT ENABLE DECOMPOSITION 语句。 删除在全局变量的缺省表达式中所引用的列 不允许删除该列。 全局变量被删除,除非全局变量的删除是不允许的(因为存在其他依赖于全局变量且不允许级联的对象)。 - DROP RESTRICT ON DROP
- 删除该表以及包含该表的表空间时,如果存在限制,那么将移除该限制。
- DROP DISTRIBUTION
- 删除该表的分布定义。 该表必须具有分布定义 (SQLSTATE 428FT)。 必须在单一分区数据库分区组上定义该表的表空间。
- DROP MATERIALIZED QUERY
- 更改具体化查询表,以使它不再被视为具体化查询表。 必须将由 table-name 指定的表定义为未复制的具体化查询表 (SQLSTATE 428EW)。 table-name 的列定义未更改,但是该表无法再用于查询优化,并且 REFRESH TABLE 语句也无法再使用。
如果行级别访问控制或列级别访问控制对表有效,则在表不再是具体化查询表后,此控制仍然存在。
- ADD PERIOD period-definition
- 将周期定义添加到表中。
- SYSTEM_TIME (begin-column-name, end-column-name)
定义名称为 SYSTEM_TIME 的系统周期。 在名为 SYSTEM_TIME 的表中不能有列 (SQLSTATE 42711)。 一个表只能有一个 SYSTEM_TIME 周期 (SQLSTATE 42711)。 begin-column-name 必须定义为 ROW BEGIN,end-column-name 必须定义为 ROW END (SQLSTATE 428HN)。
- BUSINESS_TIME (begin-column-name, end-column-name)
定义名称为 BUSINESS_TIME 的应用程序周期。 在名为 BUSINESS_TIME (SQLSTATE 42711) 的表中不能有列。 一个表只能有一个 BUSINESS_TIME 周期 (SQLSTATE 42711)。 begin-column-name 和 end-column-name 必须定义为 DATE 或 TIMESTAMP (p),其中 p 为 0-12 (SQLSTATE 42842),并且必须将列定义为 NOT NULL (SQLSTATE 42831)。 begin-column-name 和 end-column-name 不能标识已使用 GENERATED 子句定义的列 (SQLSTATE 428HZ)。 无法将业务周期列添加到处于设置完整性暂挂状态的表中。
已生成隐式检查约束,以确保 end-column-name 的值大于 begin-column-name 的值。 隐式创建的检查约束的名称为 DB2_GENERATED_CHECK_CONSTRAINT_FOR_BUSINESS_TIME,并且不能是现有检查约束的名称 (SQLSTATE 42710)。
- DROP PERIOD period-name
- 从表中删除已标识周期。 该名称不能标识已在此 ALTER TABLE 语句中添加或更改的周期 (SQLSTATE 42711)。 该周期(在定义周期时创建)的任何隐式生成的检查约束以及引用该周期的任何索引也将被删除。
- period-name
- 标识周期。 有效周期名称为 BUSINESS_TIME 或 SYSTEM_TIME。 该句点必须存在于表中 (SQLSTATE 4274M)。
删除 BUSINESS_TIME 周期时,该表上具有应用程序周期临时表依赖关系类型的所有包都将失效。 记录对表的依赖关系的其他依赖对象(例如,视图和触发器)也被标记为无效。
- DATA CAPTURE
- 指示是否要将用于数据复制的额外信息写入日志。
如果表是类型化表,则不支持此选项(对于根表,为 SQLSTATE 428DH,对于其他子表,为 428DR)。
- NONE
- 指示未记录任何额外信息。
- 更改
- 指示与此表的 SQL 更改相关的额外信息将写入日志。 如果复制此表并且使用 Capture 程序从日志中捕获此表的更改,那么此选项是必需的。
- 包含 LONGVAR 列
- 允许数据复制实用程序捕获对 LONG VARCHAR 或 LONG VARGRAPHIC 列所做的更改。 可对没有任何 LONG VARCHAR 或 LONG VARGRAPHIC 列的表指定该子句,因为可以更改表以包含此类列。
- ACTIVATE NOT LOGGED INITIALLY
- 激活此当前工作单元的表的 NOT LOGGED INITIALLY 属性。
在此语句更改表后同一工作单元中的 INSERT、DELETE、UPDATE、CREATE INDEX、DROP INDEX 或 ALTER TABLE 对表所做的任何更改不会被记录。 已激活 NOT LOGGED INITIALLY 属性的 ALTER 语句对系统目录所做的任何更改会被记录。 系统会记录在同一工作单元中对系统目录信息进行的任何后续更改。
当前工作单元完成时,NOT LOGGED INITIALLY 属性将被停用,后续工作单元中对表执行的所有操作会被记录。
如果您在插入数据时使用此功能来避免目录表上的锁定,请务必在 ALTER TABLE 语句中仅指定此子句。 在 ALTER TABLE 语句中使用任何其他子句会导致目录锁定。 如果没有为 ALTER TABLE 语句指定任何其他子句,那么将仅获取对系统目录表的 SHARE 锁定。 这可以大大减少在运行此语句的时间与运行此语句的工作单元结束的时间之间发生并发冲突的可能性。
如果该表是类型化表,那么此选项仅在类型化表层次结构的根表上受支持 (SQLSTATE 428DR)。
如果该表是系统周期临时表或历史记录表,那么不支持此选项。
有关 NOT LOGGED INITIALLY 属性的更多信息,请参阅 CREATE TABLE 语句中对此属性的描述。
注: 如果针对激活了 NOT LOGGED 初始属性的表发生非记录活动,并且如果语句失败 (导致回滚) 或运行 ROLLBACK TO SAVEPOINT ,那么将回滚整个工作单元 (SQL1476N)。 此外,激活了 NOT LOGGED INITIALLY 属性的表在回滚发生后被标记为不可访问,只能删除。 因此,在激活了 NOT LOGGED INITIALLY 属性的工作单元中发生错误的机会被最小化。- WITH EMPTY TABLE
- 导致移除当前表中的所有数据。 移除数据后,除非使用 RESTORE 工具,否则无法恢复。 如果发出此更改语句的工作单元回滚,则表数据不会返回到其原始状态。
请求此操作时,不会触发对受影响的表定义的 DELETE 触发器。 对于表中存在的所有索引,索引数据也会被删除。
具有连接的数据分区或逻辑上已拆离的分区的分区表无法清空 (SQLSTATE 42928)。
- PCTFREE integer
- 指定在装入 或表重组 操作期间要保留为可用空间的每个页面的百分比。 每个页面上的第一行是以无限制方式添加的。 将更多行添加到页面时,至少会将该页面的 integer % 保留为可用空间。 只有装入实用程序和表重组实用程序才会考虑 PCTFREE 值。 integer 的值可以在 0 到 99 之间。 系统目录 (SYSCAT.TABLES) 中的值为 -1 的 PCTFREE 将解释为缺省值。 对于表页,缺省 PCTFREE 值为 0。 如果该表是类型化表,那么此选项仅在类型化表层次结构的根表上受支持 (SQLSTATE 428DR)。
- LOCKSIZE
- 指示访问表时使用的锁的大小(粒度)。 在表定义中使用此选项并不会阻止正常的锁定升级发生。
如果该表是类型化表,那么此选项仅在类型化表层次结构的根表上受支持 (SQLSTATE 428DR)。
按列组织的 表不支持 LOCKSIZE 关键字 (SQLSTATE 42858)。
- ROW
- 指示使用行锁定。 这是在创建表时的缺省锁定大小。
- BLOCKINSERT
- 指示在插入操作期间使用块锁定。 这意味着插入之前获取了对块的相应互斥锁定,但未获取对所插入行的行锁定。 将单独事务插入到表中的单独单元格时,此选项很有用。 插入到相同单元格的事务仍然可以同时执行,但插入到不同的块中,如果需要更多块,这可能会影响单元格的大小。 此选项仅对 MDC 表有效 (SQLSTATE 42613)。
- TABLE
- 指示使用表锁定。 这意味着获取对表的相应共享锁定或互斥锁定,并且不使用意向锁定(意向为“无”时除外)。 对于分区表,此锁定策略将同时应用于所访问的任何数据分区的表锁定和数据分区锁定。 使用此值可以通过限制需要获取的锁定数来提高查询的性能。 但是,由于所有锁定针对整个表挂起,因此并行性也会降低。
- APPEND
- 指示数据是附加到表数据的末尾,还是放置在数据页中可用空间所在的位置。 如果该表是类型化表,那么此选项仅在类型化表层次结构的根表上受支持 (SQLSTATE 428DR)。
- ON
- 指示附加表数据,并且不保留有关页上可用空间的信息。 此表不能具有集群索引 (SQLSTATE 428CA)。
- OFF
- 指示表数据放置在可用空间中。 这是在创建表时的缺省值。
设置 APPEND OFF 后,表会重组,因为有关可用空间的信息不准确,并且可能导致插入期间的性能不佳。
- VOLATILE CARDINALITY 或 NOT VOLATILE CARDINALITY
- 向优化器指示表 table-name 的基数在运行时是否会变化很大。 易失性适用于表中的行数,而不适用于表本身。 CARDINALITY 是可选关键字。 缺省值为 NOT VOLATILE。
- VOLATILE
- 指定表 table-name 的基数在运行时可以有很大变化(从空到大)。 为了访问表,如果该索引是仅索引的(所有引用的列都在索引中),或者该索引能够在索引扫描中引用谓词,则优化器将使用索引扫描(而不是表扫描,无论统计信息如何)。 未使用列表预取访问方法来访问该表。 如果该表是类型化表,那么此选项仅在类型化表层次结构的根表上受支持 (SQLSTATE 428DR)。
- NOT VOLATILE
- 指定 table-name 的基数不是易失性的。 对该表的访问计划继续基于现有统计信息和当前优化级别。
- COMPRESS
- 指定是否将数据压缩应用于表中的行。
- YES
- 指定启用行压缩和 XML 压缩。 对表执行的插入和更新操作受压缩约束。 除非在 CREATE INDEX 语句中显式禁用,否则将对新索引启用索引压缩。 可以通过使用 ALTER INDEX 语句来压缩现有索引。改变表以启用行压缩后,可以通过运行下列其中一个操作来立即压缩表中的所有行:
- REORG 命令
- 联机表移动
- 数据卸载和重新装入
- ADAPTIVE
- 对表启用自适应压缩。 使用表级压缩字典和页级压缩字典对数据行进行压缩。 XML 存储对象中的 XML 文档将使用表级别 XML 压缩字典进行压缩。 插入或更新行时,自动创建页级别压缩字典。 添加足够的数据后,会自动为行和 XML 数据创建表级压缩字典,除非这些数据存在。
- STATIC
- 对表启用经典行压缩。 数据行需要使用表级别压缩字典进行压缩,而 XML 存储对象中的 XML 文档需要使用表级别 XML 压缩字典进行压缩。 如果行或 XML 数据没有表级别压缩字典,则在添加足够数据后将自动创建它们。
如果前面两个选项都没有与 COMPRESS YES 子句一起指定,则隐式使用 ADAPTIVE。
- 否
- 指定已禁用数据行和 XML 压缩。 在表中插入和更新的数据行和 XML 文档不再受压缩限制。 表中任何已经采用压缩格式的行和 XML 文档都将保持压缩格式,直到它们在更新时转换为非压缩格式。
对该表进行脱机重组将解压所有仍为压缩状态的行。
如果存在表级别或页级别压缩字典,那么在表重组或截断(例如,LOAD REPLACE 操作)期间将废弃这些字典。 除非在 CREATE INDEX 语句中显式启用了索引压缩,否则将对针对该表创建的新索引禁用索引压缩。 可以使用 ALTER INDEX 语句来显式禁用现有索引的索引压缩。
- VALUE COMPRESSION
- 此选项确定所要使用的行格式。 每种数据类型都有不同的字节计数,具体取决于所使用的行格式。 有关更多信息,请参阅 CREATE TABLE 语句中的
字节计数
。 更新操作会导致将现有行更改为新的行格式。建议进行脱机表重组以提高针对现有行的更新操作的性能。 这也会导致该表占用较少空间。
如果使用表中的相应计算出的行大小
列的字节计数(按数据类型列出)
(请参阅CREATE TABLE
)不再符合表中指示的行大小限制每个表空间页大小中列数和行大小的限制
,那么将返回错误 (SQLSTATE 54010)。 如果该表是类型化表,那么此选项仅在类型化表层次结构的根表上受支持 (SQLSTATE 428DR)。- ACTIVATE
- NULL 值是使用 3 个字节存储的。 如果对于除 CHAR(1) 之外的所有数据类型的列,VALUE COMPRESSION 为不活动状态,那么此值使用的存储空间相同或更少。 是否将列定义为可空对行大小计算没有任何影响。 数据类型为 VARCHAR、VARGRAPHIC、VARBINARY、CLOB、DBCLOB 或 BLOB 的列的零长度数据值将仅使用 2 个字节存储,这小于 VALUE COMPRESSION 未激活时所需的存储空间。 使用 COMPRESS SYSTEM DEFAULT 选项定义列时,这还允许使用 3 个字节的总存储空间来存储该列的系统缺省值。 用于支持这一点的行格式确定了每种数据类型的字节数,并且在更新到或从 NULL、零长度值或系统缺省值更新时往往会导致数据碎片。
- DEACTIVATE
- 存储空值时预留了空间,以便将来进行可能的更新。 对于可变长度的列,不会预留此空间。 它也不支持对列的系统缺省值进行高效存储。 如果存在具有 COMPRESS SYSTEM DEFAULT 属性的列,那么会返回警告 (SQLSTATE 01648)。
- LOG INDEX BUILD
- 指定在此表上执行创建、重新创建或重组索引操作期间要执行的日志记录级别。
- ADD PARTITION add-partition
- 将一个或多个数据分区添加至分区表。 如果指定的表不是分区表,那么将会返回错误 (SQLSTATE 428FT)。 数据分区数不得超过 32 767。
- partition-name
- 指定数据分区。 该名称不能与该表的任何其他数据分区相同 (SQLSTATE 42710)。 如果未指定此子句,那么名称将为 "PART",后跟整数值的字符格式,以使该名称对表唯一。
- boundary-spec
- 指定新数据分区的值的范围。 此范围不能与现有数据分区的范围重叠 (SQLSTATE 56016)。 有关 starting-clause 和 ending-clause 的描述,请参阅
CREATE TABLE
。如果省略了 starting-clause,那么将假定新数据分区位于表的末尾。 如果省略了 ending-clause,那么假定新数据分区在表的开头。
- IN tablespace-name
- 指定要将数据分区存储在其中的表空间。 指定表空间必须具有相同的页大小,位于同一数据库分区组中,并且以与分区表的其他表空间相同的方式管理空间 (SQLSTATE 42838)。 这可以是已经被同一张表的另一个数据分区使用的表空间,也可以是没有被该表使用的表空间,但它必须是语句的授权标识具有 USE 权限的表空间 (SQLSTATE 42727)。 如果未指定此子句,那么将使用该表的第一个可视或连接的数据分区的表空间。
- INDEX IN tablespace-name
- 指定用于存储数据分区上的分区索引的表空间。 如果未指定 INDEX IN 子句,那么数据分区上的分区索引将存储在与该数据分区相同的表空间中。
新索引分区使用的表空间(无论是缺省的还是由索引 IN 子句指定的)必须与所有其他 INDEX 分区使用的表空间的类型(SMS 或 DMS)、页大小和扩展数据块大小匹配 (SQLSTATE 42838)。
- LONG IN tablespace-name
- 指定存储长列数据的数据分区的表空间。 指定表空间必须具有相同的页大小,在同一个数据库分区组中,并且以与分区表的其他表空间和数据分区相同的方式管理空间 (SQLSTATE 42838);它必须是语句的授权标识具有 USE 权限的表空间。 指定表空间的页大小和扩展数据块大小可以不同于分区表的其他数据分区的页大小和扩展数据块大小。
有关管理将 LONG IN 子句与分区表配合使用的规则,请参阅
分区表中的大对象行为
。
- ATTACH PARTITION attach-partition
- 将另一个表作为新数据分区进行连接。 要连接的表的数据对象将成为要连接至的表的新分区。 不涉及任何数据移动。 该表处于设置完整性暂挂状态,并且引用完整性检查被推迟到执行 SET 完整性语句。 ALTER TABLE ATTACH 操作不允许使用 IN 或 LONG IN 子句。 该数据分区的 LOB 的放置是在创建源表时确定的。 有关管理将 LONG IN 子句与分区表配合使用的规则,请参阅
分区表中的大对象行为
。如果要连接的表激活了行级别访问控制或列级别访问控制,则要连接的表必须激活相同的控制。 不会自动从要连接到目标表的表中转移任何行许可权或列掩码。 列掩码和行权限不一定需要在两个表上相同,尽管从安全角度来看最好这样。 但是,如果要连接的表激活了行级别访问控制,那么要连接到的表也必须激活行级别访问控制 (SQLSTATE 428GE)。 同样,如果要连接的表激活了列级别访问控制,并且至少启用了一个列掩码对象,那么要连接到的表也必须激活列级别访问控制,并且必须对相应的列启用列掩码对象 (SQLSTATE 428GE)。
- partition-name
- 指定数据分区。 该名称不能与该表的任何其他数据分区相同 (SQLSTATE 42710)。 如果未指定此子句,那么名称将为 "PART",后跟整数值的字符形式以使该名称对表唯一。
- boundary-spec
- 指定新数据分区的值的范围。 此范围不能与现有数据分区的范围重叠 (SQLSTATE 56016)。 有关 starting-clause 和 ending-clause 的描述,请参阅
CREATE TABLE
。如果省略了 starting-clause,那么将假定新数据分区位于表的末尾。 如果省略了 ending-clause,那么假定新数据分区在表的开头。
- FROM table-name1
- 指定要用作新分区的数据源的表。 table-name1 的表定义不能具有多个数据分区,并且必须通过以下方式与已更改的表匹配 (SQLSTATE 428GE):
- 列数必须相同。
- 表中同一有序位置中的列的数据类型必须相同。
- 表中位于同一有序位置的列的可空性特征必须相同。
- 如果目标表具有行更改时间戳记列,那么源表的对应列必须是行更改时间戳记列。
- 如果数据也是分布式数据,那么必须使用相同的分布键将其分布在同一数据库分区组上。
- 如果任何一个表是使用随机生成方法的随机分布表,则另一个表也必须是一个。
- 如果任何一个表中的数据被组织,则组织必须匹配。
- 对于结构化、XML 或 LOB 数据类型,INLINE LENGTH 的值必须相同。
- 如果目标表具有已定义的 BUSINESS_TIME 周期,那么源表必须在相应列上具有已定义 BUSINESS_TIME 周期。
- BUILD MISSING INDEXES
- 指定如果源表没有对应于目标表上的分区索引的索引,那么 SET INTEGRITY 操作将在新数据分区上构建分区索引以对应于现有数据分区上的分区索引。 在连接处理期间,将删除与目标表上的分区索引不匹配的源表索引。
- REQUIRE MATCHING INDEXES
- 指定源表必须具有与目标表上的分区索引匹配的索引;否则,将返回错误 (SQLSTATE 428GE),并将有关不匹配索引的信息写入管理日志。如果未指定 REQUIRE MATCHING INDEXES 子句,并且源表上的索引与目标表上的所有分区索引都不匹配,那么会发生以下行为:
- 对于目标表中没有与源表匹配的索引,并且这些索引是使用 REJECT INVALID VALUES 定义的唯一索引或 XML 索引,ATTACH 操作失败 (SQLSTATE 428GE)。
- 对于目标表上与源表不匹配的所有其他索引,在连接操作期间,源表上的索引对象将被标记为无效。 如果源表没有任何索引,那么将创建空索引对象并将其标记为无效。 ATTACH 操作成功,但是新数据分区上的索引对象已标记为无效。 通常,SET INTEGRITY 是针对数据分区运行的下一个操作。 必要时,SET INTEGRITY 强制重建最近连接的数据分区上的索引对象。 索引重建可增加使新数据联机所需的时间。
- 系统会将有关不匹配的索引的信息写入管理日志。
- DETACH PARTITION partition-name INTO table-name1
- 将数据分区 partition-name 从已更改的表中拆离,并使用该数据分区来创建名为 table-name1 的新表。 数据分区与已改变的表断开连接,并且用于创建新表而不进行任何数据移动。 指定的数据分区不能是正在改变的表的最后一个剩余分区 (SQLSTATE 428G2)。 要更改为拆离分区的表不能是系统周期临时表 (SQLSTATE 428HZ)。
从定义了行级别访问控制或列级别访问控制的表中拆离分区时,为已拆离数据创建的新表将自动激活行级别访问控制(虽然不是列级别访问控制)以保护已拆离数据。 在为此表定义相应的行许可权或停用此表的行级别访问控制之前,对此新表的直接访问不会返回任何行。
- ADD SECURITY POLICY policy-name
- 将安全策略添加到表中。 当前服务器上必须存在该安全策略 (SQLSTATE 42704)。 该表必须尚未具有安全策略 (SQLSTATE 55065),并且不能是类型化表 (SQLSTATE 428DH)、具体化查询表 (MQT) 或暂存表 (SQLSTATE 428FG)。 此子句本身不会激活行或列的保护。 有关更多信息,请参阅 使用 LBAC 保护数据。
- DROP SECURITY POLICY
- 从表中除去安全策略和所有 LBAC 保护。 由 table-name 指定的表必须受安全策略保护 (SQLSTATE 428GT)。 如果该表具有数据类型为 DB2SECURITYLABEL 的列,那么该数据类型将更改为 VARCHAR (128) FOR BIT DATA。 如果该表具有一个或多个受保护列,那么这些列将变为不受保护。
- ADD VERSIONING USE HISTORY TABLE HISTORY-table-name
- 指定该表是系统周期临时表。 该表不能已定义为系统周期临时表或历史记录表 (SQLSTATE 428HM)。 必须在表中定义 SYSTEM_TIME 周期和事务起始标识列 (SQLSTATE 428HM)。
该表不能是具体化查询表或 按列组织的 表 (SQLSTATE 428HM)。
表中的行的历史版本将由数据库管理器保留。 数据库管理器会记录额外的信息,这些信息指示何时将行插入到表中以及何时更新或删除该行。 更新系统周期临时表中的行时,将保留该行的先前版本。 删除系统周期临时表中的数据时,会将该行的旧版本作为历史记录插入。 关联的历史记录表用于存储该表的历史记录行。
对该表的引用可以包括周期搜索条件,以指示要返回哪些系统版本的数据。
history-table-name 标识一个历史记录表,系统周期临时表的历史记录行保存在该历史记录表中。 history-table-name 必须标识存在于当前服务器上的表 (SQLSTATE 42704),并且该表不是目录表 (SQLSTATE 42832)、现有系统周期临时表、现有历史记录表、已声明全局临时表、已创建全局临时表、具体化查询表或视图 (SQLSTATE 428HX)。已标识的历史记录表不能包含标识列、行更改时间戳记列、行起始列、行结束列、事务起始标识列、已生成表达式列或包含周期 (SQLSTATE 428HX)。
系统周期临时表和已标识历史记录表必须具有相同的列数和顺序 (SQLSTATE 428HX)。 这两个表的对应列的以下属性必须相同 (SQLSTATE 428HX):- 列名
- 列数据类型
- 列长度(包括内联 LOB 长度)、精度和小数位
- 字符串列的列 FOR BIT 属性
- 列空属性
- 列隐藏属性
如果对系统周期临时表激活了行访问控制或列访问控制,并且未对历史记录表激活行访问控制,那么数据库管理器将自动激活对历史记录表的行访问控制,并为历史记录表创建缺省行许可权。
- DROP VERSIONING
- 指定该表不再是系统周期临时表。 该表必须是系统周期临时表 (SQLSTATE 428HZ)。 不再记录和维护该表的历史数据。 不会更改该表的列和数据的定义,但该表不再被视为系统周期临时表。 SYSTEM_TIME 周期将保留。 引用该表的后续查询不能对该表指定 SYSTEM_TIME 周期规范。 系统周期临时表与关联的历史记录表之间的关系已移除。 不会删除历史记录表,并且历史记录表的内容不受影响。
使用 DROP VERSIONING 更改表时,该表上具有系统周期临时表依赖关系类型的所有包都将失效。 记录对表的依赖关系的其他依赖对象(例如,视图和触发器)也被标记为无效。
规则
- 对表定义的任何强制唯一键或主键约束都必须是分布键的超集(如果存在)(SQLSTATE 42997)。
- 主键或唯一键不能是维的子集 (SQLSTATE 429BE)。
- 只能在单个 ALTER TABLE 语句中的一个 ADD、ALTER 或 DROP COLUMN 子句中引用一列 (SQLSTATE 42711)。
- 如果表有任何依赖于该表的具体化查询表,则不能更改列长度、数据类型或隐藏属性,也不能删除该列 (SQLSTATE 42997)。
- 如果表具有为依赖于表的查询优化启用的任何视图,则无法更改列长度 (SQLSTATE 42997)。
- 该表必须置于设置完整性暂挂状态,方法是在之前使用带有 OFF 选项的 SET INTEGRITY 语句 (SQLSTATE 55019):
- 添加具有已生成表达式的列
- 更改列的已生成表达式
- 将列更改为具有生成的表达式
- 无法将现有列变更为类型 DB2SECURITYLABEL (SQLSTATE 42837)。
- 如果表未与安全策略关联,那么定义类型为 DB2SECURITYLABEL 的列的操作将失败 (SQLSTATE 55064)。
- 不能更改或删除类型为 DB2SECURITYLABEL 的列 (SQLSTATE 42817)。
- 如果存在依赖于该表的 MQT,那么将该表标记为受保护的 ALTER TABLE 操作将失败 (SQLSTATE 55067)。
- 如果源表和目标表没有使用相同的安全策略进行保护,没有相同的行安全标签列,并且没有相同的一组受保护列,则将分区连接到受保护的分区表会失败 (SQLSTATE 428GE)。
- 如果在表分区键中引用了生成的列,那么无法更改生成的列表达式 (SQLSTATE 42837)。
- 不能在 materialized-query-definition 的 fullselect 中指定 isolation-clause (SQLSTATE 42601)。
- 如果异步索引清理尚未完成删除分区的索引条目,则在拆离相同的分区名称后,将数据分区添加或连接到分区表会失败并显示 SQL0612N (SQLSTATE 42711)。
注意
- ALTER TABLE 语句所产生的更改影响现有数据的行格式时,会发生 REORG 建议的操作。 发生此情况时,将限制对表执行的大多数后续操作,直到 表重组操作 成功完成为止 (SQLSTATE 57016)。 可以对单个工作单元中的表运行多个 REORG 建议 ALTER TABLE 操作,这些操作可以在同一语句中运行,也可以分布在多个语句中。 这被认为是一个 REORG 建议操作。 例如,删除单个 ALTER TABLE 语句中的两列或删除同一工作单元中两个语句中的两列将被视为单个 REORG 建议操作。 必须完成经典脱机表重组之前,最多可以有三个包含 REORG 建议操作的工作单元 (SQLTATE 55019)。 从 SYSIBMADM.ADMINTABINFO 列 reorg_pending 和 num_reorg_rec_alters。
- 以下是导致版本更改并将该表置于 REORG 暂挂状态的 REORG 建议 ALTER 语句的完整列表:
- DROP COLUMN
- ALTER COLUMN SET NOT NULL
- ALTER COLUMN DROP NOT NULL
- ALTER COLUMN SET DATA TYPE,以下情况除外:
- 增大 VARCHAR 或 VARGRAPHIC 列的长度
- 缩短 VARCHAR 或 VARGRAPHIC 列的长度,而不截断现有数据中的尾部空格(该列没有索引时)
- 成功执行 REORG 建议操作后,允许执行以下表操作:
- ALTER TABLE。 但是,不允许执行以下操作 (SQLSTATE 57007):
- ADD CHECK CONSTRAINT
- ADD REFERENTIAL CONSTRAINT
- ADD UNIQUE CONSTRAINT
- DROP TABLE
- RENAME TABLE
- REORG TABLE
- TRUNCATE TABLE
- 表数据的表扫描访问
- ALTER TABLE。 但是,不允许执行以下操作 (SQLSTATE 57007):
- 更改表以使其成为具体化查询表会将表置于设置完整性暂挂状态。 如果表定义为 REFRESH IMMEDIATE,则必须先使表脱离设置的完整性暂挂状态,然后才能对全查询引用的表启动 INSERT、DELETE 或 UPDATE 命令。 通过使用带有 IMMEDIATE CHECKED 选项的 REFRESH TABLE 或 SET INTEGRITY,可以使该表脱离设置完整性暂挂状态,从而根据全查询完全刷新该表中的数据。 如果表中的数据准确反映了全查询的结果,那么可以使用 SET INTEGRITY 的 IMMEDIATE UNCHECKED 选项来使该表脱离设置完整性暂挂状态。
- 更改表以将其更改为 REFRESH IMMEDIATE 具体化查询表将导致对该全查询所引用的表使用 INSERT、DELETE 或 UPDATE 用法的任何包失效。
- 将表更改为从具体化查询表更改为常规表将导致任何依赖于该表的包无效。
- 将表改变为从 MAINTAINED BY FEDERATED_TOOL 具体化查询表更改为常规表不会导致复制工具的预订设置中发生任何更改。 因为对 MAINTAINED BY SYSTEM 具体化查询表的后续更改会导致复制工具失败,所以您必须在更改 MAINTAINED BY FEDERATED_TOOL 具体化查询表时更改预订设置。
- 如果延迟具体化查询表与暂存表相关联,那么当具体化查询表变更为常规表时,会删除该暂存表。
- 在处理所有其他子句之前处理 ADD 列子句。 其他子句将按指定顺序进行处理。
- 通过改变表操作添加的任何列不会自动添加到该表的任何现有视图中。
- 将数据分区添加或连接至分区表或将数据分区与分区表断开连接会导致依赖于该表的任何包失效。
- 从数据分区表拆离数据分区后,当该分区在逻辑上已拆离并且拆离操作未完成时,SYSCAT.DATAPARTITIONS 目录中已拆离分区的状态可能为 'L'。 如果已拆离的分区的 STATUS 为 'L',那么无法对源表执行下列操作 (SQLSTATE 55057):
- 添加尝试创建非分区索引的唯一键约束或主键约束
- 添加、删除或重命名列
- 激活值压缩或压缩
- 停用值压缩或压缩
- 要删除某个表的分区,必须先删除该表,然后重新创建该表。
- 要删除表的组织,必须先删除该表,然后重新创建该表。
- 为唯一或主键约束自动创建索引时,数据库管理器会尝试使用指定的约束名称作为具有与表的模式名称匹配的模式名称的索引名称。 如果这与现有索引名称匹配或未指定约束名称,则在 SYSIBM 模式中使用系统生成的名称创建索引,该名称是 "SQL" 加上由 15 个数字字符(由基于时间戳记的函数生成)组成的序列。
- 在具有已连接的数据分区的分区表上创建非分区索引时,该索引不包括已连接的数据分区中的数据。 使用 SET INTEGRITY 语句来维护所有连接的数据分区的所有索引。
- 当您在存在已连接的数据分区 (SYSCAT.DATAPARTITIONS 中的 STATUS 为 "A") 的情况下创建分区索引时,还会为每个已连接的数据分区创建一个索引分区。 如果分区索引被创建为唯一索引,或者是使用 REJECT INVALID VALUES 创建的 XML 索引,则在连接的数据分区包含任何违规(唯一索引存在重复或对 XML 索引无效的值)时,索引创建可能会失败。
- 如果表具有非分区索引,则不能在与创建分区的添加或连接操作相同的事务中访问该表中的新数据分区,如果该事务没有以独占模式锁定表 (SQLSTATE 57007)。
- 针对表 T 的 DELETE 操作可能涉及的任何表被认为与 T 之间存在删除连接。 因此,如果表是 T 的从属项,或者它是从 T 级联删除的表的从属项,那么该表与 T 之间存在删除连接。
- 如果记录直接通过包中的语句在 T 中插入(更新/删除),或者通过包运行的约束或触发器间接插入(以某个语句的身份),则该包对表 T 使用了插入(更新/删除)。 同样,如果列由包中的语句直接修改,或者通过由包运行的约束或触发器间接修改(以某个语句的身份),那么该包对该列使用更新。
- 在联合系统中,通过使用透明 DDL 创建的远程基本表可以被更改。 但是,透明 DDL 确实会对可以进行的修改施加一些限制:
- 可以通过添加新列或仅指定主键来更改远程基本表。
- 透明 DDL 所支持的特定子句包括:
- ADD COLUMN column-definition
- column-options 子句中的 NOT NULL 和 PRIMARY KEY
- ADD unique-constraint(仅 PRIMARY KEY)
- 您无法对远程基本表中的现有列指定注释。
- 无法变更或删除远程基本表中的现有主键。
- 改变远程基本表将使依赖于与该远程基本表相关联的昵称的任何包失效。
- 远程数据源必须支持正在通过 ALTER TABLE 语句请求进行的更改。 根据数据源响应它不支持的请求的方式,可能会返回错误或忽略请求。
- 如果尝试改变未使用透明 DDL 创建的远程基本表,那么将返回错误。
- 对主键、唯一键或外键的任何更改(无论是隐式还是显式)都可能对包、索引和其他外键产生以下影响:
表 4. 对键的更改,以及它们对包、索引和其他外键的影响 操作 对包、索引和其他外键的影响 已添加主键或唯一键 不会对包、外键或现有唯一键产生任何影响。 (如果主键或唯一键使用在先前版本中创建且未转换为支持延迟唯一性的现有唯一索引,那么将转换该索引,并且对关联表进行更新的包将失效。) 主键或唯一键已删除 - 如果该索引是针对约束自动创建的,那么将删除该索引。 任何依赖于索引的包都将失效。
- 如果该索引已转换为约束的唯一索引,并且不再需要该索引,那么它将设置回非唯一索引。 任何依赖于索引的包都将失效。
- 如果该索引是用于约束的现有唯一索引,那么该索引将设置为不再需要系统。 不会对包产生任何影响。
- 如果表的主键或唯一约束是其列集在关联影子表的选择列表中的最后一个强制主键或唯一约束,则不能删除该表的主键或唯一约束。
- 如果表有关联的影子表,则不能删除主键或唯一约束,关联影子表的主键取决于要删除的约束。
- 删除所有从属外键。 将对每个从属外键执行进一步操作,如下一行中所指定。
外键被添加、删除、从 NOT ENFORCED 更改为 ENFORCED,或从 ENFORCED 更改为 NOT ENFORCED - 对该对象表使用插入的所有包都将失效。
- 对外键中至少一列使用更新的所有包都将失效。
- 对父表使用删除的所有包都将失效。
- 对父键中至少一列使用更新的所有包都将失效。
外键或函数依赖关系已从 ENABLE QUERY OPTIMIZATION 更改为 DISABLE QUERY OPTIMIZATION 出于优化目的而对约束具有依赖关系的所有包都将失效。 - 将列添加到表将导致对已更改的表使用插入的所有包失效。 如果添加的列是表中第一个用户定义的结构化类型列,那么对改变的表使用 DELETE 的包也将失效。
- 将检查或引用约束添加至存在且未处于设置完整性暂挂状态的表,或者将现有检查或引用约束从 NOT ENFORCED 更改为 ENFORCED(对于未处于设置完整性暂挂状态的现有表)将导致立即根据约束对表中的现有行求值。 如果验证失败,那么将返回错误 (SQLSTATE 23512)。 如果某个表处于设置完整性暂挂状态,那么添加检查或引用约束或者将约束从 NOT ENFORCED 更改为 ENFORCED 不会立即导致强制实施该约束。 发出带有 IMMEDIATE CHECKED 选项的 SET INTEGRITY 语句以开始强制实施约束。
- 添加、更改或删除检查约束会导致以下所有包失效,这些包对该对象表使用插入、对约束中涉及的至少一个列使用更新或者使用查询(使用约束来提高性能)。
- 添加分布键将使以下所有包,这些包对分布键的至少一个列使用更新。
- 缺省情况下定义的分发键不受删除主键和添加其他主键的影响。
- 删除列或更改其数据类型将从正在变更的表中移除所有 runstats 信息。 再次可访问 runstats 后,必须对该表运行 runstats。 如果该表不包含显式删除的列,那么将保留该表的统计概要文件。
- 更改列(以更改其长度、数据类型、可空性或隐藏属性)或删除列会使引用(直接或间接通过引用约束或触发器)其表的所有包无效。
- 更改列(以更改其长度、数据类型、可空性或隐藏属性)会重新生成依赖于其表的视图(类型化视图除外)。 如果在重新生成此类视图时发生问题,那么会返回错误 (SQLSTATE 56098)。 任何依赖于该表的类型化视图都将标记为不可用。
- 更改列(以更改其长度、数据类型或隐藏属性)将所有相关触发器和 SQL 函数标记为无效;它们在下次使用时被隐式重新编译。 如果在重新生成此类对象时发生问题,那么会返回错误 (SQLSTATE 56098)。
- 准备或绑定涉及触发器或 SQL 函数的语句时,更改列(以更改其长度、数据类型或可空性属性)可能会在处理触发器或 SQL 函数时导致错误 (SQLSTATE 54010)。 如果基于转换变量和转换表列的长度总和的行大小太长,则会发生这种情况。 如果删除了此类触发器或 SQL 函数,则随后尝试重新创建它会返回错误 (SQLSTATE 54040)。
- 必须删除并重新创建在早期版本中创建的 WLM 活动事件监视器,以添加由此修订包和任何后续修订包或发行版引入的新表列。
- 更改结构化或 XML 类型的列以增加内联长度会使引用该表的所有包无效,无论是直接还是通过引用约束或触发器间接引用该表。
- 更改结构化或 XML 类型的列以增加内联长度会重新生成依赖于表的视图。
- 仅当将 XML 列添加到表中或使用联机表移动迁移表时,才能对表的 XML 存储对象创建压缩字典。
- 更改表的 LOCKSIZE 会导致所有依赖于已更改表的包失效。
- 更改 VOLATILE 或 NOT VOLATILE CARDINALITY 会导致依赖于已更改表的所有动态 SQL 语句无效。
- 复制: 增加列的长度或更改列的数据类型时请务必谨慎。 与应用程序表关联的变更数据表可能已达到或接近行大小限制。 变更数据表必须在应用程序表之前进行更改,或者必须在同一工作单元内对两个表进行更改,以确保两个表都可以完成更改。 应考虑副本,这些副本也可能处于或接近行大小限制,或者位于无法增加现有列长度的平台上。
如果在 Capture 程序处理具有已更改属性的日志记录之前未更改变更数据表,则 Capture 程序可能会失败。 如果在维护副本的预订运行之前未更改包含已更改列的副本,则预订可能会失败。
- 从受保护的表拆离分区时,由数据库服务器自动创建的目标表将以保护源表的相同方式进行保护。
- 更改表以使其成为具有行级别粒度的受保护表时,依赖于此类表的任何已缓存的动态 SQL 部分都将失效。 同样地,任何依赖于此类表的包也会失效。
- 当表 T 的列更改为受保护的列时,依赖于表 T 的任何缓存动态 SQL 部分都将失效。 同样,任何依赖于表 T 的包也会失效。
- 表 T 的列被更改为非受保护列时,任何依赖于表 T 的缓存动态 SQL 部分都将失效。 同样,任何依赖于表 T 的包也会失效。
- 对于表中的现有行,在执行添加行安全标号列的 ALTER 语句时,安全标号列的值缺省为会话授权标识的写访问的安全标号。
- 添加具体化查询: 基本表被改变为具体化查询表时,在创建新的具体化查询表时,以相同的方式派生基于标签的访问控制安全属性(安全策略、列安全标号和行安全标号列)。 如果已更改的基本表已具有基于标签的访问控制安全性属性,那么在派生过程中会考虑这些属性,如下所示:
- 列访问控制:列的现有安全标号将与从定义具体化查询表的查询派生的相应安全标号一起汇总。
- 行访问控制:行访问控制属性的设置方式与新具体化查询表的设置方式完全相同。
- 在 Db2 版本 9.7 修订包 1 或更高发行版中,将对新的多维集群 (MDC) 表块索引进行分区。 将数据分区添加到数据分区多维集群 (MDC) 表会为新分区创建相应的空索引分区,包括 MDC 块索引。 此外,对于每个 MDC 块索引和每个分区索引,将向 SYSCAT.SYSINDEXPARTITIONS 添加一个新的索引分区条目。
- 将数据分区连接到使用 Db2 V9.7 修订包 1 或更高发行版创建的分区 MDC 表时, attach-partition 指定的源表可以是非分区 MDC 表或单分区分区 MDC 表。
- 如果源表是非分区表: ATTACH 操作完成后,源表上的 MDC 块索引将被继承并成为新分区的分区 MDC 索引。
- 如果源表已分区: 如果源表是使用 Db2 V9.7 修订包 1 或更高发行版创建的分区 MDC 表,那么块索引已分区。 块索引将成为分区上的新块索引。
- 如果在低于 Db2 V9.7 修订包 1 的级别创建源分区 MDC 表,那么该表的块索引是非分区索引。 在 ATTACH 操作期间,块索引被删除并创建为类似于源表上其他分区索引的分区索引。
要使连接的分区联机,需要对目标表发出 SET INTEGRITY 语句。
如果指定了 REQUIRE MATCHING INDEXES 子句,并且目标表是在 Db2 V9.7 修订包 1 或更高发行版中创建的分区 MDC 表,那么 ALTER TABLE ... ATTACH PARTITION 语句失败并返回 SQL20307N (SQLSTATE 428GE)。 移除 REQUIRE MATCHING INDEXES 子句将允许连接过程继续。
如果在低于 Db2 V9.7 修订包 1 的级别创建了目标分区 MDC 表,那么块索引是非分区索引。 在 ATTACH 操作期间,将删除源 MDC 表的块索引。 要使连接的分区联机,需要对目标表发出 SET INTEGRITY 语句。 将连接分区中的新行添加到现有非分区块索引。
- 从低于 Db2 V9.7 修订包 1 的级别创建的数据分区 MDC 表拆离数据分区时,块索引是非分区索引。 下列限制适用:
- 在与拆离操作相同的工作单元中,不允许对新拆离的表进行访问。
- 在拆离操作中创建的目标表上的块索引在落实拆离操作后第一次访问该表时重建。 如果源表在拆离操作之前具有任何分区索引,那么目标表的索引对象将被标记为无效,以允许重新创建块索引。 因此,在重新创建块索引和所有其他分区索引时,访问时间将增加。
当您从使用 Db2 V9.7 修订包 1 或更高发行版创建的分区 MDC 表拆离分区时,将对块索引进行分区,并且先前的限制不适用。 假设不存在其他从属对象(例如,从属 MQT),则允许在同一工作单元中访问新拆离的表。 所有分区索引(包括块索引),都成为目标表上的索引,无需重新创建。
- 隐式隐藏列的注意事项: 可以在 ALTER TABLE 语句中显式引用定义为隐式隐藏项的列。 例如,可以更改隐式隐藏列,或将其指定为引用约束、检查约束或具体化查询表定义的一部分。
更改表以使其某些列隐式隐藏可能会影响与该表一起使用的数据移动实用程序的行为。 当表包含隐式隐藏列时,IMPORT、INGEST 和 LOAD 等实用程序要求您指定隐藏列的数据是否包含在操作中。 例如,这可能意味着在更改表之前成功运行的装入操作现在将失败 (SQLCODE SQL2437N)。 同样,导出操作需要您指定该操作是否包括隐藏列的数据。
在处理包含隐式隐藏列的表时,数据移动实用程序必须使用 DB2_DMU_DEFAULT 注册表变量,或者 implicitlyhiddeninclude 或 implicitlyhiddenmissing 文件类型修饰符。
- 显式激活的行访问控制:使用 ACTIVATE ROW ACCESS CONTROL 子句来激活表的行访问控制。 发生这种情况时,将隐式创建缺省行许可权,并且不允许访问表中的任何行,除非安全性管理员显式创建的行许可权允许。 缺省行许可权始终处于启用状态。
在数据操作语句中引用该表时,为该表创建的所有启用的行权限(包括缺省行权限)由数据库管理器隐式应用以控制表中的哪些行是可访问的。 通过将逻辑
OR运算符应用于每个已启用的行许可权中的搜索条件,可以派生出行访问控制搜索条件。 在处理任何用户指定的操作(如谓词、分组、排序)之前,此派生搜索条件充当表的过滤器。 此派生搜索条件允许权限定义中指定的授权标识访问表中的某些行。使用 ACTIVATE ROW ACCESS CONTROL 子句时,所有引用该表的包和动态缓存的语句都将失效。
使用 DEACTIVATE ROW ACCESS CONTROL 子句停止实施行访问控制之前,行访问控制将保持为已实施状态。
- 对表激活行访问控制时创建的隐式对象:使用 ACTIVATE ROW ACCESS CONTROL 子句来激活表的行访问控制时,数据库管理器会隐式创建该表的缺省行许可权。 缺省行许可权阻止对该表的所有访问。 隐式创建的行许可权驻留在基本表的同一模式中,并且具有 SYS_DEFAULT_ROW_PERMISSION__table-name ... 格式的名称, 最多 128 个字符。 请注意 "PERMISSION" 后面的两个下划线。 如果此名称不唯一,那么将保留最后 4 个字符以用于唯一编号 "nnnn",其中 "nnnn" 是一个以 "0000" 开头的 4 个字母数字字符串,并且每次递增 1 直到找到唯一名称为止。
缺省的行许可权的所有者是 SYSIBM。 缺省行许可权始终处于启用状态。 停用行访问控制或删除表时,会删除缺省行许可权。
- 激活列访问控制: ACTIVATE COLUMN ACCESS CONTROL 子句用于激活对表的列级别访问控制。 对该表的访问不受限制,但当在数据操作语句中引用该表时,将应用对该表创建的所有已启用列掩码以屏蔽最终结果表中引用的列值。
当使用列掩码来屏蔽列值时,它们将确定最终结果表中的值。 如果列具有列掩码并且该列(特别是对列名的简单引用或嵌入在表达式中的列)出现在最外层的选择列表中,则列掩码将应用于该列以生成对应最终结果表的值。 如果该列没有出现在最外层的选择列表中,但它参与了最终结果表(例如,它出现在具体化表表达式或视图中),那么列掩码将按以下方式应用于列:掩码值包含在具体化表表达式或视图的结果表中,以便可以在最终结果表中使用。
列掩码的应用不会干扰语句中其他子句的操作,例如,WHERE、GROUP BY、HAVING、SELECT DISTINCT 和 ORDER BY。 最终结果表中返回的行保持不变,只是结果行中的值可能已被列掩码屏蔽。 因此,如果屏蔽列也出现在 ORDER BY sort-key 中,则顺序基于原始列值,最终结果表中的屏蔽值可能不会反映该顺序。 同样,掩码值可能无法反映 SELECT DISTINCT 强制执行的唯一性。
在以下上下文中应用了列掩码:- SELECT 或 SELECT INTO 语句的一个或多个最外层 SELECT 子句,或者(如果该列未出现在最外层选择列表中但它参与最终结果表)出现该列的对应的具体化表表达式或视图的一个或多个最外层 select 子句
- SELECT FROM INSERT、SELECT FROM UPDATE 或 SELECT FROM DELETE 操作的最外层 SELECT 子句。
- 用于为 INSERT、UPDATE 或 MERGE 语句或 SET transition-variable-name 赋值语句派生新值的最外层 SELECT 子句。 相同的屏蔽适用于出现在前面提到的语句的最外层 SELECT 子句中 SET host-variable 赋值语句、VALUES INTO 语句或 VALUES 语句的右侧的标量全查询表达式。
当掩码列出现在以下上下文中时,不会应用列掩码:- WHERE 子句。
- GROUP BY 子句。
- HAVING 子句。
- SELECT DISTINCT。
- ORDER BY 子句。
- 填充 EXPLAIN 表时,不会强制实施行和列访问控制: 可以对 EXPLAIN 表强制实施行和列访问控制。 但是,当数据库管理器将行插入到这些表中时,不会应用已启用的行许可权和列掩码。
- 填充事件监视器表时,不会强制实施行和列访问控制: 可对事件监视器表强制实施行和列访问控制。 但是,当数据库管理器将行插入到这些表中时,不会应用已启用的行许可权和列掩码。
- 填充临时历史记录表时,不会强制执行行和列访问控制: 可对时间历史记录表强制实施行和列访问控制。 但是,数据库管理器就针对系统周期临时表的操作访问这些表时,不会应用已启用的行许可权和列掩码。
- 停止实施行或列访问控制: DEACTIVATE ROW ACCESS CONTROL 子句用于停止对表强制实施行访问控制。 缺省行许可权已删除。 此后,在数据操作语句中引用该表时,不会应用显式创建的行许可权。
DEACTIVATE COLUMN ACCESS CONTROL 子句用于停止对表强制实施列访问控制。 此后,当在数据操作语句中引用该表时,不会应用列掩码。
显式创建的行许可权或列掩码(如果有)仍保留但无效。
停用行访问控制或列访问控制时,引用该表的所有包和动态缓存语句都将失效。
- 用于行和列访问控制的安全触发器: 触发器用于数据库完整性,因此,需要在行访问控制和列访问控制(安全性)与数据库完整性之间进行平衡。 已启用的行许可权和列掩码未应用于转换变量和转换表的初始值。 对于触发器主体中引用的任何转换变量或转换表,也会忽略对触发表实施的行和列访问控制。 要确保触发器操作中的 SQL 语句在访问转换变量和转换表中的敏感数据时不存在安全问题,必须使用 SECURED 选项创建或更改触发器。 如果触发器不安全,那么无法对触发表强制实施行和列访问控制 (SQLSTATE 55019)。
- 用于行和列访问控制的安全用户定义函数: 如果行许可权或列掩码定义引用了用户定义的函数,那么必须使用 SECURED 选项来改变该函数,因为敏感数据可能会作为参数传递至该函数。 如果在数据操作语句中引用了用户定义的函数,并且引用了强制实施行或列访问控制的表,并且该函数参数引用了此类表中的列,那么如果该函数不安全,那么会影响访问方案选择并可能产生较差的性能。 数据库管理器将 SECURED 选项视为声明用户已针对用户定义的函数的所有更改建立更改控制审计过程的断言。 假设这样的控制审计程序已经到位,并且所有后续的 ALTER FUNCTION 语句或对外部包的更改都正在通过该审计过程进行审查。
- 行和列访问控制不适用的数据库操作: 行访问控制和列访问控制不能损害数据库完整性。 主键、唯一键、索引、检查约束和引用完整性中涉及的列不得受行和列访问控制。 可以为这些列定义列掩码,但在密钥构建或约束或 RI 实施过程中不会应用它们。
- 定义系统周期临时表: 系统周期临时表定义包含以下方面:
- 名为 SYSTEM_TIME 的系统周期,它是通过使用行开始列和行结束列来定义的。 请参阅 AS ROW BEGIN、AS ROW END 和 period-definition 的描述。
- 事务起始标识列。 请参阅 AS TRANSACTION START ID 的描述。
- 使用 ADD 版本控制操作在后续 ALTER TABLE 语句上指定的系统周期数据版本控制定义,其中包括关联历史表的名称。 请参阅 ALTER TABLE 下的 ADD VERSIONING 子句的描述。
- 定义应用程序周期临时表: 应用周期临时表定义包括一个名为 BUSINESS_TIME 的应用周期。 应用程序周期是通过使用开始列和结束列来定义的,两列都具有相同的数据类型,即 DATE 或 TIMESTAMP(p)。 请参阅 period-definition 的描述。
更新或删除行时,对应用程序周期临时表的数据更改操作可能会导致自动插入一到两个额外行。 针对该行表示的周期的一部分指定更新或删除应用程序周期临时表中的行时,该行被更新或删除,并自动插入一行或两行以表示该行的未更改部分。 对于因为针对表的更新或删除操作而自动插入的每一行,对应用程序周期临时表中每个已生成列生成新值。 如果已生成列被定义为唯一键或主键、引用约束中的父键或唯一索引的一部分,则自动插入可能会违反约束或索引,在这种情况下会返回错误。
- 事务起始标识列的注意事项: 如果列允许空值,存在行起始列,并且行起始列的值不同于为其他事务生成的行起始列值,那么事务起始标识列包含空值。 由于该列可能包含空值,因此建议在从该列检索值时使用下列其中一种方法:
- COALESCE (transaction_start_id_col, row_begin_col)
- CASE WHEN transaction_start_id_col IS NOT NULL THEN transaction_start_id_col ELSE row_begin_col END
- 系统周期临时表以及行访问控制和列访问控制的注意事项: 可对系统周期临时表和关联历史记录表定义行访问控制和列访问控制。
- 访问系统周期临时表时,针对系统周期临时表定义的任何行访问规则和列访问规则都将应用于从系统周期临时表返回的所有行,无论这些行是存储在系统周期临时表还是历史记录表中。 不会应用对历史记录表定义的行访问规则和列访问规则。
- 直接访问历史记录表时,将应用对历史记录表定义的行访问规则和列访问规则。
- 按列组织的 表的注意事项: 可以指定以下选项来变更 按列组织的 表定义 (带下划线的选项为缺省值):
- ALTER COLUMN <column-name> SET {NOT HIDDEN | IMPLICITLY HIDDEN}
- ACTIVATE NOT LOGGED INITIALLY
- ACTIVATE/DEACTIVATE COLUMN ACCESS CONTROL
- ACTIVATE/DEACTIVATE ROW ACCESS CONTROL
- ADD COLUMN,除非有一个未完成的异步后台进程正在创建表的列压缩字典 (SQL20054N)
- ADD {PRIMARY KEY | UNIQUE} [ENFORCED | NOT ENFORCED]
- ADD CONSTRAINT <constraint-name> CHECK NOT ENFORCED(与 {ENABLE | DISABLE} QUERY OPTIMIZATION 配合使用时)
- ADD CONSTRAINT <constraint-name> {PRIMARY KEY | UNIQUE | FOREIGN KEY NOT ENFORCED}
- ADD MATERIALIZED QUERY
- ADD RESTRICT ON DROP
- DROP GENERATED
- DROP {PRIMARY KEY | UNIQUE | CONSTRAINT} <constraint-name>
- DROP MATERIALIZED QUERY
- DROP RESTRICT ON DROP
- LOG INDEX BUILD {NULL | OFF | ON}
- DATA CAPTURE NONE
- SET GENERATED [ALWAYS | BY DEFAULT]
- ALTER COLUMN <column name> SET DATA TYPE(仅增大 VARCHARGRAPHIC 列长度)
- SET DEFAULT
- 随机分布表的注意事项
- 不支持改变该表以使其成为具体化查询表
- 使用随机生成方法的随机分布表的注意事项
- 不支持以下选项来更改随机分布键列定义(除了那些已不支持非随机分布表中分布键列的选项):
- ALTER COLUMN <column-name> SET NOT HIDDEN
- ALTER COLUMN <column-name> DROP NOT NULL
- ALTER COLUMN <column-name> DROP GENERATED
- ALTER COLUMN <column-name> COMPRESS {OFF | SYSTEM DEFAULT}
- RENAME COLUMN <column-name>
- 不能使用 ALTER TABLE DROP DISTRIBUTION 语句来删除随机分布。
- 不支持以下选项来更改随机分布键列定义(除了那些已不支持非随机分布表中分布键列的选项):
- 替代语法:以下替代语法不是标准语法。 支持这些语法,以便与早期产品版本或其他数据库产品兼容。
- 对于以下项,ADD 关键字是可选的:
- 未命名的 PRIMARY KEY 约束
- 未命名的引用约束
- 名称跟在短语 FOREIGN KEY 后面的引用约束
- 可以从定义引用子句的 column-definition 中省略 CONSTRAINT 关键字
- 可以在 FOREIGN KEY 后面指定 constraint-name(不带 CONSTRAINT 关键字)
- 可以指定 SET SUMMARY AS 代替 SET MATERIALIZED QUERY AS
- 只能指定将具体化查询设置为定义以代替 DROP MATERIALIZED QUERY
- 可指定 SET MATERIALIZED QUERY AS (fullselect) 以代替 ADD MATERIALIZED QUERY (fullselect)
- 可指定 ADD PARTITIONING KEY 以代替 ADD DISISTRIBUTE BY HASH;在此情况下还可以指定可选 USING HASHING 子句
- 可指定 DROP PARTITIONING KEY 以代替 DROP DISTRIBUTION
- LONG VARCHAR 和 LONG VARGRAPHIC 数据类型仍受支持,但已停用并且不建议使用,尤其是对于可 移植应用程序而言。
- 可使用逗号来分隔 identity-alteration 子句中的多个选项
- 可指定 PART 以代替 PARTITION
- 可指定 VALUES 以代替 ENDING AT
- 可分别指定 NOMINVALUE、NOMAXVALUE、NOCYCLE、NOCACHE 和 NOORDER 以代替 NO MINVALUE、NO MAXVALUE、NO CYCLE、NO CACHE 和 NO ORDER
- 可以指定 DROP EXPRESSION 代替 DROP GENERATED 以删除列的已生成表达式属性。
- 可以指定 DROP IDENTITY 代替 DROP GENERATED 以删除列的标识属性。
- 当您指定日期时间专用寄存器的值时,可以指定 NOW() 来代替 CURRENT_TIMESTAMP。
- 对于以下项,ADD 关键字是可选的:
- 当 ALTER TABLE 语句使现有 VIEW 无效时,无效 VIEW 的统计信息概要文件为空白。
示例
- 将名为 RATING 的列(长度为 1 个字符)添加到 DEPARTMENT 表。
ALTER TABLE DEPARTMENT ADD RATING CHAR(1) - 将名为 SITE_NOTES 的列添加到 PROJECT 表。 将 SITE_NOTES 创建为可变长度列,最大长度为 1000 个字节。 该列的值没有关联的字符集,因此不能转换。
ALTER TABLE PROJECT ADD SITE_NOTES VARCHAR(1000) FOR BIT DATA - 假设存在一个名为 EQUIPMENT 的表,其中定义了以下列:
将引用约束添加到 EQUIPMENT 表,以使所有者 (EQUIP_OWNER) 必须是 DEPARTMENT 表中存在的部门号 (DEPTNO)。 DEPTNO 是 DEPARTMENT 表的主键。 如果从 DEPARTMENT 表中移除一个部门,则该部门拥有的所有设备的所有者 (EQUIP_OWNER) 值应变为未赋值(或设置为空)。 将约束命名为 DEPTQUIP。Column Name Data Type EQUIP_NO INT EQUIP_DESC VARCHAR(50) LOCATION VARCHAR(50) EQUIP_OWNER CHAR(3)ALTER TABLE EQUIPMENT ADD CONSTRAINT DEPTQUIP FOREIGN KEY (EQUIP_OWNER) REFERENCES DEPARTMENT ON DELETE SET NULL此外,还需要一个额外的列来记录与该设备记录相关的数量。 除非另有指定,否则 EQUIP_QTY 列应该具有值 1,并且绝不能为空。ALTER TABLE EQUIPMENT ADD COLUMN EQUIP_QTY SMALLINT NOT NULL DEFAULT 1 - 改变表 EMPLOYEE。 添加名为 REVENUE 的检查约束,以使每个员工的工资和佣金总额必须大于 30,000 美元。
ALTER TABLE EMPLOYEE ADD CONSTRAINT REVENUE CHECK (SALARY + COMM > 30000) - 改变表 EMPLOYEE。 删除先前定义的约束 REVENUE。
ALTER TABLE EMPLOYEE DROP CONSTRAINT REVENUE - 改变表以记录缺省格式的 SQL 更改。
ALTER TABLE SALARY1 DATA CAPTURE NONE - 改变表以记录以扩展格式进行的 SQL 更改。
ALTER TABLE SALARY2 DATA CAPTURE CHANGES - 更改 EMPLOYEE 表以添加四个具有缺省值的新列。
缺省值在指定缺省值时使用各种函数名。 因为 MEASURE 是基于 INTEGER 的单值类型,所以使用了 MEASURE 函数。 由于 MEASURE 的源类型不是 BLOB 或日期时间数据类型,因此可能在未指定函数的情况下指定了 HEIGHT 列缺省值。 由于 BIRTHDATE 是基于 DATE 的单值类型,因此使用 DATE 函数(此处不能使用 BIRTHDATE)。 对于 FLAGS 和 PHOTO 列,即使 PHOTO 是单值类型,也会使用 BLOB 函数指定缺省值。 要为 BIRTHDAY、FLAGS 和 PHOTO 列指定缺省值,必须使用函数,因为该类型是 BLOB 或源自 BLOB 或日期时间数据类型的单值类型。ALTER TABLE EMPLOYEE ADD COLUMN HEIGHT MEASURE DEFAULT MEASURE(1) ADD COLUMN BIRTHDAY BIRTHDATE DEFAULT DATE('01-01-1850') ADD COLUMN FLAGS BLOB(1M) DEFAULT BLOB(X'01') ADD COLUMN PHOTO PICTURE DEFAULT BLOB(X'00') - 已对名为 CUSTOMERS 的表定义以下列:
Column Name Data Type BRANCH_NO SMALLINT CUSTOMER_NO DECIMAL(7) CUSTOMER_NAME VARCHAR(50)在此表中,主键由 BRANCH_NO 列和 CUSTOMER_NO 列组成。 要分发该表,您需要为该表创建分布键。 必须在单节点数据库分区组上的表空间中定义该表。 主键必须是分布键列的超集,并且至少必须将主键的其中一个列用作分布键。 使 BRANCH_NO 成为分布键,如下所示:ALTER TABLE CUSTOMERS ADD DISTRIBUTE BY HASH (BRANCH_NO) - 已使用透明 DDL 在联合系统中创建远程表 EMPLOYEE。 更改远程表 EMPLOYEE 以添加 PHONE_NO 和 WORK_DEPT 列;此外,在现有列 EMP_NO 和新列 WORK_DEPT 上添加主键。
ALTER TABLE EMPLOYEE ADD COLUMN PHONE_NO CHAR(4) NOT NULL ADD COLUMN WORK_DEPT CHAR(3) ADD PRIMARY KEY (EMP_NO, WORK_DEPT) - 更改 DEPARTMENT 表以添加函数依赖项 FD1,然后从 DEPARTMENT 表中删除函数依赖项 FD1。
ALTER TABLE DEPARTMENT ADD CONSTRAINT FD1 CHECK ( DEPTNAME DETERMINED BY DEPTNO) NOT ENFORCED ALTER TABLE DEPARTMENT DROP CHECK FD1 - 将 EMPLOYEE 表中 WORKDEPT 列的缺省值更改为 123。
ALTER TABLE EMPLOYEE ALTER COLUMN WORKDEPT SET DEFAULT '123' - 将安全策略 DATA_ACCESS 与表 EMPLOYEE 相关联。
ALTER TABLE EMPLOYEE ADD SECURITY POLICY DATA_ACCESS - 更改表 EMPLOYEE 以保护 SALARY 列。
ALTER TABLE EMPLOYEE ALTER COLUMN SALARY SECURED WITH EMPLOYEESECLABEL - 假定您有一个名为 SALARY_DATA 的表,该表是使用以下列定义的:
更改此表以允许将薪水存储在 DECIMAL(6,2) 列中,使 PROMOTION_DATE 成为可设置为空值的可选字段,并删除 EMP_POSITION 列。Column Name Data Type ----------- --------- EMP_NAME VARCHAR(50) NOT NULL EMP_ID SMALLINT NOT NULL EMP_POSITION VARCHAR(100) NOT NULL SALARY DECIMAL(5,2) PROMOTION_DATE DATE NOT NULLALTER TABLE SALARY_DATA ALTER COLUMN SALARY SET DATA TYPE DECIMAL(6,2) ALTER COLUMN PROMOTION_DATE DROP NOT NULL DROP COLUMN EMP_POSITION - 将名为 DATE_ADDED 的列添加至表 BOOKS。 此列的缺省值为当前的时间戳记。
ALTER TABLE BOOKS ADD COLUMN DATE_ADDED TIMESTAMP WITH DEFAULT CURRENT TIMESTAMP - 将具有基于标签的访问控制安全性属性的表更改为具体化查询表。 基本表 tt1 和 tt2 存在,并且是使用以下 SQL 创建的:
可以将表 tt2 变更为具有以下 SQL 的具体化查询表:CREATE TABLE tt1 (c1 INT SECURED WITH C, c2 DB2SECURITYLABEL) SECURITY POLICY P; CREATE TABLE tt2 (c3 INT SECURED WITH B, c4 DB2SECURITYLABEL) SECURITY POLICY P;
表 tt2 成为具有安全策略 P 的具体化查询表。 tt2.c3 具有安全标号 P.B。tt2.c4 具有安全标号 P.C,并且它也是 DB2SECURITYLABEL。ALTER TABLE tt2 ADD (SELECT * FROM tt1 WHERE c1 > 10) DATA INITIALLY DEFERRED REFRESH DEFERRED;
