Oracle 区块链表创建过程详解


Posted in Oracle onMay 15, 2021

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 获取其他期限就没有问题。

无论当前的保留期限是多少,如果将 NO DROP 修改为永久保留的话都会返回 ORA-00600 错误:

alter table bct_t1 no drop;

Error starting at line : 1 in command -
alter table bct_t1 no drop
Error report -
ORA-00600: internal error code, arguments: [atbbctable_1], [0], [], [], [], [], [], [], [], [], [], []

这可能是一个问题,因为大多数人可能想从保留期限为 0 天开始尝试,然后再增加保留期限。从保留期限为 1 天开始可能会导致一定的风险,因为想要删除测试表的唯一办法就是删除整个模式。

如果没有指定 LOCKED 选项,我们可以使用 ALTER TABLE 命令修改 NO DELETE 子句,当然只能增加保留期限。我们的测试表目前的数据保留期限为 16 天,下面我们将它修改为 32 天:

-- 增加到 32 天
alter table bct_t1 no delete until 32 days after insert;

Table BCT_T1 altered.


-- 减少到 16 天时返回错误
alter table bct_t1 no delete until 16 days after insert;

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

当前版本中,如果尝试将数据保留期限修改为 NO DELETE(增加保留期限)将会导致 ORA-00600 错误,应该也是一个 bug。

alter table bct_t1 no delete;

Error report -
ORA-00600: internal error code, arguments: [atbbctable_1], [0], [], [], [], [], [], [], [], [], [], []

阻止 DML 和 DDL 语句

区块链表只支持数据的插入,所有导致数据修改或删除的 DML 和 DDL 语句都会返回错误。例如:

-- INSERT
insert into bct_t1 (id, fruit, quantity, created_date ) values (1, 'apple', 20, sysdate);

1 row inserted.

SQL> commit;

Commit complete.


-- UPDATE
update bct_t1 set quantity = 10 where id = 1;

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


-- DELETE
delete from bct_t1 where id = 1;

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

导致数据变化的 DDL 语句同样会返回错误,以下是一个 TRUNCATE 语句示例:

truncate table bct_t1;

Error report -
ORA-05715: operation not allowed on the blockchain table

我们可以扩展已有字段的长度,但是不能增加字段或者删除已有字段:

-- 修改字段长度
alter table bct_t1 modify (fruit varchar2(25));

Table BCT_T1 altered.


-- 增加字段
alter table bct_t1 add (additional_info varchar2(50));

Error report -
ORA-05715: operation not allowed on the blockchain table


-- 删除字段
alter table bct_t1 drop column quantity;

Error report -
ORA-05715: operation not allowed on the blockchain table

DBMS_BLOCKCHAIN_TABLE

系统程序包DBMS_BLOCKCHAIN_TABLE 可以用于维护区块链表。

其中,存储过程 DELETE_EXPIRED_ROWS 可以用于删除超过保留期限的数据行,这些数据无法使用正常的 DELETE 语句进行删除。

set serveroutput on
declare
  l_rows  number;
begin
  dbms_blockchain_table.delete_expired_rows(
    schema_name            => 'admin',
    table_name             => 'bct_t1',
    before_timestamp       => null,
    number_of_rows_deleted => l_rows);

  dbms_output.put_line('Rows Deleted=' || l_rows);
end;
/
Rows Deleted=0

PL/SQL procedure successfully completed.

另外,我们也可以增加一个日期限制,只有超过保留期限并且满足日期要求的数据行才会被删除。

set serveroutput on
declare
  l_rows  number;
begin
  dbms_blockchain_table.delete_expired_rows(
    schema_name            => 'testuser1',
    table_name             => 'it_t1',
    before_timestamp       => systimestamp - 60,
    number_of_rows_deleted => l_rows);

  dbms_output.put_line('Rows Deleted=' || l_rows);
end;
/
Rows Deleted=0

PL/SQL procedure successfully completed.

存储过程 VERIFY_ROWS 可以用于检查数据行拥有一致性哈希值,以及用户签名(如果使用了的话)。

set serveroutput on
declare
  l_rows      number;
  l_verified  number;
begin
  select count(*)
  into   l_rows
  from   admin.bct_t1;

  dbms_blockchain_table.verify_rows(
    schema_name             => 'admin',
    table_name              => 'bct_t1',
    number_of_rows_verified => l_verified);

  dbms_output.put_line('Rows=' || l_rows || '  Verified Rows=' || l_verified);
end;
/
Rows=1  Verified Rows=1

PL/SQL procedure successfully completed.

注意事项

