Oracle 21c 的区块链表,是最受关注的个性,然而还有一个小个性,很少有人提及,那就是 Immutable tables - 不可变表。

区块链表是在 21c 中引入的,而后向后移植到 19.10,不可变表同时被引入到 Oracle 21.3 和 19.11 中,因而它能够被认为是 19c 和 21c 的新个性。

参数设置

要想应用到这个个性,须要将数据库的 compatible 参数设置 19.11.0 之上(请事后评估这个参数的影响)。

否则会收到如下报错:

ERROR at line 1: ORA-00406: COMPATIBLE parameter needs to be 19.11.0.0.0 or greater ORA-00722: Feature "Immutable table" compatible string 19.0.0

例如:

# Oracle Database 19calter system set compatible='19.11.0' scope=spfile;# Oracle Database 21calter system set compatible='21.0.0' scope=spfile;shutdown immediate;startup;

次要个性

不可变表继承了 Blockchain Table 的类似语法,然而去掉了外部行记录的链接,进步了性能。
对于不可变表的次要益处如下:

不可变表是只读表,可避免内部人员未经受权的数据批改和人为谬误导致的意外数据批改。

能够防备受感化或歹意员工进行的未经受权的批改。

能够向不可变表增加新行,但不能批改现有行。

必须为不可变表和不可变表中的行指定保留期。在指定的行保留期之后,即将过期。只能从不可变表中删除过期的行。

不可变表蕴含系统生成的暗藏列。列与区块链表的列雷同。插入一行时,会为 ORABCTAB_CREATION_TIME$ 和 ORABCTAB_USER_NUMBER$ 列设置一个非 NULL 值。其余系统生成的暗藏列的值设置为 NULL。

应用不可变表不须要更改现有应用程序。

范例

以下是创立 Immutable Table 的范例:

CREATE IMMUTABLE TABLE mogdb (id NUMBER, duser VARCHAR2(40), value NUMBER)NO DROP UNTIL 40 DAYS IDLENO DELETE UNTIL 100 DAYS AFTER INSERT;

以下是在墨天轮 Oracle 21c Express 版本的实训环境中所做的测试:

bash-4.4$ sqlplus / as sysdbaSQL*Plus: Release 21.0.0.0.0 - Production on Tue Nov 9 12:43:31 2021Version 21.3.0.0.0Copyright (c) 1982, 2021, Oracle.  All rights reserved.Connected to:Oracle Database 21c Express Edition Release 21.0.0.0.0 - ProductionVersion 21.3.0.0.0SQL> show pdbs;    CON_ID CON_NAME              OPEN MODE  RESTRICTED---------- ------------------------------ ---------- ----------     2 PDB$SEED              READ ONLY  NO     3 XEPDB1              READ WRITE NOSQL> alter session set container=XEPDB1;Session altered.SQL> CREATE IMMUTABLE TABLE mogdb (id NUMBER, duser VARCHAR2(40), value NUMBER)       NO DROP UNTIL 40 DAYS IDLE           NO DELETE UNTIL 100 DAYS AFTER INSERT;    Table created.SQL> insert into mogdb values(1,'zCloud',100);1 row created.SQL> insert into mogdb values(2,'openGauss',200);1 row created.SQL> commit;Commit complete.SQL> select * from mogdb;    ID DUSER                     VALUE---------- ---------------------------------------- ----------     1 zCloud                       100     2 openGauss                       200SQL> update mogdb set value=300;update mogdb set value=300       *ERROR at line 1:ORA-05715: operation not allowed on the blockchain or immutable table

数据保护

只有当数据超过保留期限,能力从不可变表中删除行。

以下示例以 SYS 身份连贯时,删除不可变表 trade_ledger 中保留窗口之外的所有行。删除的行数存储在输入参数 num_rows 中。

DECLAREnum_rows NUMBER;BEGINDBMS_IMMUTABLE_TABLE.DELETE_EXPIRED_ROWS(‘EXAMPLES’,‘TRADE_LEDGER’, NULL, num_rows);DBMS_OUTPUT.PUT_LINE('Number_of_rows_deleted = ’ || num_rows);END;/

以下示例以 SYS 身份连贯时,删除在以后零碎日期之前 30 天创立的过期行。删除的行数存储在输入参数 num_rows 中。

DECLAREnum_rows NUMBER;BEGINDBMS_IMMUTABLE_TABLE.DELETE_EXPIRED_ROWS(‘EXAMPLES’,‘TRADE_LEDGER’, SYSDATE-30, num_rows);DBMS_OUTPUT.PUT_LINE(‘Number_of_rows_deleted=’ || num_rows);END;/

当尝试批改不可变表的数据时,你会收到相似如下的谬误提醒:

SQL Error: ORA-05715: operation not allowed on the blockchain or immutable table

如果不可变表为空或在其保留期定义的一段时间内未修改,则能够删除不可变表。

例如:

DROP TABLE examples.trade_ledger;