Блокчейн таблицы в СУБД Oracle
Технология Blockchain (блокчейн) получает все более широкое применение. Не осталась в стороне и корпорация Oracle, внедрив некоторые особенности блокчейна в новых версиях своей СУБД. Ниже рассмотрено ее применение в СУБД Oracle.
Интеграция этих технологий в СУБД Oracle привносит важные преимущества блокчейн в плане безопасности для множества приложений. Для защиты от несанкционированного изменения данных, сделанных инсайдерами или злоумышленниками, использующими учетные данные пользователей базы данных, Oracle ввела блокчейн таблицы (blockchain table) в Oracle Database начиная версии 20c.
Для информации, функциональность блокчейн таблицы (blockchain table) можно сделать доступной и в Oracle Database версии 19с после установки патча 32431413 и настройки совместимости БД. Иначе, в 19 версии Oracle Database можно получить такую ошибку при создании блокчейн таблицы:
ORA-00901: invalid CREATE command
Блокчейн таблицы в СУБД Oracle – это неизменяемые таблицы, в которых строки организованы в несколько цепочек. Каждая строка, кроме первой в цепочке, связана с предыдущей строкой с помощью криптографического дайджеста или хэша. Хэш автоматически вычисляется при вставке на основе данных этой строки и хэш-значения предыдущей строки в цепочке. Временные метки также записываются для каждой строки при вставке данных в таблицу.
Любая модификация данных в блокчейн таблице нарушает криптографическую цепочку, поскольку хэш-значение строки изменится. В блокчейн таблицу можно вставлять новые данные, но существующие данные не могут быть изменены или удалены никем из пользователей базы данных, даже администраторами базы данных с ролью SYSDBA, например, пользователь sys. Также невозможно изменить структуру блокчейн таблицы или преобразовать ее в обновляемую (обычную) таблицу. Однако с точки зрения приложения блокчейн таблица выглядит как любая другая таблица в базе данных. В ней можно хранить как реляционные данные, так и документы JSON, ее можно индексировать и разбивать на партиции или использовать в качестве основы для представления (view), а также осуществлять запросы для извлечения данных с помощью команды SELECT.
Примеры создания блокчейн таблицы в Oracle Database 21c
Рассматривается пример создания блокчейн таблицы под названием bt_msu1:
create blockchain table bt_msu1 (student_id number, last_name varchar2(30)) no drop until 14 days idle no delete until 31 days after insert hashing using "sha2_512" version v1; Blockchain TABLE created.
Если обратить внимание, то помимо добавления ключевого слова blockchain в команде create table, существуют еще три параметра: no drop, no delete, hashing.
Параметр no drop определяет, как долго (в днях) таблица будет защищена от удаления после последней вставки данных. Если в таблицу еще не добавлена строка, то ее можно удалить независимо от значения параметра no drop. Данный параметр также предотвращает удаление таблицы с помощью команды drop user <username> cascade. Синтаксис этого параметра следующий: – no drop until <number> days idle (таблица может быть удалена, только после истечения указанного количества дней с момента последней вставки данных).
Таким образом, третья строка из команды создания блокчейн таблицы bt_msu1:
no drop until 14 days idle
говорит о том, что таблица может быть удалена, только после истечения 14 дней с момента последней вставки данных.
Второй параметр – no delete, определяет период хранения строк. То есть как долго каждая строка будет защищена от удаления. Синтаксис параметра следующий:
NO DELETE { [ LOCKED ] | (UNTIL number DAYS AFTER INSERT [ LOCKED ]) }
При параметре no delete без опций каждая строка сохраняется навсегда. Отсутствие ключевого слова locked подразумевает, что значение количества дней для параметра no delete можно увеличить в будущем.
Опция no delete locked: Ключевое слово locked указывает, что никогда не будет возможности удалять строки таблицы.
Опция no delete until <number> days after insert: Каждая строка защищена от удаления в течение указанного количества дней, но количество дней в будущем можно увеличить с помощью команды ALTER TABLE.
Опция no delete until <number> days after insert locked: Каждая строка защищена от удаления в течение указанного количества дней, и этот параметр нельзя изменить с помощью команды ALTER TABLE.
Таким образом, четвертая строка из команды создания блокчейн таблицы bt_msu1:
no delete until 31 days after insert
говорит о том, что каждая строка защищена от удаления в течение 31 дня с момента ее вставки.
Третий параметр – hashing. В данный момент для всех блокчейн таблиц в СУБД Oracle применяется алгоритма хэширования SHA-2 512 версии 1.
После успешного создания блокчейн таблицы с названием bt_msu1, выполняется ее удаление.
drop table bt_msu1 Table BT_MSU1 dropped.
Результат команды показывает, что удаление таблицы прошло успешно.
Далее снова создается блокчейн таблица с названием bt_msu1:
create blockchain table bt_msu1 (student_id number, last_name varchar2(30)) no drop until 14 days idle no delete until 31 days after insert hashing using "sha2_512" version v1; Blockchain TABLE created.
Вставляется новая строка в блокчейн таблицу:
insert into bt_msu1 values ('1', 'Иванов') 1 row inserted.
и выполняется удаление таблицы:
drop table bt_msu1
Система выдала следующую ошибку:
ERROR at line 1:
ORA-05723: drop blockchain table BT_MSU1 not allowed
На русском языке ошибка будет выглядеть следующим образом:
Error report -
ORA-05723: удаление таблицы блокчейна BT_MSU1 не разрешено
На этот раз удалить таблицу не получилось, т.к. сработал указанный в команде создания блокчейн таблицы параметр no drop.
Проверяется, есть ли в таблице данные:
select * from bt_msu1STUDENT_ID LAST_NAME
----------- ----------1 Иванов
Вывод команды показывает, что в таблице есть одна строка данных.
Выполняется удаление строки из блокчейн таблицы:
delete bt_msu1 where student_id = 1
и система выдает следующую ошибку:
Error report -
Error: ORA-05715: операция не разрешена в таблице блокчейна
В данном случае сработал параметр no delete указанный при создании блокчейн таблицы.
Далее выполняется изменение строки в блокчейн таблице с помощью команды update:
update bt_msu1 set last_name = 'Петров' where student_id = 1
и система опять выдает ошибку ora-05715:
Error report - Error: ORA-05715: операция не разрешена в таблице блокчейна
т.к. в этом случае тоже срабатывает параметр no delete указанный при создании блокчейн таблицы.
После выполнения операций drop table, delete и update проверяется содержимое таблицы:
select * from bt_msu1STUDENT_ID LAST_NAME
----------- ----------
1 Иванов
Вывод команды показывает, что таблица и ее данные остались неизменными.
Далее проверяется описание колонок таблицы:
desc bt_msu1 Name Null? Type ----------- ------- ---------- STUDENT_ID NUMBER LAST_NAME VARCHAR2(30)
Как видно из вывода результата команды выше, в таблице есть две колонки. Однако, выполнив команду ниже, можно увидеть несколько скрытых колонок, присущих только для блокчейн таблиц:
select internal_column_id, column_name, data_type, data_length, hidden_column FROM user_tab_cols WHERE table_name = ‘BT_MSU1’ ORDER BY internal_column_id;
Вывод команды:
Описание системных колонок блокчейн таблицы можно прочитать в официальной документации Oracle.
Выполняется запрос для получения информации о всех блокчейн таблицах в базе данных:
Ниже краткое описание столбцов из вывода команды:
- SCHEMA_NAME – имя схемы. В данном случае все операции выполняются в схеме ADMIN.
- TABLE_NAME – имя таблицы. В этой базе данных есть только одна блокчейн-таблица: BT_MSU1.
- ROW_RETENTION – Минимальное количество дней, в течение которых строка должна сохраняться после ее вставки в таблицу – если значение этого столбца равно NULL, то строки никогда не могут быть удалены из таблицы. В приведенном выше примере строка может быть удалена через 31 день. В противном случае будет выдана ошибка – ORA-05715: operation not allowed on the blockchain table.
- ROW_RETENTION_LOCKED: 2 возможных значения (YES и NO), показывающие, заблокирован ли период хранения строк для таблицы blockchain.
– YES: Период хранения строк заблокирован. Невозможно изменить период хранения строк.
– NO: Период хранения строк не заблокирован. Возможно изменить период хранения строк на значение, превышающее текущее значение, с помощью команды alter table … no delete until days after insert. - TABLE_INACTIVITY_RETENTION: Количество дней, в течение которых таблица блокчейна должна быть неактивной, прежде чем ее можно будет удалить, то есть количество дней, которое должно пройти после последней вставки строки, прежде чем таблицу можно будет удалить. Таблица без строк может быть удалена в любое время, независимо от значения этого столбца. В приведенном выше примере должно пройти 14 дней бездействия, прежде чем таблицу можно будет удалить.
- HASH_ALGORITHM: Алгоритм, используемый для вычисления хэш-значения для каждой строки таблицы.
Параметр базы данных blockchain_table_max_no_drop
В базе данных есть параметр blockchain_table_max_no_drop, который связан с блокчейн таблицами:
show parameter max_no_drop Name Type Value ---------------------------- ------- ------- blockchain_table_max_no_drop integer
Он устанавливает верхний предел значения даты в условии параметра no drop при создании блокчейн таблицы и по умолчанию равен NULL (пустое значение). Например, установка значения этого параметра в 0 (ноль) дней гарантирует, что не будет возможности создать блокчейн таблицу, которую нельзя удалить. Ниже устанавливается значение blockchain_table_max_no_drop равным двум и выполняется создание блокчейн таблицы с параметром no drop равное 14 дней:
alter system set blockchain_table_max_no_drop = 2 scope=both; System altered. create blockchain table bt_msu2 (student_id number, last_name varchar2(30)) no drop until 14 days idle no delete until 31 days after insert hashing using "sha2_512" version v1; ERROR at line 1: ORA-05747: maximum retention time too high, should be less than or equal to 2 days.
Ошибка ORA-05747 говорит о том, что в параметре no drop указано недопустимое значение (14 дней). Согласно установленному новому значению параметра blockchain_table_max_no_drop = 2, значение no drop until должно быть равно или меньше 2 дней. Изменение параметра blockchain_table_max_no_drop не будет влиять на значение параметра no drop для ранее созданных блокчейн таблиц.