在使用区块链表之前需要考虑以下问题:

  • 目前区块链表的功能还存在一些问题,某些功能并不完全像官方文档描述。
  • 区块链表比普通表的性能差一些,因为它需要执行更多的操作,例如计算哈希值。
  • 区块链表可以像其他表一样支持索引和分区。
  • 区块链表的导入导出还存在一些限制
  • 区块链表的使用限制
  • Oracle 推荐将每个区块链的当前哈希算法和相应的序列号存储在数据库之外,这样就可以将存储的值和表中的数据进行比较,提供额外的安全保护。
  • 在 data guard 配置中,Oracle 推荐使用最大保护模式或者最大高可用性模式同步区块链表。
  • DBMS_USER_CERTS 程序包中的 ADD_CERTIFICATE 存储过程可以用于增加用户证书,然后使用 DBMS_BLOCKCHAIN_TABLE 程序包中的 SIGN_ROW 存储过程将其应用到已有的数据行

以上就是Oracle 一个集中式的区块链平台的详细内容,更多关于Oracle区块链平台的资料请关注三水点靠木其它相关文章!

Oracle 相关文章推荐
ORACLE查看当前账号的相关信息
Jun 18 Oracle
快速学习Oracle触发器和游标
Jun 30 Oracle
Oracle以逗号分隔的字符串拆分为多行数据实例详解
Jul 16 Oracle
Oracle安装TNS_ADMIN环境变量设置参考
Nov 01 Oracle
Lakehouse数据湖并发控制陷阱分析
Mar 31 Oracle
排查并解决Oracle sysaux表空间异常增长
Apr 20 Oracle
Oracle锁表解决方法的详细记录
Jun 05 Oracle
Oracle数据库事务的开启与结束详解
Jun 25 Oracle
oracle delete误删除表数据后如何恢复
Jun 28 Oracle
zabbix agent2 监控oracle数据库的方法
oracle通过存储过程上传list保存功能
May 12 #Oracle
使用springboot暴露oracle数据接口的问题
mybatis使用oracle进行添加数据的方法
Apr 27 #Oracle
Oracle设置DB、监听和EM开机启动的方法
oracle表分区的概念及操作
Apr 24 #Oracle
Oracle 数据仓库ETL技术之多表插入语句的示例详解
You might like
PHP关联链接常用代码
2012/11/05 PHP
PHP制作用户注册系统
2015/10/23 PHP
PHP list() 将数组中的值赋给变量的简单实例
2016/06/13 PHP
Yii2 中实现单点登录的方法
2018/03/09 PHP
对采用动态原型方式无法展示继承机制得思考
2009/12/04 Javascript
jquery png 透明解决方案(推荐)
2010/08/21 Javascript
各种常用的JS函数整理
2013/10/25 Javascript
jQuery实现的表格展开伸缩效果实例
2016/09/07 Javascript
JavaScript中apply方法的应用技巧小结
2016/09/29 Javascript
Vue2(三)实现子菜单展开收缩,带动画效果实现方法
2019/04/28 Javascript
vue element-ui table组件动态生成表头和数据并修改单元格格式 父子组件通信
2019/08/15 Javascript
Vue过渡效果之CSS过渡详解(结合transition,animation,animate.css)
2020/02/05 Javascript
Element实现表格嵌套、多个表格共用一个表头的方法
2020/05/09 Javascript
解决qrcode.js生成二维码时必须定义一个空div的问题
2020/07/09 Javascript
[51:32]Optic vs Serenity 2018国际邀请赛淘汰赛BO3 第一场 8.22
2018/08/23 DOTA
python放大图片和画方格实现算法
2018/03/30 Python
python中利用zfill方法自动给数字前面补0
2018/04/10 Python
在python 中实现运行多条shell命令
2019/01/07 Python
使用Python paramiko模块利用多线程实现ssh并发执行操作
2019/12/05 Python
django 读取图片到页面实例
2020/03/27 Python
Python 判断时间是否在时间区间内的实例
2020/05/16 Python
pyqt5 textEdit、lineEdit操作的示例代码
2020/08/12 Python
python 爬虫网页登陆的简单实现
2020/11/30 Python
HTML5如何为形状图上颜色怎么绘制具有颜色和透明度的矩形
2014/06/23 HTML / CSS
Fashion Eyewear美国:英国线上设计师眼镜和太阳镜的零售商
2016/08/15 全球购物
世界首屈一指的在线男士内衣权威:HisRoom
2017/08/05 全球购物
世界上最大的高分辨率在线图片库:Alamy
2018/07/07 全球购物
泰国的头号网上婴儿用品店:Motherhood.co.th
2019/04/09 全球购物
毕业生的自我评价
2013/12/30 职场文书
高中体育教学反思
2014/01/24 职场文书
《最后的姿势》教学反思
2014/02/27 职场文书
公司股东合作协议书
2014/09/14 职场文书
2014银行领导班子群众路线对照检查材料思想汇报
2014/09/17 职场文书
创业计划书之珠宝饰品
2019/08/26 职场文书
详解TS数字分隔符和更严格的类属性检查
2021/05/06 Javascript
服务器SVN搭建图文安装过程
2022/06/21 Servers