1,背景
在oracle19(或oracle21)里面,
在官方的介绍中,immutable不可变表和blockchain区块链表是放在一起的,看上去不可变表就是防篡改等级稍弱于区块链表的一种存在。
官方文档 :https://docs.oracle.com/en/database/oracle/oracle-database/21/admin/managing-tables.html
看不懂英文的,可以参考一下eygle大佬的这篇文章Oracle 21c 新特性:不可变表 Immutable tables 主要是提高安全性;
首先,我先用Oracle官网的例子建了一个不可变表:
CREATE IMMUTABLE TABLE trade_ledger (id NUMBER, luser VARCHAR2(40), value NUMBER)
NO DROP
NO DELETE;
要想使用到这个特性,需要将数据库的 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 19c
alter system set compatible='19.11.0' scope=spfile;
# Oracle Database 21c
alter system set compatible='21.0.0' scope=spfile;
shutdown immediate;
startup;
2,重点关注
LightDB在2023RP4版本里面,将支持IMMUTABLE功能,
语法如下:CREATE IMMUTABLE TABLE TABLENAME ....... [{NO DELETE}{NO UPDATE}{ NO DROP}{NO TRUNCATE} ]......
如上的[{NO DELETE}{NO UPDATE}{ NO DROP}{NO TRUNCATE} ]可以组合使用;
备注:当指定了immutable表之后,以上四个NO...权限选项必须要至少有一个;
2.1)NO DELETE的使用:
如上(在oracle模式下,下同),我们使用create immutable table immutable2(id int) no delete;
创建了一个immutable2的table,并插入了2条数据,然后我们来执行delete操作:
不管是delete指定数据还是delete表,均无法删除;
2.2)NO UPDATE的使用:
如上,我们使用create immutable table immutable3(id int) no update;
创建了一个immutable3的table,并插入了3条数据,然后我们来执行update操作:
不管是update指定数据还是update表,均无法删除;
同时,对该Immutable表指定no update时,该表也将禁止进行alter操作;
2.3)NO DROP的使用:
如上,我们使用create immutable table immutable4(id int) no drop;
创建了一个immutable4的table,并插入了3条数据,然后我们来执行drop操作:
指定了no drop的immutable表,无法进行drop操作;
2.4)NO TRUNCATE的使用:
如上,我们使用create immutable table immutable5(id int) no truncate;
创建了一个immutable5的table,并插入了3条数据,然后我们来执行truncate操作:
指定了no truncate的immutable表,无法进行truncate操作;
2.5)[{NO DELETE}{NO UPDATE}{ NO DROP}{NO TRUNCATE} ]的组合使用:
2.5.1)NO TRUNCATE与NO UPDATE的组合使用:
如上,我们使用create immutable table immutable6(id int,id2 int) no truncate no update并插入了数据;
指定了no truncate&no update的immutable表,无法进行truncate与update操作;
2.5.2)NO TRUNCATE,NO UPDATE,NO DELETE,NO DROp的组合使用:
如上,我们使用create immutable table immutable7(id int,id2 int) no truncate no update no delete no drop并插入了数据;
上图可以看到,oracle模式下,指定了no truncate no update no delete no drop的immutable表,均无法进行以上操作。