Чтобы иметь возможность использовать таблицу Blockchain в релизе Oracle 19c, вам нужно будет применить последние исправления (патчи) и изменить значение параметра совместимости (что необычно). Функция блокчейна была впервые представлена в релизе Oracle 21c и перенесена на 19c с патчем 19.10 RU в январском CPU 2021 года. Итак, изучим эту возможность на примере пропатченной базы данных Oracle до версии 19.11 (CPU апреля 2021 года).
Шаг 1. Чтобы поднять параметр совместимости, отключаем базу данных:
SQL> shutdown immediate;
Шаг 2. Затем отредактируем файл init.ora
и изменим значение параметра совместимости:
compatible=’19.11.0′
Шаг 3. Затем снова запускаем базу данных:
SQL> startup pfile=’D:\WINDOWS.X64_193000_db_home\dbs\init.ora’
Шаг 4. Проверим, действительно ли применился параметр совместимости:
SQL> SELECT name, value, description FROM v$parameter WHERE name = ‘compatible’;
...
compatible
19.11.0
Database will be completely compatible with this software version
Шаг 5. Создаем Blockchain таблицу. В подключаемой (pluggable) базе данных PDB1 создаем тестовое табличное пространство и пользователя, которого наделяем нужными привилегиями:
CREATE TABLESPACE ledgertbs;
CREATE USER auditor identified by audit_123 DEFAULT TABLESPACE ledgertbs;
GRANT create session, create table, unlimited tablespace TO auditor;
GRANT execute ON sys.dbms_blockchain_table TO auditor;
Шаг 6. Теперь, зайдя в базу PDB1
по учетной записью auditor
, мы создадим таблицу блокчейна с именем AUDITOR.LEDGER_EMP
, которая будет поддерживать защищенный от несанкционированного доступа реестр текущих и исторических транзакций в PDB1. Строки никогда не могут быть удалены в таблице блокчейна AUDITOR.LEDGER_EMP
. Эту таблицу блокчейна можно будет удалить только после истечения 3-х дней при условии отсутствия каких-либо манипуляций с ней.
SQL> CREATE BLOCKCHAIN TABLE ledger_emp (employee_id NUMBER, employee_name varchar2(15), salary NUMBER)
NO DROP UNTIL 3 DAYS IDLE
NO DELETE LOCKED
HASHING USING “SHA2_512” VERSION “v1”;
Проверим имеющиеся блокчейн таблицы, выполнив запрос к user_blockchain_tables
:
SQL> SELECT * FROM user_blockchain_tables;
Шаг 7. Теперь давайте вставим 1 запись в таблицу ledger_emp
:
SQL> INSERT INTO ledger_emp VALUES (106,’EMAD’,3000);
SQL> COMMIT;
Шаг 8. Теперь, если попытаться удалить данную таблицу, получим сообщение об ошибке:
ORA-05723: drop blockchain or immutable table LEDGER_EMP not allowed
Шаг 9. Если же попытаться удалить все записи из таблицы, то получим следующую ошибку:
SQL> delete from auditor.ledger_emp;
ORA-05715: operation not allowed on the blockchain or immutable table
Шаг 10. Теперь давайте проверим целостность хеш-значений строки:
SELECT ORABCTAB_CHAIN_ID$ “Chain ID”, ORABCTAB_SEQ_NUM$ “Seq Num”,
to_char(ORABCTAB_CREATION_TIME$,’dd-Mon-YYYY hh-mi’) “Chain date”,
ORABCTAB_USER_NUMBER$ “User Num”, ORABCTAB_HASH$ “Chain HASH”,
employee_id, salary
FROM ledger_emp;
В Oracle 19C есть параметр под названием BLOCKCHAIN_TABLE_MAX_NO_DROP,
который определяет время простоя, в течение которого таблица может быть неактивной до возможности ее удаления. Этот параметр может быть очень полезным, если вы хотите защитить таблицу от случайного удаления, установив для параметра nodrop
очень высокое значение.
Попробуйте выполнить с уровня PDB:
sqlplus / as sysdba
SQL> alter session set container=PDB1;
SQL> alter system set blockchain_table_max_no_drop=0;
alter system set blockchain_table_max_no_drop=0
*
ERROR at line 1:
ORA-01031: insufficient privileges
Попробуйте выполнить с уровня CDB:
sqlplus / as sysdba
SQL> alter system set blockchain_table_max_no_drop=0;
System altered.
Несмотря на то, что в документации указано, что вы можете изменить его с уровня PDB ?! (видимо это ошибка документации):
select
name,type,value,ISPDB_MODIFIABLE,ISINSTANCE_MODIFIABLE,ISMODIFIED,ISSYS_MODIFIABLE,DESCRIPTION
from
v$parameter
where
name=’blockchain_table_max_no_drop’;
Теперь, после установки параметра в 0
, если вы попытаетесь создать таблицу блокчейн с количеством дней больше нуля:
SQL> CREATE BLOCKCHAIN TABLE auditor.ledger_emp_n (employee_id NUMBER, employee_name varchar2(15), salary NUMBER)
NO DROP UNTIL 4 DAYS IDLE
NO DELETE LOCKED
HASHING USING “SHA2_512” VERSION “v1”;
CREATE BLOCKCHAIN TABLE auditor.ledger_emp_n (employee_id NUMBER, employee_name varchar2(15), salary NUMBER)
*
ERROR at line 1:
ORA-05747: maximum retention time too high, should be less than or equal to 0
Надеюсь, что приведенные примеры дали наглядное преставление о возможностях работы с Blockchain таблицами в СУБД Oracle Database 19c.