Oracle 区块链表创建过程详解


本文整理自网络,侵删。

大家好!我是只谈技术不剪发的 Tony 老师。

Oracle 21c 增加了一个非常强大的新功能:原生的区块链表(Blockchain Table)。Oracle 区块链表是一个具有防篡改功能的表,只能插入数据,同时提供了表级和行级的保留期限。区块链表中的所有行构成了一个数据链,每一行存储了当前数据和前一个哈希值的哈希值。

Oracle 区块链技术可以有效防范数据库欺诈,利用区块链的防篡改特性,用户可以为金融交易、监管链、法定保全、托管服务、审计日志以及许多其他使用场景下的集中式总账提供安全保护。

本文给大家一下如何创建和使用 Oracle 区块链表,以及相关的注意事项。如果觉得文章有用,欢迎评论📝、点赞👍、推荐🎁

📝Oracle 区块链表功能也可以在 Oracle 19.10 版本中使用,不过需要应用 patch 32431413 补丁,并且将 COMPATIBLE 参数设置为 19.10。从 Oracle 19.11 版本开始不再需要应用补丁。

创建区块链表

我们可以使用 CREATE BLOCKCHAIN TABLE 命令创建区块链表,同时可以指定三个选项。

其中,NO DROP 子句决定了什么时候允许删除区块链表,如果表中没有任何数据的话可以被删除。与初始版本的区块链表不同,从 Oracle 19.11 和 Oracle 21.3 开始 NO DROP 子句也可以阻止通过 DROP USER … CASCADE 命令删除区块链表。

NO DROP [ UNTIL number DAYS IDLE ]

  • NO DROP,不允许删除表。创建测试表时小心使用该选项。
  • NO DROP UNTIL number DAYS IDLE,不允许删除表,直到指定天数之内都没有插入新的数据行。测试时可以设置为 0 或者 1 天。

NO DELETE 子句决定了数据的保留期限,存在时间超过这个期限的数据才允许删除。

NO DELETE { [ LOCKED ] | (UNTIL number DAYS AFTER INSERT [ LOCKED ]) }
  • NO DELETE,数据永久保留。虽然没有指定 LOCKED 关键字,但并不意味着可以使用 ALTER TABLE 命令修改保留期限,因为保留期限只能增加,不能减少。
  • NO DELETE LOCKED,数据永久保留,和 NO DELETE 一样。
  • NO DELETE UNTIL number DAYS AFTER INSERT,数据至少存在指定天数之后才能被删除,可以使用 ALTER TABLE 命令增加保留期限。保留期限最少 16 天。
  • NO DELETE UNTIL number DAYS AFTER INSERT LOCKED,数据至少存在指定天数之后才能被删除,不能使用 ALTER TABLE 命令增加保留期限。保留期限最少 16 天。

HASHING 子句用于指定区块链哈希算法和数据格式,当前版本只能使用固定值,将来可能允许其他的设置。

HASHING USING sha2_512 VERSION v1

以下是一个创建区块链表的完整示例:

--drop table bct_t1 purge;

create blockchain table bct_t1 (
  id            number,
  fruit         varchar2(20),
  quantity      number,
  created_date  date,
  constraint bct_t1_pk primary key (id)
)
no drop until 0 days idle
no delete until 16 days after insert
hashing using "SHA2_512" version "v1";

📝在学习区块链表时,注意不要设置太长的保留期限,否则需要等待很长时间之后才能删除测试表。

查询 USER_TAB_COLS 视图可以看到数据库为我们增加了一些不可见的字段。

set linesize 120 pagesize 50
column column_name format a30
column data_type format a27
column hidden_column format a13

select internal_column_id,
       column_name,
       data_type,
       data_length,
       hidden_column
FROM   user_tab_cols       
WHERE  table_name = 'BCT_T1'
ORDER BY internal_column_id;

INTERNAL_COLUMN_ID COLUMN_NAME                    DATA_TYPE                   DATA_LENGTH HIDDEN_COLUMN
------------------ ------------------------------ --------------------------- ----------- -------------
                 1 ID                             NUMBER                               22 NO
                 2 FRUIT                          VARCHAR2                             25 NO
                 3 QUANTITY                       NUMBER                               22 NO
                 4 CREATED_DATE                   DATE                                  7 NO
                 5 ORABCTAB_INST_ID$              NUMBER                               22 YES
                 6 ORABCTAB_CHAIN_ID$             NUMBER                               22 YES
                 7 ORABCTAB_SEQ_NUM$              NUMBER                               22 YES
                 8 ORABCTAB_CREATION_TIME$        TIMESTAMP(6) WITH TIME ZONE          13 YES
                 9 ORABCTAB_USER_NUMBER$          NUMBER                               22 YES
                10 ORABCTAB_HASH$                 RAW                                2000 YES
                11 ORABCTAB_SIGNATURE$            RAW                                2000 YES
                12 ORABCTAB_SIGNATURE_ALG$        NUMBER                               22 YES
                13 ORABCTAB_SIGNATURE_CERT$       RAW                                  16 YES
                14 ORABCTAB_SPARE$                RAW                                2000 YES

14 rows selected.

{CDB|DBA|ALL|USER}_BLOCKCHAIN_TABLES 视图包括了区块链表的相关信息,它们是基于 SYS.BLOCKCHAIN_TABLE$ 系统表的视图。

column row_retention format a13
column row_retention_locked format a20
column table_inactivity_retention format a26
column hash_algorithm format a14

SELECT row_retention,
       row_retention_locked, 
       table_inactivity_retention,
       hash_algorithm  
FROM   user_blockchain_tables 
WHERE  table_name = 'BCT_T1';

ROW_RETENTION ROW_RETENTION_LOCKED TABLE_INACTIVITY_RETENTION HASH_ALGORITHM
------------- -------------------- -------------------------- --------------
           16 NO                                            0 SHA2_512

修改区块链表

官方文档告诉我们只要不是减少保留期限,就可以使用 ALTER TABLE 命令修改 NO DROP 子句。不过目前如果我们将 NO DROP UNTIL 0 DAYS IDLE 修改为更长的期限,数据库将会返回错误。

alter table bct_t1 no drop until 100 days idle;

Error report -
ORA-05732: retention value cannot be lowered

以上语法没有问题,可能是系统的一个 bug。如果创建表时使用的是 NO DROP UNTIL 1 DAYS IDLE 获取其他期限就没有问题。

阅读剩余部分

相关阅读 >>

oracle常见错误诊断

oracle常见问题解决方案汇总

oracle 安装和卸载问题收集(集合篇)第66页

oracle对plsql中的异常处理

oracle启动时出现ora-32004报错的解决方法

处理oracle监听程序当前无法识别连接描述符中请求的服务异常(ora-12514)

oracle 11g for linux centos 5.2 详细安装步骤分享(图解教程)

sqlplus 命令登录 oracle数据库的多种方法

intellij datagrip oracle 11g远程连接的方法步骤

oracle存储过程基本语法介绍

更多相关阅读请进入《oracle》频道 >>


数据库系统概念 第6版
书籍

数据库系统概念 第6版

机械工业出版社

本书主要讲述了数据模型、基于对象的数据库和XML、数据存储和查询、事务管理、体系结构等方面的内容。



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...