ORACLE开发知识: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 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 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 推荐将每一个区块链确当前哈希算法和相应的序列号存储在数据库以外,这样就能够将存储的值和表中的数据进行比较,提供额外的安全保护。
- 在 data guard 配置中,Oracle 推荐使用最大保护模式或最大高可用性模式同步区块链表。
- DBMS_USER_CERTS 程序包中的 ADD_CERTIFICATE 存储进程可以用于增加用户证书,然后使用 DBMS_BLOCKCHAIN_TABLE 程序包中的 SIGN_ROW 存储进程将其利用到已有的数据行。
大家好!我是只谈技术不剪发的 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 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 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 推荐将每一个区块链确当前哈希算法和相应的序列号存储在数据库以外,这样就能够将存储的值和表中的数据进行比较,提供额外的安全保护。
- 在 data guard 配置中,Oracle 推荐使用最大保护模式或最大高可用性模式同步区块链表。
- DBMS_USER_CERTS 程序包中的 ADD_CERTIFICATE 存储进程可以用于增加用户证书,然后使用 DBMS_BLOCKCHAIN_TABLE 程序包中的 SIGN_ROW 存储进程将其利用到已有的数据行。
以上就是Oracle 一个集中式的区块链平台的详细内容,更多关于Oracle区块链平台的资料请关注其它相关文章!
文章来源:丸子建站
文章标题:ORACLE开发知识:Oracle 区块链表创建进程详解
https://www.wanzijz.com/view/63819.html