[26ai] Blockchain & Immutable table
![[26ai] Blockchain & Immutable table](/_next/image?url=https%3A%2F%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1770761522011%2Fed274c25-d834-4f91-bd27-c12217f72732.jpeg&w=3840&q=75)
El artículo también se encuentra publicado en Ingles English version.
En este pequeño artículo vamos a ver las Blockchain table y Immutable table.
Este tipo de tablas fueron introducidas en Oracle, con el objetivo de protegernos contra la modificación de datos no autorizados por personal externo o accidentalmente, únicamente se pueden realizar inserciones. Además, las Blockchain table a diferencia de las Immutable table, incluyen una capa extra de seguridad incluyendo cryptographic hash a nivel de fila enlazado con la fila anterior, formando una cadena que permite detectar cualquier intento de manipulación.
Aunque no es una novedad en 26ai, sino que fueron incluidas en la 21c, si que han incluido importantes mejoras muy interesantes para potenciar este tipo de tablas:
Poder añadir y eliminar columnas tanto en Blockchain como en Immutable table, especificando VERSION v2. Veamos un ejemplo, porque creo que es un matiz importante:
SQL> CREATE IMMUTABLE TABLE T_TEST_VRS_1 ( TC_ID NUMBER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY ) no drop until 2 days idle no delete until 16 days after insert VERSION "v1"; Table created. SQL> ALTER TABLE T_TEST_VRS_1 ADD (FECHA DATE); ERROR at line 1: ORA-05715: operation not allowed on the blockchain or immutable table Help: https://docs.oracle.com/error-help/db/ora-05715/ SQL> CREATE IMMUTABLE TABLE T_TEST_VRS_2 ( TC_ID NUMBER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY ) no drop until 2 days idle no delete until 16 days after insert VERSION "v2"; SQL> ALTER TABLE T_TEST_VRS_2 ADD (FECHA DATE); Table altered.BLOCKCHAIN_TABLE_MAX_NO_DROP, nuevo parámetro para especificar el tiempo máximo de inactividad cuando definimos este tipo de tablas. Cuando el parámetro esta seteado a un valor y el usuario crea una tabla con la cláusula NO DROP UNTIL n DAYS IDLE, el valor de n debe ser igual a ese valor o inferior. Si el parámetro esta nulo, es decir, no seteado, podemos definir cualquier valor en n DAYS IDLE.
Tanto las filas nuevas como las antiguas, o el borrado de la tabla, están sujetas a un periodo de retención que el usuario especifica al crear la tabla, y cuando ese periodo de retención expira, pueden eliminarse las filas o directamente la tabla.
Periodo de Retención
En el modelo que vemos a continuación, podemos ver como podemos especificar el periodo de retención a nivel de tabla y fila:

A nivel de tabla:
NO DROP: La tabla no puede ser eliminada, a no ser que este vacía.
NO DROP UNTIL n DAYS IDLE: Si aún quedan filas con un periodo de antigüedad menor, la tabla no puede ser eliminada. Por defecto, el valor es 0, aunque para garantizar la seguridad se recomienda un valor mínimo de 16.
A nivel de fila:
NO DELETE [locked]: Las filas no pueden ser eliminadas. La clausula [locked] especifica que no se puede modificar la retención.
NO DELETE UNTIL n DAYS AFTER INSERT [locked]: Cada fila no puede ser eliminada, es decir, esta protegida de la eliminación tantos días como especifiquemos en la cláusula n DAYS. Valor mínimo es 16 días. La clausula [locked] especifica que no se puede modificar la retención.
Restricciones
Las restricciones a nivel de tabla son las siguientes:
Los siguientes tipo de datos no pueden ser soportados: ROWID, UROWID, LONG, OBJECT TYPE, REF, VARRAY, NESTED TABLE, TIMESTAMP WITH TIME ZONE, TIMESTAMP WITH LOCAL TIME ZONE, BFILE y XMLType.
A nivel de tabla, no pueden ser INDEX-ORGANIZED, ORGANIZATION CUBE, ORGANIZATION EXTERNAL o HIBRYD PARTITIONED.
Sin más vamos a definir un ejemplo de cada.
Inmutable Table
SQL>
CREATE IMMUTABLE TABLE T_CLIENTES (
TC_ID NUMBER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
TC_name VARCHAR2(100) NOT NULL,
TC_email VARCHAR2(200),
TC_created_at DATE DEFAULT SYSDATE
)
no drop until 2 days idle
no delete until 16 days after insert
VERSION "v2";
Table created.
Si necesitamos modificar los periodos de retención:
SQL> ALTER TABLE T_CLIENTES NO DROP UNTIL 5 DAYS IDLE;
Table altered.
SQL> ALTER TABLE T_CLIENTES NO DELETE UNTIL 32 DAYS AFTER INSERT;
Table altered.
Como hemos incluido VERSION v2, podemos añadir columnas:
SQL> ALTER TABLE T_CLIENTES ADD (TC_PROVINCIA VARCHAR2(100));
Insertamos información e intentamos modificar algún dato:
SQL> r
1* Select * From t_Clientes
TC_ID TC_NAME TC_EMAIL TC_CREATE TC_PROVINCIA
---------- -------------------- -------------------- --------- ----------------------------------------------------------------------------------------------------
1 Iker San San@demo.local 11-FEB-26
2 Juan Perro Perro@demo.local 11-FEB-26
3 Carla Marq Marq@demo.local 11-FEB-26
SQL> Update t_Clientes Set Tc_Provincia='VALLADOLID' where tc_id = 3;
Update t_Clientes Set Tc_Provincia='VALLADOLID' where tc_id = 3
*
ERROR at line 1:
ORA-05715: operation not allowed on the blockchain or immutable table
Help: https://docs.oracle.com/error-help/db/ora-05715/
Como podemos observar, no podemos modificar información. Únicamente insertar nuevos registros.
Blockchain Table
SQL>
CREATE BLOCKCHAIN TABLE T_PRODUCTOSTIENDA (
TP_id NUMBER,
TP_NOMBRE VARCHAR2(100),
TP_PRICE FLOAT
)
NO DROP UNTIL 14 DAYS IDLE
NO DELETE UNTIL 30 DAYS AFTER INSERT
HASHING USING "SHA2_512"
WITH ROW VERSION AND USER CHAIN T_PRODUCTOS_VALIDATION (TP_id)
VERSION "v2";
Table created.
Si necesitamos modificar los periodos de retención:
SQL> ALTER TABLE T_PRODUCTOSTIENDA NO DROP UNTIL 16 DAYS IDLE;
Table altered.
SQL> ALTER TABLE T_PRODUCTOSTIENDA NO DELETE UNTIL 32 DAYS AFTER INSERT;
Table altered.
Como hemos incluido VERSION v2, podemos añadir columnas:
SQL> ALTER TABLE T_PRODUCTOSTIENDA ADD (TC_CANTIDAD INTEGER);
Insertamos información e intentamos modificar algún dato:
SQL> Select * From T_PRODUCTOSTIENDA;
TP_ID TP_NOMBRE TP_PRICE TC_CANTIDAD
---------- -------------------- ---------- -----------
1 PERAS
1 PERAS JULIANAS
2 NARANJAS
3 MANGOS
SQL> UPDATE T_PRODUCTOSTIENDA SET TP_PRICE = 9;
UPDATE T_PRODUCTOSTIENDA SET TP_PRICE = 9
*
ERROR at line 1:
ORA-05715: operation not allowed on the blockchain or immutable table
Help: https://docs.oracle.com/error-help/db/ora-05715/
Como podemos observar, tampoco podemos modificar registros. Si nos fijamos en la información introducida, hay dos productos con el mismo identificador, pero…¿Cuál fue el último insertado? En las tablas BLOCKCHAIN, Oracle crea automáticamente una vista <TABLE_NAME>_LAST$ para mostrar la última versión de cada fila.
SQL> Select * From T_PRODUCTOSTIENDA_LAST$;
TP_ID TP_NOMBRE TP_PRICE
---------- -------------------- ----------
1 PERAS JULIANAS
2 NARANJAS
3 MANGOS
En próximos artículos, abordaremos el tema del borrado sobre estos ejemplos que hemos utilizado.
Espero que os guste. ¡Nos vemos en el próximo artículo!
![[26ai] Hybrid Read-Only Mode PDB](/_next/image?url=https%3A%2F%2Fcdn.hashnode.com%2Fuploads%2Fcovers%2F65605419d28f19cc44df7ef1%2Fde208bd2-5e24-4fd3-acf7-8e5394d95283.png&w=3840&q=75)
![[26ai] ALERT_LOG_MAX_SIZE](/_next/image?url=https%3A%2F%2Fcdn.hashnode.com%2Fuploads%2Fcovers%2F65605419d28f19cc44df7ef1%2Fcbb365d0-4428-4a41-930d-516ce59e3355.jpg&w=3840&q=75)
![[26ai] ConnStr Tool](/_next/image?url=https%3A%2F%2Fcdn.hashnode.com%2Fuploads%2Fcovers%2F65605419d28f19cc44df7ef1%2F5005f06e-946c-49ba-bfe8-7fe18d1075d9.png&w=3840&q=75)
![[26ai] Instalación de Oracle26ai en Linux 9](/_next/image?url=https%3A%2F%2Fcdn.hashnode.com%2Fuploads%2Fcovers%2F65605419d28f19cc44df7ef1%2Fd9a6ba10-eb2d-4fee-8a0c-f4957cbdc676.png&w=3840&q=75)
![[OCI] Montaje de un Bucket como un FS](/_next/image?url=https%3A%2F%2Fcdn.hashnode.com%2Fuploads%2Fcovers%2F65605419d28f19cc44df7ef1%2F05595570-0fbd-46ce-9db4-d2f0e9f09003.png&w=3840&q=75)