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 DGMGRL ORA-16603报错的解决方法(DG Broker)
Apr 06 Oracle
Oracle创建只读账号的详细步骤
Jun 07 Oracle
快速学习Oracle触发器和游标
Jun 30 Oracle
RPM包方式安装Oracle21c的方法详解
Aug 23 Oracle
Oracle 死锁的检测查询及处理
Sep 25 Oracle
Oracle安装TNS_ADMIN环境变量设置参考
Nov 01 Oracle
Oracle数据库中通用的函数实例详解
Mar 25 Oracle
Oracle 多表查询基本语法实例
Apr 18 Oracle
Oracle使用别名的好处
Apr 19 Oracle
分析SQL窗口函数之取值窗口函数
Apr 21 Oracle
Oracle数据库事务的开启与结束详解
Jun 25 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中的CMS的涵义
2007/03/11 PHP
PHP下利用shell后台运行PHP脚本,并获取该脚本的Process ID的代码
2011/09/19 PHP
PHP实现动态柱状图改进版
2015/03/30 PHP
PHP目录与文件操作技巧总结(创建,删除,遍历,读写,修改等)
2016/09/11 PHP
php使用PDO下exec()函数查询执行后受影响行数的方法
2017/03/28 PHP
PHP7 新增常量
2021/03/09 PHP
Nigma vs Liquid BO3 第二场2.13
2021/03/10 DOTA
获取Javscript执行函数名称的方法
2006/12/22 Javascript
jquery对元素拖动排序示例
2014/01/16 Javascript
通过BootStrap实现轮播图的实际应用
2016/09/26 Javascript
原生js实现可爱糖果数字时间特效
2016/12/30 Javascript
jquery mobile移动端幻灯片滑动切换效果
2020/04/15 Javascript
jquery实现表单获取短信验证码代码
2017/03/13 Javascript
深入浅析Nodejs的Http模块
2017/06/20 NodeJs
VUE 3D轮播图封装实现方法
2018/07/03 Javascript
原生JS实现简单的倒计时功能示例
2018/08/30 Javascript
详解Webpack如何引入CDN链接来优化编译后的体积
2019/06/21 Javascript
基于python元祖与字典与集合的粗浅认识
2017/08/23 Python
python 弹窗提示警告框MessageBox的实例
2019/06/18 Python
bluepy 一款python封装的BLE利器简单介绍
2019/06/25 Python
关于python中密码加盐的学习体会小结
2019/07/15 Python
nginx搭建基于python的web环境的实现步骤
2020/01/03 Python
Python API 操作Hadoop hdfs详解
2020/06/06 Python
一篇文章教你用python画动态爱心表白
2020/11/22 Python
全网最全python库selenium自动化使用详细教程
2021/01/12 Python
Python基于argparse与ConfigParser库进行入参解析与ini parser
2021/02/02 Python
HTML5 新表单类型示例代码
2018/03/20 HTML / CSS
菲律宾票务网站:StubHub菲律宾
2018/04/21 全球购物
斯福泰克软件测试面试题
2015/02/16 面试题
远程教育心得体会
2014/01/03 职场文书
安全承诺书范文
2014/03/26 职场文书
投标担保书范文
2014/04/02 职场文书
成品库仓管员岗位职责
2014/04/06 职场文书
汉语言文学专业求职信
2014/06/19 职场文书
2014年初一班主任工作总结
2014/11/08 职场文书
公司会议开幕词
2016/03/03 职场文书