New Feature Oracle 19c: Immutable Table

New Feature Oracle 19c: Immutable Table.
Oracle is sinds enkele jaren overgestapt op een jaarlijks release schedule. Hierbij verschijnt eens in de zoveel jaar een Long Term Support (LTS) Release.  De tussenliggende Innovation Releases zijn de releases waarin veel nieuw features ingebracht zullen worden. Met (on)regelmaat worden enkele van deze nieuw features met een backport in de meeste recente LTS Release.

Een van deze features is de immutable table. Dit feature is een afgeleide van de blockchain table. Eigenschap van de immutable table is dat data ongelimiteerd ge-insert kan worden maar dat update en delete operaties beperkt zijn.

SQL> create immutable table imtest( a number)
          no drop no delete;

Table created.

De immutable table  kan je herkenen aan het ‘immutable’ keyword  by de create en de drop en delete clause. Het syntax diagram in de documentatie doet vermoeden dat de drop en de delete clause optioneel zijn. De praktijk doet iets anders vermoeden. Beiden de drop en de delete clause zijn nodig.

De No Drop’’ clause beperkt de periode dat de tabel gedropped kan worden.  Pas een aantal dagen na de laatste activiteit. De ‘No Delete’ doet het zelfde voor een delete actie. De opgegeven retentie periode kan alleen in opwaarste richting aangepast worden.

In dba_tables is er geen aanleiding om te vermoeden dat het om een immutable table gaat. Maar in dba_immutable_tables komt de table naar voren.

SQL> select * from dba_immutable_tables;

SCHEMA_NAME  TABLE_NAME  ROW_RETENTION ROW_RETENTION_LOCKED TABLE_INACTIVITY_RETENTION

----------- ------------ ------------- -------------------- -------------------
SCOTT       IMTEST       null          NO                   null

Zoals het er nu staat kan de tabel nooit gedropped worden (als er data inzit)  en de rijen zullen nooit expiren en kunnen niet gedelete worden.

SQL> insert into imtest values (1);

1 row created.

SQL> commit;

Commit complete.

SQL> select * from imtest;

         A
----------
         1

De Delete en Drop operaties zullen nu errors geven, ook voor de SYS user. Hiermee is de data in deze immutable table echt beschermd. De bescherming is sterker dan een table read only maken.

SQL> drop * from imtest;
drop * from imtest
     *
ERROR at line 1:
ORA-00950: invalid DROP option


SQL> delete from imtest;
delete from imtest
            *
ERROR at line 1:
ORA-05715: operation not allowed on the blockchain or immutable table

SQL> truncate table imtest;
truncate table imtest
               *
ERROR at line 1:
ORA-05715: operation not allowed on the blockchain or immutable table

SQL> drop table imtest;
drop table imtest
           *
ERROR at line 1:
ORA-05723: drop blockchain or immutable table IMTEST not allowed

Als we een beetje dieper in de structuur kijken zien we dat de immutable table die we hebben aangemaakt aanzienlijk meer (hidden) kolommen heeft dan de enkele kolom die gedefinieerd is tijdens creatie. Deze kunnen ook gewoon gequeried worden.

SQL> SELECT internal_column_id,
            column_name,
            data_type,
            data_length,
            hidden_column
     FROM   user_tab_cols
     WHERE  table_name = 'IMTEST';

INTERNAL_COLUMN_ID COLUMN_NAME               DATA_TYPE          DATA_LENGTH HIDDEN_COLUMN
------------------ --------------------------- ------------------ --------- -------------
                 1 A                         NUMBER                        22          NO
                 2 ORABCTAB_INST_ID$         NUMBER                        22         YES
                 3 ORABCTAB_CHAIN_ID$        NUMBER                        22         YES
                 4 ORABCTAB_SEQ_NUM$         NUMBER                        22         YES
                 5 ORABCTAB_CREATION_TIME$   TIMESTAMP(6) WITH TIME ZONE   13         YES
                 6 ORABCTAB_USER_NUMBER$     NUMBER                        22         YES
                 7 ORABCTAB_HASH$            RAW                         2000         YES
                 8 ORABCTAB_SIGNATURE$       RAW                         2000         YES
                 9 ORABCTAB_SIGNATURE_ALG$   NUMBER                        22         YES
                10 ORABCTAB_SIGNATURE_CERT$  RAW                           16         YES
                11 ORABCTAB_SPARE$           RAW                         2000         YES

  1* select ORABCTAB_CREATION_TIME$  from imtest
SQL> /

ORABCTAB_CREATION_TIME$
---------------------------------------------------------------------------
27-AUG-21 05.43.42.782084 AM +00:00

Belangrijk is te weten dat deze functionaliteit vanaf 19.10 aanwezig is en alleen werkt als de compatible parameter op 19.10 of hoger staat.

We hopen dat we je met dit artikel, New Feature Oracle 19c: Immutable Table, op weg bent geholpen. Mocht je hulp nodig hebben of je hebt vragen n.a.v. dit artikel, laat het ons dan weten.

Gerelaateerd aan dit artikel: lees ook Oracle 19 New Features

Scroll to Top