不可变表

许多安全系统包含的记录必须能够证明不会受到更改的影响。行和块校验和等保护策略会产生高开销。此外,对于数据库管理员或其他具有足够权限的用户进行的未经授权的更改(无论是有意还是无意),这些方法并非万无一失。

不可变表只能插入,无论用户权限如何,都无法修改其中的现有数据。禁止更新行值和删除行。还禁止对表元数据进行某些更改(例如,重命名表列),以防止试图规避这些限制。从外部源获取数据的扁平表或外部表不能设置为不可变。

可以使用 ALTER TABLE 将现有表定义为不可变表:

ALTER TABLE table SET IMMUTABLE ROWS;

一旦设置,表不变性将无法恢复,并立即应用于所有现有的表数据,以及此后加载的所有数据。为了修改不可变表的数据,必须将数据复制到新表,例如,使用 COPYCREATE TABLE...ASCOPY_TABLE

当对表执行 ALTER TABLE...SET IMMUTABLE ROWS 时,Vertica 会在系统表 TABLES 中为该表设置两列。这两列一起显示该表何时变为不可变表:

  • immutable_rows_since_timestamp:应用不变性时的服务器系统时间。对于长期时间戳检索和高效比较,这很重要。
  • immutable_rows_since_epoch:应用不变性时的当前时期。此设置可以帮助保护表不会尝试预插入具有未来时间戳的记录,以便该行的时期小于表的不变性时期。

强制

禁止对不可变表执行以下操作:

当目标表不可变时,不允许使用以下分区管理函数:

允许的操作

通常,可以对不影响现有行数据的不可变表执行任何 DML 操作,例如,使用 COPYINSERT 添加行。将数据添加到不可变表后,将无法更改。

其他允许的操作通常分为两类: