Oracle 20c 新特性:區塊鏈表的加密HASH以及刪除保護

墨天輪原文鏈接:https://www.modb.pro/db/21696?ywm

關於 Oracle 20c 區塊鏈表(Blockchain Table),很多朋友表達了強烈的關注,通過一些基本測試,我們能夠揭示關於區塊鏈表的工作原理。

image.png

關於 Oracle 20c 區塊鏈表(Blockchain Table),很多朋友表達了強烈的關注,通過一些基本測試,我們能夠揭示關於區塊鏈表的工作原理。

以下是一些基本的規則:
1.空的區塊鏈表,可以刪除;
2.區塊鏈表不能建立在Root容器中;
3.NO DROP/DELETE 選項定義了區塊鏈表的刪除特性和保留期;
4.在保留期內,有數據的區塊鏈表不能被刪除;
5.包含保護期內都區塊鏈表的用戶不能遞歸刪除;
6.可以通過刪除數據庫,清除區塊鏈表;
7.INSERT操作不會彼此阻塞,HASH 值是提交時計算的;

以下是簡單的測試輸出:

[oracle@enmotech ~]$ sqlplus / as sysdba

SQL*Plus: Release 20.0.0.0.0 - Production on Tue Feb 18 08:47:20 2020
Version 20.2.0.0.0

Copyright (c) 1982, 2020, Oracle.  All rights reserved.

Connected to an idle instance.

SQL> startup
ORACLE instance started.

Total System Global Area  788529032 bytes
Fixed Size		    9572232 bytes
Variable Size		  603979776 bytes
Database Buffers	  171966464 bytes
Redo Buffers		    3010560 bytes
Database mounted.
Database opened.

SQL> show pdbs;

    CON_ID CON_NAME			  OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
	 2 PDB$SEED			  READ ONLY  NO

首先 區塊鏈表 不允許建立在 root 容器中:

SQL> create blockchain table enmotech( 
2    id				number primary key,
3    name			varchar2(20),
4    join_date	date)
5    NO DROP UNTIL 365 DAYS IDLE
6    NO DELETE LOCKED
7  HASHING USING "SHA2_512" VERSION "v1";
create blockchain table enmotech(
*
ERROR at line 1:
ORA-05729: blockchain table cannot be created in root container

創建一個獨立的PDB,用於測試:


SQL> SELECT NAME FROM V$DATAFILE;

NAME
-------------------------------------------------------------
/oradata/ENMOTECH/system01.dbf
/oradata/ENMOTECH/pdbseed/system01.dbf
/oradata/ENMOTECH/sysaux01.dbf
/oradata/ENMOTECH/pdbseed/sysaux01.dbf
/oradata/ENMOTECH/undotbs01.dbf
/oradata/ENMOTECH/pdbseed/undotbs01.dbf
/oradata/ENMOTECH/users01.dbf

7 rows selected.

SQL> create pluggable database enmo admin user "ENMOTECH" identified by "ENMOTECH"
file_name_convert = ('/oradata/ENMOTECH/pdbseed/','/oradata/ENMOTECH/pdbseed/enmo/');  2  

Pluggable database created.

打開PDB,創建一個獨立的測試用戶:


SQL> alter pluggable database enmo open;

Pluggable database altered.

SQL> alter session set container=ENMO;

Session altered.

SQL> create user eygle identified by eygle;

User created.

SQL> grant connect,resource,dba to eygle;

Grant succeeded.

SQL> select name from v$datafile;

NAME
--------------------------------------------------------------------------------
/oradata/ENMOTECH/pdbseed/enmo/system01.dbf
/oradata/ENMOTECH/pdbseed/enmo/sysaux01.dbf
/oradata/ENMOTECH/pdbseed/enmo/undotbs01.dbf

在這個用戶下建立區塊鏈表,注意,空表是可以隨意刪除的:

SQL> alter session set current_schema=EYGLE;

Session altered.

SQL> create blockchain table enmotech( 
2    id				number primary key,
3    name			varchar2(20),
4    join_date	date)
5    NO DROP UNTIL 365 DAYS IDLE
6    NO DELETE LOCKED
7  HASHING USING "SHA2_512" VERSION "v1";  

Table created.

SQL> drop table enmotech;

Table dropped.

但是一旦表中創建了數據,則不能再刪除表:

SQL> create blockchain table enmotech(
  2  id 			     number primary key,
  3  name		     varchar2(20),
  4  join_date	     date)
  5  NO DROP UNTIL 365 DAYS IDLE
  6  NO DELETE LOCKED
  7  HASHING USING "SHA2_512" VERSION "v1";

Table created.

SQL> insert into enmotech values(1,'EYGLE',to_date('2010-08-08','yyyy-mm-dd'));

1 row created.

SQL> drop table enmotech;
drop table enmotech
           *
ERROR at line 1:
ORA-05723: drop blockchain table ENMOTECH not allowed

在插入數據時,HASH值是空的,提交時纔會計算、鏈接,所以INSERT操作不會彼此阻塞:

SQL> insert into enmotech values(5,'ROLLINGPIG',sysdate);

1 row created.

SQL> select name,substr(ORABCTAB_HASH$,1,10) from enmotech;

NAME                 SUBSTR(ORABCTAB_HASH$,1,10)
-------------------- ----------------------------------------
EYGLE                6D22ABDFB8
KAMUS                02DFFBE75F
ORA-600              9DAB8D56BF
YANGTINGKUN          080BF7EEF3
ROLLINGPIG

同樣,刪除用戶也不被允許:

SQL> alter session set current_schema=SYS;

Session altered.

SQL> drop user eygle;
drop user eygle
*
ERROR at line 1:
ORA-01922: CASCADE must be specified to drop 'EYGLE'


SQL> drop user eygle cascade;
drop user eygle cascade
*
ERROR at line 1:
ORA-00604: error occurred at recursive SQL level 1
ORA-05723: drop blockchain table ENMOTECH not allowed

爲了刪除這個區塊鏈表,一個選擇是刪掉這個PDB:

SQL> connect / as sysdba
Connected.

SQL> alter pluggable database enmo close;

Pluggable database altered.

SQL> drop pluggable database enmo;
drop pluggable database enmo
*
ERROR at line 1:
ORA-65179: cannot keep datafiles for a pluggable database that is not unplugged


SQL> drop pluggable database enmo including datafiles;

Pluggable database dropped.

這是關於區塊鏈表的一些基本常識。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章