佳木斯湛栽影视文化发展公司

主頁 > 知識(shí)庫 > Oracle 區(qū)塊鏈表創(chuàng)建過程詳解

Oracle 區(qū)塊鏈表創(chuàng)建過程詳解

熱門標(biāo)簽:呼叫中心市場(chǎng)需求 AI電銷 網(wǎng)站排名優(yōu)化 鐵路電話系統(tǒng) 地方門戶網(wǎng)站 Linux服務(wù)器 服務(wù)外包 百度競(jìng)價(jià)排名

大家好!我是只談技術(shù)不剪發(fā)的 Tony 老師。

Oracle 21c 增加了一個(gè)非常強(qiáng)大的新功能:原生的區(qū)塊鏈表(Blockchain Table)。Oracle 區(qū)塊鏈表是一個(gè)具有防篡改功能的表,只能插入數(shù)據(jù),同時(shí)提供了表級(jí)和行級(jí)的保留期限。區(qū)塊鏈表中的所有行構(gòu)成了一個(gè)數(shù)據(jù)鏈,每一行存儲(chǔ)了當(dāng)前數(shù)據(jù)和前一個(gè)哈希值的哈希值。

Oracle 區(qū)塊鏈技術(shù)可以有效防范數(shù)據(jù)庫欺詐,利用區(qū)塊鏈的防篡改特性,用戶可以為金融交易、監(jiān)管鏈、法定保全、托管服務(wù)、審計(jì)日志以及許多其他使用場(chǎng)景下的集中式總賬提供安全保護(hù)。

本文給大家一下如何創(chuàng)建和使用 Oracle 區(qū)塊鏈表,以及相關(guān)的注意事項(xiàng)。如果覺得文章有用,歡迎評(píng)論📝、點(diǎn)贊👍、推薦🎁

📝Oracle 區(qū)塊鏈表功能也可以在 Oracle 19.10 版本中使用,不過需要應(yīng)用 patch 32431413 補(bǔ)丁,并且將 COMPATIBLE 參數(shù)設(shè)置為 19.10。從 Oracle 19.11 版本開始不再需要應(yīng)用補(bǔ)丁。

創(chuàng)建區(qū)塊鏈表

我們可以使用 CREATE BLOCKCHAIN TABLE 命令創(chuàng)建區(qū)塊鏈表,同時(shí)可以指定三個(gè)選項(xiàng)。

其中,NO DROP 子句決定了什么時(shí)候允許刪除區(qū)塊鏈表,如果表中沒有任何數(shù)據(jù)的話可以被刪除。與初始版本的區(qū)塊鏈表不同,從 Oracle 19.11 和 Oracle 21.3 開始 NO DROP 子句也可以阻止通過 DROP USER … CASCADE 命令刪除區(qū)塊鏈表。

NO DROP [ UNTIL number DAYS IDLE ]

  • NO DROP,不允許刪除表。創(chuàng)建測(cè)試表時(shí)小心使用該選項(xiàng)。
  • NO DROP UNTIL number DAYS IDLE,不允許刪除表,直到指定天數(shù)之內(nèi)都沒有插入新的數(shù)據(jù)行。測(cè)試時(shí)可以設(shè)置為 0 或者 1 天。

NO DELETE 子句決定了數(shù)據(jù)的保留期限,存在時(shí)間超過這個(gè)期限的數(shù)據(jù)才允許刪除。

NO DELETE { [ LOCKED ] | (UNTIL number DAYS AFTER INSERT [ LOCKED ]) }
  • NO DELETE,數(shù)據(jù)永久保留。雖然沒有指定 LOCKED 關(guān)鍵字,但并不意味著可以使用 ALTER TABLE 命令修改保留期限,因?yàn)楸A羝谙拗荒茉黾樱荒軠p少。
  • NO DELETE LOCKED,數(shù)據(jù)永久保留,和 NO DELETE 一樣。
  • NO DELETE UNTIL number DAYS AFTER INSERT,數(shù)據(jù)至少存在指定天數(shù)之后才能被刪除,可以使用 ALTER TABLE 命令增加保留期限。保留期限最少 16 天。
  • NO DELETE UNTIL number DAYS AFTER INSERT LOCKED,數(shù)據(jù)至少存在指定天數(shù)之后才能被刪除,不能使用 ALTER TABLE 命令增加保留期限。保留期限最少 16 天。

