在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
大家好!我是只谈技术不剪发的 Tony 老师。 Oracle 21c 增加了一个非常强大的新功能:原生的区块链表(Blockchain Table)。Oracle 区块链表是一个具有防篡改功能的表,只能插入数据,同时提供了表级和行级的保留期限。区块链表中的所有行构成了一个数据链,每一行存储了当前数据和前一个哈希值的哈希值。 Oracle 区块链技术可以有效防范数据库欺诈,利用区块链的防篡改特性,用户可以为金融交易、监管链、法定保全、托管服务、审计日志以及许多其他使用场景下的集中式总账提供安全保护。 本文给大家一下如何创建和使用 Oracle 区块链表,以及相关的注意事项。如果觉得文章有用,欢迎评论📝、点赞👍、推荐🎁
创建区块链表我们可以使用 CREATE BLOCKCHAIN TABLE 命令创建区块链表,同时可以指定三个选项。 其中,NO DROP 子句决定了什么时候允许删除区块链表,如果表中没有任何数据的话可以被删除。与初始版本的区块链表不同,从 Oracle 19.11 和 Oracle 21.3 开始 NO DROP 子句也可以阻止通过 DROP USER … CASCADE 命令删除区块链表。
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区块链平台的资料请关注极客世界其它相关文章! |
请发表评论