Skip to main content

Command Palette

Search for a command to run...

[26ai] Blockchain & Immutable table

Updated
5 min read
[26ai] Blockchain & Immutable table

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!