HASHING 子句用于指定區(qū)塊鏈哈希算法和數(shù)據(jù)格式,當(dāng)前版本只能使用固定值,將來可能允許其他的設(shè)置。

HASHING USING sha2_512 VERSION v1

以下是一個(gè)創(chuàng)建區(qū)塊鏈表的完整示例:

--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";

📝在學(xué)習(xí)區(qū)塊鏈表時(shí),注意不要設(shè)置太長(zhǎng)的保留期限,否則需要等待很長(zhǎng)時(shí)間之后才能刪除測(cè)試表。

查詢 USER_TAB_COLS 視圖可以看到數(shù)據(jù)庫為我們?cè)黾恿艘恍┎豢梢姷淖侄巍?/p>

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 視圖包括了區(qū)塊鏈表的相關(guān)信息,它們是基于 SYS.BLOCKCHAIN_TABLE$ 系統(tǒng)表的視圖。

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

修改區(qū)塊鏈表

官方文檔告訴我們只要不是減少保留期限,就可以使用 ALTER TABLE 命令修改 NO DROP 子句。不過目前如果我們將 NO DROP UNTIL 0 DAYS IDLE 修改為更長(zhǎng)的期限,數(shù)據(jù)庫將會(huì)返回錯(cuò)誤。

alter table bct_t1 no drop until 100 days idle;

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

以上語法沒有問題,可能是系統(tǒng)的一個(gè) bug。如果創(chuàng)建表時(shí)使用的是 NO DROP UNTIL 1 DAYS IDLE 獲取其他期限就沒有問題。

無論當(dāng)前的保留期限是多少,如果將 NO DROP 修改為永久保留的話都會(huì)返回 ORA-00600 錯(cuò)誤:

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], [], [], [], [], [], [], [], [], [], []

這可能是一個(gè)問題,因?yàn)榇蠖鄶?shù)人可能想從保留期限為 0 天開始嘗試,然后再增加保留期限。從保留期限為 1 天開始可能會(huì)導(dǎo)致一定的風(fēng)險(xiǎn),因?yàn)橄胍獎(jiǎng)h除測(cè)試表的唯一辦法就是刪除整個(gè)模式。

如果沒有指定 LOCKED 選項(xiàng),我們可以使用 ALTER TABLE 命令修改 NO DELETE 子句,當(dāng)然只能增加保留期限。我們的測(cè)試表目前的數(shù)據(jù)保留期限為 16 天,下面我們將它修改為 32 天:

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

Table BCT_T1 altered.


-- 減少到 16 天時(shí)返回錯(cuò)誤
alter table bct_t1 no delete until 16 days after insert;

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

當(dāng)前版本中,如果嘗試將數(shù)據(jù)保留期限修改為 NO DELETE(增加保留期限)將會(huì)導(dǎo)致 ORA-00600 錯(cuò)誤,應(yīng)該也是一個(gè) bug。

alter table bct_t1 no delete;

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

阻止 DML 和 DDL 語句

區(qū)塊鏈表只支持?jǐn)?shù)據(jù)的插入,所有導(dǎo)致數(shù)據(jù)修改或刪除的 DML 和 DDL 語句都會(huì)返回錯(cuò)誤。例如:

-- 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

導(dǎo)致數(shù)據(jù)變化的 DDL 語句同樣會(huì)返回錯(cuò)誤,以下是一個(gè) TRUNCATE 語句示例:

truncate table bct_t1;

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

我們可以擴(kuò)展已有字段的長(zhǎng)度,但是不能增加字段或者刪除已有字段:

-- 修改字段長(zhǎng)度
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

系統(tǒng)程序包DBMS_BLOCKCHAIN_TABLE 可以用于維護(hù)區(qū)塊鏈表。

其中,存儲(chǔ)過程 DELETE_EXPIRED_ROWS 可以用于刪除超過保留期限的數(shù)據(jù)行,這些數(shù)據(jù)無法使用正常的 DELETE 語句進(jìn)行刪除。

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.

