Oracle Database 20c:区块链表_Java

在昨天的文章中,向大家介绍了如何创建云端的Oracle Database 20c环境,感兴趣的小伙伴,可以免费注册Oracle云服务(cloud.oracle.com)获得300美金的免费额度,并创建属于自己的云端20c数据库环境。今天我们就用上一篇文章创建好的DB20c来学习区块链表的一些功能和特性。

第一步:查看我们的实验环境

通过观察,我们看到,当前数据库的版本是20.2.0.0.0,里面有一个我们之前创建好的PDB名字叫做DB0215_PDB1。

Oracle Database 20c:区块链表_Java_02

第二步:了解区块链表

区块链表是仅提供插入功能和满足限制条件才可删除的表,它将行组织成许多链。除了第一行之外,链中的每一行都使用加密散列链接到链中的前一行。区块链表中的行是防篡改的。每一行都包含一个密码散列值,该散列值基于该行中的数据和链中的前一行的散列值。如果一行被篡改,该行的哈希值将发生变化,这将导致链中的下一行的哈希值发生变化。为了增强欺诈保护,可以将可选的用户签名添加到行中。如果您对区块链表行进行签名,则必须使用数字证书。在验证区块链表中的链时,数据库需要证书来验证行签名。可以对区块链表进行索引和分区。您可以控制是否以及何时从区块链表中删除行。您还可以控制是否可以删除区块链表。在事务和查询中,可以将区块链表与(常规)表一起使用。

  • 关于区块链表的保留时间或者说是删除策略:在使用 CREATE BLOCKCHAIN TABLE语句创建区块链表的时候,可以指定NO DROP或者NO DROP UNTIL n DAYS IDLE。

    1、NO DROP 表示区块链表不可以被删除。

    2、NO DROP UNTIL n DAYS IDLE表示最新的一条记录如果是n天之前的,那么这个表才可以被删除,n的最小值是16,可以通过alter table语句来增加这个值,但不能缩小这个值。

  • 关于区块链表中记录的保留策略:在使用CREATE BLOCKCHAIN TABLE语句创建区块链表的时候,可以指定NO DELETE来设定区块链表中的记录保留时间。可以设定为NO DELETE [LOCKED]或者NO DELETE UNTIL n DAYS AFTER INSERT [LOCKED]。

    1、如果设定为NO DELETE,表示记录不能从区块链表中删除。

    2、如果要确保区块链表中的记录永远不被删除,请使用NO DELETE LOCKED子句。LOCKED关键字指定无法修改记录保留设置。

    3、NO DELETE UNTIL n DAYS AFTER INSERT [LOCKED]:记录不能被删除,除非最近一条记录是n天之前插入的。这个时间最少是16天,与上面说的一样,可以通过alter table语句对这个值进行修改,但这种修改只限于增加而不能减少。如果使用了LOCKED,那么日后将不能修改记录的保留策略。

  • 区块链表的一些限制:在区块链表当中,如下操作将不被支持。

    更新和合并行

    添加列、删除列和重命名列

    截断区块链表

    删除分区

    更新操作的 BEFORE ROW triggers(允许使用其他触发器)

    Direct-path加载

    使用并行DML插入数据

    将常规表转换为区块链表,反之亦然

    XA事务

第三步:创建区块链表及区块链分区表

我们首先创建一个普通的区块链表,名字叫做BOA,有几个普通的字段。然后表的删除策略设定为31天,记录的策略设定为不可删除。

Oracle Database 20c:区块链表_Java_03

我们也可以创建区块链分区表,这表的删除策略是16天idle。记录的删除策略是被插入30天之后。

Oracle Database 20c:区块链表_Java_04

第四步:修改区块链表

我们在上面介绍了区块链表的一些限制,所以这里说的修改指的是修改区块链表的保留策略。当然,即便是保留策略的修改也是受到限制的,只能增加不能缩小。比如我们修改刚才创建的两个区块链表,将他们的保留时间增长。

Oracle Database 20c:区块链表_Java_05

第五步:验证区块链表中的数据

防止篡改是区块链表的关键特性,我们可以使用下面的存储过程来验证区块链表中的数据。

DBMS_BLOCKCHAIN_TABLE.VERIFY_ROWS

在验证之前,我们先向刚刚创建的普通区块链表加入3条记录。Oracle Database 20c:区块链表_Java_06

然后通过DBMS_BLOCKCHAIN_TABLE.VERIFY_ROWS验证表中的数据,在验证的时候,您可以将instance id或者chain id或者是记录创建时间作为过滤条件。

Oracle Database 20c:区块链表_Java_07

第六步:删除区块链表中符合条件的记录

如我们之前所说,区块链表中的数据可以设定删除策略,满足删除条件的数据是可以被删除的。下面的语句是要删除HENRY.BOA当中所有的记录,但因为不满足条件,所以最后的删除结果是0条记录被删除。

Oracle Database 20c:区块链表_Java_08

我们也可以按照创建时间进行删除,比如下面的例子当中,删除HENRY.BOA表当中,2020-02-14之前创建的记录。因为目前没有满足条件的记录,所以删除结果为0。

Oracle Database 20c:区块链表_Java_09

第七步:删除区块链表

按照我们之前所说,区块链表也是可以被删除的,但是需要满足区块链表的删除策略,这些策略是您在创建区块链表或者后续修改区块链表的属性时设定的。删除区块链表的语法非常简单,和之前的删除表的语法一样,需要的权限也是一样。因为我们的区块链表不满足删除条件,所以下面报错是正常的。

Oracle Database 20c:区块链表_Java_10

第八步:与区块链表相关的数据字典

可以通过查询下面的数据字典,了解区块链表的相关讯息。

DBA_BLOCKCHAIN_TABLES,

ALL_BLOCKCHAIN_TABLES, 

USER_BLOCKCHAIN_TABLES

Oracle Database 20c:区块链表_Java_11

除此之外,您还可以为数据库添加数字证书及签名,来进一步提升区块链表的安全级别。

关于区块链表,我们就介绍到这里,您可以来到Oracle Database 20c官方文档获取更多资讯。

Oracle Database 20c:区块链表_Java_12

相关文章:官宣:Oracle Database 20c(预览版)云端上线