广告
返回顶部
首页 > 资讯 > 精选 >怎么在Oracle中创建区块链表
  • 941
分享到

怎么在Oracle中创建区块链表

2023-06-15 02:06:10 941人浏览 八月长安
摘要

这篇文章给大家介绍怎么在oracle中创建区块链表,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。创建区块链表使用 CREATE BLOCKCHaiN TABLE 命令创建区块链表,同时可以指定三个选项。其中,NO DR

这篇文章给大家介绍怎么在oracle中创建区块链表,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

创建区块链表

使用 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 idleno delete until 16 days after inserthashing using "SHA2_512" version "v1";

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

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

set linesize 120 pagesize 50column column_name fORMat a30column data_type format a27column hidden_column format a13select internal_column_id,       column_name,       data_type,       data_length,       hidden_columnFROM   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 YES14 rows selected.

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

column row_retention format a13column row_retention_locked format a20column table_inactivity_retention format a26column hash_alGorithm format a14SELECT 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 dropError 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 语句都会返回错误。例如:

-- INSERTinsert into bct_t1 (id, fruit, quantity, created_date ) values (1, 'apple', 20, sysdate);1 row inserted.sql> commit;Commit complete.-- UPDATEupdate bct_t1 set quantity = 10 where id = 1;Error report -SQL Error: ORA-05715: operation not allowed on the blockchain table-- DELETEdelete 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 ondeclare  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=0PL/SQL procedure successfully completed.

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

set serveroutput ondeclare  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=0PL/SQL procedure successfully completed.

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

set serveroutput ondeclare  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=1PL/SQL procedure successfully completed.

注意事项

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

  • 目前区块链表的功能还存在一些问题,某些功能并不完全像官方文档描述。

  • 区块链表比普通表的性能差一些,因为它需要执行更多的操作,例如计算哈希值。

  • 区块链表可以像其他表一样支持索引和分区。

  • 区块链表的导入导出还存在一些限制。

  • 区块链表的使用限制。

  • Oracle 推荐将每个区块链的当前哈希算法和相应的序列号存储在数据库之外,这样就可以将存储的值和表中的数据进行比较,提供额外的安全保护。

  • 在 data guard 配置中,Oracle 推荐使用最大保护模式或者最大高可用性模式同步区块链表。

  • DBMS_USER_CERTS 程序包中的 ADD_CERTIFICATE 存储过程可以用于增加用户证书,然后使用 DBMS_BLOCKCHAIN_TABLE 程序包中的 SIGN_ROW 存储过程将其应用到已有的数据行。

关于怎么在Oracle中创建区块链表就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

--结束END--

本文标题: 怎么在Oracle中创建区块链表

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

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

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 怎么在Oracle中创建区块链表
    这篇文章给大家介绍怎么在Oracle中创建区块链表,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。创建区块链表使用 CREATE BLOCKCHAIN TABLE 命令创建区块链表,同时可以指定三个选项。其中,NO DR...
    99+
    2023-06-15
  • Oracle 区块链表创建过程详解
    大家好!我是只谈技术不剪发的 Tony 老师。 Oracle 21c 增加了一个非常强大的新功能:原生的区块链表(Blockchain Table)。Oracle 区块链表是一个具...
    99+
    2022-11-12
  • Python区块链交易类怎么创建
    这篇文章主要介绍“Python区块链交易类怎么创建”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Python区块链交易类怎么创建”文章能帮助大家解决问题。创建 Transaction&nb...
    99+
    2023-06-30
  • oracle怎么创建列表分区
    要在Oracle中创建列表分区,可以按照以下步骤进行操作:1. 首先,确保你有创建分区的权限。如果没有,可以联系数据库管理员进行授权...
    99+
    2023-08-18
    oracle
  • Python怎么构建区块链
    这篇文章主要介绍了Python怎么构建区块链的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Python怎么构建区块链文章都会有所收获,下面我们一起来看看吧。区块链区块链是在计算机网络的节点之间共享数据的分类账(...
    99+
    2023-07-06
  • oracle怎么创建数据链
    要创建一个数据链(Data Link),可以使用Oracle的CREATE DATABASE LINK语句。具体步骤如下:1. 在O...
    99+
    2023-10-12
    oracle
  • mysql中怎么创建表分区
    今天就跟大家聊聊有关mysql中怎么创建表分区,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。 1.RANGE 分区: CREATE TABLE ...
    99+
    2022-10-18
  • oracle中怎么创建表空间
    oracle中怎么创建表空间,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。  创建数据库用户的具体过程:  1.假如现在已经建好名为'...
    99+
    2022-10-18
  • oracle中怎么创建外部表
    本篇文章为大家展示了oracle中怎么创建外部表,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。oracle db允许以只读的形式查询外部表。外部表可以存储在任何or...
    99+
    2022-10-18
  • 怎么在phpmyadmin中创建表、
    怎么在phpmyadmin中创建表、?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。一、phpmyadmin表的创建1、首先打开wamp,保...
    99+
    2022-10-18
  • 怎么在sqlserver中创建表
    本篇内容介绍了“怎么在sqlserver中创建表”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!方法如下:在sql语句中,临时表有两类,分别是...
    99+
    2023-06-30
  • PostgreSQL怎么创建分区表
    这篇文章主要介绍“PostgreSQL怎么创建分区表”,在日常操作中,相信很多人在PostgreSQL怎么创建分区表问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Postgr...
    99+
    2022-10-18
  • Oracle中怎么创建和管理表
    这篇文章给大家介绍Oracle中怎么创建和管理表,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。Oracle创建表及管理表1. 表的创建及管理    创建表包括三个要...
    99+
    2022-10-18
  • Oracle中怎么创建用户和表
    这篇文章主要讲解了“Oracle中怎么创建用户和表”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Oracle中怎么创建用户和表”吧!Oracle创建用户、表(1) 连接C:\Users\LE...
    99+
    2023-07-05
  • oracle怎么创建表空间
    要在Oracle中创建表空间,可以使用CREATE TABLESPACE语句。以下是创建表空间的步骤:1. 使用SYSDBA权限登录...
    99+
    2023-08-18
    oracle
  • Python中怎么构建一个极小的区块链
    今天就跟大家聊聊有关Python中怎么构建一个极小的区块链,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。区块链以比特币(Bitcoin)或其它加密货币按时间顺序公开地记录交易的数字账...
    99+
    2023-06-17
  • oracle中怎样创建表空间
    oracle中怎样创建表空间,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。  ORACLE EBS操作某一个FORM界面,或者后台数据库操作某...
    99+
    2022-10-18
  • 怎么创建oracle数据库表
    这篇文章主要介绍了怎么创建oracle数据库表,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。我们本次创建表的需求是:创建一张班级表,和一张学...
    99+
    2022-10-18
  • 使用Oracle怎么创建多表查询中间表
    这篇文章将为大家详细讲解有关使用Oracle怎么创建多表查询中间表,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。ORACLE 多表查询中间表的创建表与表之间关系的分类:  ...
    99+
    2023-06-06
  • oracle分区表怎么建索引
    在Oracle中,可以使用以下语法来为分区表建立索引:```CREATE INDEX index_nameON table_name...
    99+
    2023-08-18
    oracle
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作