另外,我們也可以增加一個(gè)日期限制,只有超過保留期限并且滿足日期要求的數(shù)據(jù)行才會(huì)被刪除。

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.

存儲(chǔ)過程 VERIFY_ROWS 可以用于檢查數(shù)據(jù)行擁有一致性哈希值,以及用戶簽名(如果使用了的話)。

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.

注意事項(xiàng)

在使用區(qū)塊鏈表之前需要考慮以下問題:

  • 目前區(qū)塊鏈表的功能還存在一些問題,某些功能并不完全像官方文檔描述。
  • 區(qū)塊鏈表比普通表的性能差一些,因?yàn)樗枰獔?zhí)行更多的操作,例如計(jì)算哈希值。
  • 區(qū)塊鏈表可以像其他表一樣支持索引和分區(qū)。
  • 區(qū)塊鏈表的導(dǎo)入導(dǎo)出還存在一些限制。
  • 區(qū)塊鏈表的使用限制。
  • Oracle 推薦將每個(gè)區(qū)塊鏈的當(dāng)前哈希算法和相應(yīng)的序列號(hào)存儲(chǔ)在數(shù)據(jù)庫之外,這樣就可以將存儲(chǔ)的值和表中的數(shù)據(jù)進(jìn)行比較,提供額外的安全保護(hù)。
  • 在 data guard 配置中,Oracle 推薦使用最大保護(hù)模式或者最大高可用性模式同步區(qū)塊鏈表。
  • DBMS_USER_CERTS 程序包中的 ADD_CERTIFICATE 存儲(chǔ)過程可以用于增加用戶證書,然后使用 DBMS_BLOCKCHAIN_TABLE 程序包中的 SIGN_ROW 存儲(chǔ)過程將其應(yīng)用到已有的數(shù)據(jù)行。

以上就是Oracle 一個(gè)集中式的區(qū)塊鏈平臺(tái)的詳細(xì)內(nèi)容,更多關(guān)于Oracle區(qū)塊鏈平臺(tái)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

您可能感興趣的文章:
  • Oracle多表查詢中間表的創(chuàng)建實(shí)例教程
  • Oracle數(shù)據(jù)庫scott用戶創(chuàng)建view視圖權(quán)限的操作方法
  • Navicat Premium中Oracle創(chuàng)建主鍵自增的方法
  • Navicat for oracle創(chuàng)建數(shù)據(jù)庫的方法
  • Oracle數(shù)據(jù)庫創(chuàng)建存儲(chǔ)過程的示例詳解
  • 通過PLSQL Developer創(chuàng)建Database link,DBMS_Job,Procedure,實(shí)現(xiàn)Oracle跨庫傳輸數(shù)據(jù)的方法(推薦)
  • oracle創(chuàng)建dblink方法示例
  • Oracle 給rac創(chuàng)建單實(shí)例dg并做主從切換功能
  • Oracle創(chuàng)建設(shè)置查詢權(quán)限用戶的方法
  • Oracle創(chuàng)建新undo表空間最佳實(shí)踐(包含段檢查)
  • 使用sqlplus命令行工具為oracle創(chuàng)建用戶和表空間
  • Oracle創(chuàng)建只讀賬號(hào)的詳細(xì)步驟

標(biāo)簽:仙桃 銅川 衡水 崇左 蘭州 黃山 湖南 湘潭

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Oracle 區(qū)塊鏈表創(chuàng)建過程詳解》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266
    永德县| 镇江市| 临桂县| 余庆县| 柳州市| 卓资县| 宣威市| 东兰县| 麻城市| 阜阳市| 巴青县| 莱西市| 麟游县| 祁门县| 中牟县| 广平县| 临沭县| 电白县| 离岛区| 阿合奇县| 湄潭县| 清原| 时尚| 八宿县| 双桥区| 阳西县| 浏阳市| 鄄城县| 兴国县| 玉屏| 麻江县| 太和县| 汾西县| 鄂州市| 崇明县| 即墨市| 普洱| 磴口县| 林口县| 海门市| 肥东县|