• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    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 DELETE 子句决定了数据的保留期限,存在时间超过这个期限的数据才允许删除。

    NO DELETE { [ LOCKED ] | (UNTIL number DAYS AFTER INSERT [ LOCKED ]) }

    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 一个集中式的区块链平台的详细内容,更多关于Oracle区块链平台的资料请关注脚本之家其它相关文章!

    您可能感兴趣的文章:
    • Oracle多表查询中间表的创建实例教程
    • Oracle数据库scott用户创建view视图权限的操作方法
    • Navicat Premium中Oracle创建主键自增的方法
    • Navicat for oracle创建数据库的方法
    • Oracle数据库创建存储过程的示例详解
    • 通过PLSQL Developer创建Database link,DBMS_Job,Procedure,实现Oracle跨库传输数据的方法(推荐)
    • oracle创建dblink方法示例
    • Oracle 给rac创建单实例dg并做主从切换功能
    • Oracle创建设置查询权限用户的方法
    • Oracle创建新undo表空间最佳实践(包含段检查)
    • 使用sqlplus命令行工具为oracle创建用户和表空间
    • Oracle创建只读账号的详细步骤
    上一篇:oracle通过存储过程上传list保存功能
    下一篇:oracle覆盖导入dmp文件的2种方法
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    Oracle 区块链表创建过程详解 Oracle,区块,链表,创建,过程,