不可变表
许多安全系统包含的记录必须能够证明不会受到更改的影响。行和块校验和等保护策略会产生高开销。此外,对于数据库管理员或其他具有足够权限的用户进行的未经授权的更改(无论是有意还是无意),这些方法并非万无一失。
不可变表只能插入,无论用户权限如何,都无法修改其中的现有数据。禁止更新行值和删除行。还禁止对表元数据进行某些更改(例如,重命名表列),以防止试图规避这些限制。从外部源获取数据的扁平表或外部表不能设置为不可变。
可以使用 ALTER TABLE 将现有表定义为不可变表:
ALTER TABLE table SET IMMUTABLE ROWS;
一旦设置,表不变性将无法恢复,并立即应用于所有现有的表数据,以及此后加载的所有数据。为了修改不可变表的数据,必须将数据复制到新表,例如,使用 COPY、CREATE TABLE...AS 或 COPY_TABLE。
当对表执行 ALTER TABLE...SET IMMUTABLE ROWS 时,Vertica 会在系统表 TABLES 中为该表设置两列。这两列一起显示该表何时变为不可变表:
- immutable_rows_since_timestamp:应用不变性时的服务器系统时间。对于长期时间戳检索和高效比较,这很重要。
- immutable_rows_since_epoch:应用不变性时的当前时期。此设置可以帮助保护表不会尝试预插入具有未来时间戳的记录,以便该行的时期小于表的不变性时期。
强制
禁止对不可变表执行以下操作:
- UPDATE
- DELETE
-
ALTER TABLE...ADD COLUMN,其中新列使用 SET USING 子句进行定义。
当目标表不可变时,不允许使用以下分区管理函数:
允许的操作
通常,可以对不影响现有行数据的不可变表执行任何 DML 操作,例如,使用 COPY 或 INSERT 添加行。将数据添加到不可变表后,将无法更改。
提示
表的不可变性可以使某些在不可变表上允许的操作变得毫无意义。例如,您可以使用 ALTER TABLE...ADD COLUMN 将列添加到不可变表。但是,新列中的所有值都设置为 NULL(除非该列是使用 DEFAULT 值定义的),并且它们无法更新。其他允许的操作通常分为两类:
-
对表的 DDL 的更改对其数据没有影响:
-
ALTER TABLE...SET SCHEMA:更改表架构。
-
ALTER TABLE...OWNER TO:转移表所有权。
-
ALTER TABLE...ALTER COLUMN...SET DATATYPE:更改列的数据类型。仅当列数据类型更改对列的存储数据没有影响时,才允许进行列数据类型更改。
-
-
对多个表行或整个表的块操作: