Oracle 區(qū)塊鏈表創(chuàng)建過(guò)程詳解
大家好!我是只談技術(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ù)庫(kù)欺詐,利用區(qū)塊鏈的防篡改特性,用戶(hù)可以為金融交易、監(jiān)管鏈、法定保全、托管服務(wù)、審計(jì)日志以及許多其他使用場(chǎng)景下的集中式總賬提供安全保護(hù)。
本文給大家一下如何創(chuàng)建和使用 Oracle 區(qū)塊鏈表,以及相關(guān)的注意事項(xiàng)。如果覺(jué)得文章有用,歡迎評(píng)論📝、點(diǎn)贊👍、推薦🎁
📝Oracle 區(qū)塊鏈表功能也可以在 Oracle 19.10 版本中使用,不過(guò)需要應(yīng)用 patch 32431413 補(bǔ)丁,并且將 COMPATIBLE 參數(shù)設(shè)置為 19.10。從 Oracle 19.11 版本開(kāi)始不再需要應(yīng)用補(bǔ)丁。
創(chuàng)建區(qū)塊鏈表
我們可以使用 CREATE BLOCKCHAIN TABLE 命令創(chuàng)建區(qū)塊鏈表,同時(shí)可以指定三個(gè)選項(xiàng)。
其中,NO DROP 子句決定了什么時(shí)候允許刪除區(qū)塊鏈表,如果表中沒(méi)有任何數(shù)據(jù)的話(huà)可以被刪除。與初始版本的區(qū)塊鏈表不同,從 Oracle 19.11 和 Oracle 21.3 開(kāi)始 NO DROP 子句也可以阻止通過(guò) 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)都沒(méi)有插入新的數(shù)據(jù)行。測(cè)試時(shí)可以設(shè)置為 0 或者 1 天。
NO DELETE 子句決定了數(shù)據(jù)的保留期限,存在時(shí)間超過(guò)這個(gè)期限的數(shù)據(jù)才允許刪除。
NO DELETE { [ LOCKED ] | (UNTIL number DAYS AFTER INSERT [ LOCKED ]) }
- NO DELETE,數(shù)據(jù)永久保留。雖然沒(méi)有指定 LOCKED 關(guān)鍵字,但并不意味著可以使用 ALTER TABLE 命令修改保留期限,因?yàn)楸A羝谙拗荒茉黾?,不能減少。
- 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)前版本只能使用固定值,將來(lái)可能允許其他的設(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è)試表。
查詢(xún) USER_TAB_COLS 視圖可以看到數(shù)據(jù)庫(kù)為我們?cè)黾恿艘恍┎豢梢?jiàn)的字段。
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 子句。不過(guò)目前如果我們將 NO DROP UNTIL 0 DAYS IDLE 修改為更長(zhǎng)的期限,數(shù)據(jù)庫(kù)將會(huì)返回錯(cuò)誤。
alter table bct_t1 no drop until 100 days idle; Error report - ORA-05732: retention value cannot be lowered
以上語(yǔ)法沒(méi)有問(wèn)題,可能是系統(tǒng)的一個(gè) bug。如果創(chuàng)建表時(shí)使用的是 NO DROP UNTIL 1 DAYS IDLE 獲取其他期限就沒(méi)有問(wèn)題。
無(wú)論當(dāng)前的保留期限是多少,如果將 NO DROP 修改為永久保留的話(huà)都會(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è)問(wèn)題,因?yàn)榇蠖鄶?shù)人可能想從保留期限為 0 天開(kāi)始嘗試,然后再增加保留期限。從保留期限為 1 天開(kāi)始可能會(huì)導(dǎo)致一定的風(fēng)險(xiǎn),因?yàn)橄胍獎(jiǎng)h除測(cè)試表的唯一辦法就是刪除整個(gè)模式。
如果沒(méi)有指定 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 語(yǔ)句
區(qū)塊鏈表只支持?jǐn)?shù)據(jù)的插入,所有導(dǎo)致數(shù)據(jù)修改或刪除的 DML 和 DDL 語(yǔ)句都會(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 語(yǔ)句同樣會(huì)返回錯(cuò)誤,以下是一個(gè) TRUNCATE 語(yǔ)句示例:
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ǔ)過(guò)程 DELETE_EXPIRED_ROWS 可以用于刪除超過(guò)保留期限的數(shù)據(jù)行,這些數(shù)據(jù)無(wú)法使用正常的 DELETE 語(yǔ)句進(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è)日期限制,只有超過(guò)保留期限并且滿(mǎn)足日期要求的數(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ǔ)過(guò)程 VERIFY_ROWS 可以用于檢查數(shù)據(jù)行擁有一致性哈希值,以及用戶(hù)簽名(如果使用了的話(huà))。
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ū)塊鏈表之前需要考慮以下問(wèn)題:
- 目前區(qū)塊鏈表的功能還存在一些問(wèn)題,某些功能并不完全像官方文檔描述。
- 區(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ù)庫(kù)之外,這樣就可以將存儲(chǔ)的值和表中的數(shù)據(jù)進(jìn)行比較,提供額外的安全保護(hù)。
- 在 data guard 配置中,Oracle 推薦使用最大保護(hù)模式或者最大高可用性模式同步區(qū)塊鏈表。
- DBMS_USER_CERTS 程序包中的 ADD_CERTIFICATE 存儲(chǔ)過(guò)程可以用于增加用戶(hù)證書(shū),然后使用 DBMS_BLOCKCHAIN_TABLE 程序包中的 SIGN_ROW 存儲(chǔ)過(guò)程將其應(yīng)用到已有的數(shù)據(jù)行。
以上就是Oracle 一個(gè)集中式的區(qū)塊鏈平臺(tái)的詳細(xì)內(nèi)容,更多關(guān)于Oracle區(qū)塊鏈平臺(tái)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
oracle數(shù)據(jù)庫(kù)臨時(shí)表代碼舉例總結(jié)
臨時(shí)表是一種特殊的表,當(dāng)需要對(duì)某一(也可以是多個(gè))表中的一批數(shù)據(jù)進(jìn)行反復(fù)的操作時(shí),通過(guò)為這批數(shù)據(jù)創(chuàng)建一個(gè)臨時(shí)表,可能會(huì)簡(jiǎn)化操作并且有可能提高效率,這篇文章主要給大家介紹了關(guān)于oracle數(shù)據(jù)庫(kù)臨時(shí)表的相關(guān)資料,需要的朋友可以參考下2024-02-02Oracle 左連接(+)加號(hào)用法及常用語(yǔ)法之間的關(guān)系
通過(guò)分析左連接(+)加號(hào)的寫(xiě)法和一些常用語(yǔ)法之間的聯(lián)系,了解到Oracle 加號(hào)(+)的用法。本文重點(diǎn)給大家介紹Oracle 左連接(+)加號(hào)用法及常用語(yǔ)法之間的關(guān)系 ,感興趣的朋友跟隨小編一起看看吧2018-10-10Oracle出現(xiàn)超出打開(kāi)游標(biāo)最大數(shù)的解決方法
這篇文章主要介紹了Oracle出現(xiàn)超出打開(kāi)游標(biāo)最大數(shù)的解決方法,涉及針對(duì)Oracle游標(biāo)位置的判斷與處理技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2016-06-06使用Navicat Premium工具將oracle數(shù)據(jù)庫(kù)遷移到MySQL
最近的業(yè)務(wù)項(xiàng)目需求,因此總結(jié)遇到的問(wèn)題。使用Navicat Premium工具將Oralce數(shù)據(jù)庫(kù)遷移到MySQL,本文通過(guò)圖文的形式給大家詳細(xì)介紹,感興趣的朋友跟隨小編一起看看吧2021-05-05oracle 實(shí)際值超過(guò)數(shù)據(jù)庫(kù)某個(gè)字段指定長(zhǎng)度報(bào)錯(cuò)解決
本節(jié)主要介紹了oracle 實(shí)際值超過(guò)數(shù)據(jù)庫(kù)某個(gè)字段指定長(zhǎng)度報(bào)錯(cuò)解決方法,需要的朋友可以參考下2014-07-07詳細(xì)聊聊Oracle表碎片對(duì)性能有多大的影響
當(dāng)針對(duì)一個(gè)表的刪除操作很多時(shí),表會(huì)產(chǎn)生大量碎片,下面這篇文章主要給大家介紹了關(guān)于Oracle表碎片對(duì)性能影響的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-03-03