这篇文章给大家介绍怎么在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中创建区块链表就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。