返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >Oracle 区块链表创建过程详解
  • 692
分享到

Oracle 区块链表创建过程详解

2024-04-02 19:04:59 692人浏览 薄情痞子
摘要

大家好!我是只谈技术不剪发的 Tony 老师。 oracle 21c 增加了一个非常强大的新功能:原生的区块链表(Blockchain Table)。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区块链平台的资料请关注编程网其它相关文章!

--结束END--

本文标题: Oracle 区块链表创建过程详解

本文链接: https://lsjlt.com/news/126054.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Oracle 区块链表创建过程详解
    大家好!我是只谈技术不剪发的 Tony 老师。 Oracle 21c 增加了一个非常强大的新功能:原生的区块链表(Blockchain Table)。Oracle 区块链表是一个具...
    99+
    2024-04-02
  • 怎么在Oracle中创建区块链表
    这篇文章给大家介绍怎么在Oracle中创建区块链表,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。创建区块链表使用 CREATE BLOCKCHAIN TABLE 命令创建区块链表,同时可以指定三个选项。其中,NO DR...
    99+
    2023-06-15
  • Python区块链创世块创建教程
    区块链包含彼此链接的区块列表.要存储整个列表,我们将创建一个名为TPCoins : 的列表变量; TPCoins = [] 我们还将编写一个名为 dump_blockcha...
    99+
    2024-04-02
  • Python区块链创建GenesisBlock教程
    我们假设TPCoins的发起人最初向已知客户 Dinesh 发出500个TPCoins.为此,他首先创建一个Dinesh实例 : Dinesh = Client(...
    99+
    2024-04-02
  • Python区块链创建BlockClass教程
    一个块由不同数量的事务组成.为简单起见,在我们的例子中,我们假设该块由固定数量的事务组成,在这种情况下为3.由于块需要存储这三个事务的列表,我们将声明一个名为 verifi...
    99+
    2024-04-02
  • oracle创建用户过程详解
    1.首先用管理员用户登陆sqlplus: sqlplus "sysman/安装时设置的密码" 2.创建用户 create user userName identifi...
    99+
    2024-04-02
  • python区块链创建多个交易教程
    目录创建多个交易显示事务交易队列创建多个客户端创建第一个事务添加更多交易转储交易创建多个交易 各个客户进行的交易在系统中排队;矿工从这个队列中获取交易并将其添加到块中.然后他们将挖掘...
    99+
    2024-04-02
  • Go创建Grpc链接池实现过程详解
    目录常规用法创建链接池创建链接池接口实现链接池接口关闭链接扩缩容性能测试常规用法 gRPC 四种基本使用 请求响应模式客户端数据流模式服务端数据流模式双向流模式 常见的gRPC调用...
    99+
    2023-03-03
    Go创建Grpc链接池 Go Grpc
  • Python构建区块链的方法详解
    目录区块链block目标去中心化构建区块链类添加交易创建新blocksPOWAPI注册新节点冲突区块链 区块链是在计算机网络的节点之间共享数据的分类账(分布式数据库)。作为数据库,区...
    99+
    2023-02-25
    Python构建区块链 Python建立区块链 Python开发区块链
  • oracle创建分区表
    小白的进阶之路总是充满着荆棘 上才艺 create table test ( id varchar2(10), update date ) partition by range(date) inte...
    99+
    2015-11-12
    oracle创建分区表
  • Python区块链交易类怎么创建
    这篇文章主要介绍“Python区块链交易类怎么创建”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Python区块链交易类怎么创建”文章能帮助大家解决问题。创建 Transaction&nb...
    99+
    2023-06-30
  • 用Python从零开始创建区块链
    想知道更多区块链技术知识,请百度【链客区块链技术问答社区】 对数字货币的崛起感到新奇的我们,并且想知道其背后的技术——区块链是怎样实现的。但是完全搞懂区块链并非易事,我喜欢在实践中学习,通过写代码来学习技术会掌握得更牢固。通过构建一...
    99+
    2023-01-31
    区块 从零开始 Python
  • 详解Oracle创建用户权限全过程
    Oracle创建用户权限的全过程主要包括以下几个步骤:1. 使用具有创建用户权限的特权用户登录到Oracle数据库。2. 创建用户。...
    99+
    2023-09-22
    Oracle
  • Python中创建表格详细过程
    目录1. 引言2. 准备工作3. 举个栗子3.1 使用list生成表格3.2 使用dict生成表格3.3 增加索引列3.4 缺失值处理1. 引言 如果能够将我们的无序数据快速组织成更...
    99+
    2024-04-02
  • 详解Oracle创建表的参数
    详解Oracle创建表的参数   create table mytable (   id number(3),   n...
    99+
    2024-04-02
  • python区块链如何创建多个交易
    这篇“python区块链如何创建多个交易”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“python区块链如何创建多个交易”文...
    99+
    2023-06-30
  • PostgreSQL怎么创建分区表详解
    目录前言列分区表范围分区表总结前言 PG 假如我们想像Hive那也创建动态分区是不能实现的。         那么需要我们手动通过脚本来创建分区表,创建分区表必须要创建主表和分区表...
    99+
    2022-06-23
    pg数据库创建分区表 pg分区表创建 pg10创建分区表
  • java开源区块链初始化创世区块jdchain服务搭建
    目录初始化创世区块第一步、生成公私钥第二步、准备配置第三步、执行初始化脚本创世区块创建过程结语初始化创世区块 搭建区块链服务第一步就是初始化创世区块,创建账本。生成dchain初始化...
    99+
    2024-04-02
  • oracle怎么创建列表分区
    要在Oracle中创建列表分区,可以按照以下步骤进行操作:1. 首先,确保你有创建分区的权限。如果没有,可以联系数据库管理员进行授权...
    99+
    2023-08-18
    oracle
  • Linux下软链接和硬链接的创建、删除、区别详解
    在Linux系统中,内核为每一个新创建的文件分配一个Inode(索引结点),每个文件都有一个惟一的inode号。文件属性保存在索引结点里,在访问文件时,索引结点被复制到内存里,从而实现对文件的快速访问。 链接是一种在...
    99+
    2022-06-03
    Inode Linux 快捷方式 文件指针 文件系统 文件路径 硬链接 符号链接 软链接
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作