venerdì 6 marzo 2015

RDBMS ORACLE 11G - ORA-39726

L'errore ORA-39726 si riceve quando si cerca di effettuare la DROP di una colonna appartente ad una tabella COMPRESSA. Peccato che possa accadere che la tabella nei metadati di oracle sia indicata come COMPRESS disabled ma in realtà non lo sia.
Un esempio del problema e di come risolverlo, tutto legato ad una piccola parola "move".

Lo scenario è il seguente , supponiamo di avere una tabella compressa e di aggiungere una nuova colonna. Questa nuova colonna deve prendere il posto di una già esistente quindi occorre effettuare la DROP e la RENAME.

desc APPO_GR_1
Nome        Nullo    Tipo        
----------- -------- ------------
LOG_SESSION NOT NULL NUMBER      
LOG_TIME             TIMESTAMP(6)
LOG_LEVEL            VARCHAR2(254)
LOG_INFO             VARCHAR2(254)       
LOG_INFO_NEW         CLOB      





ALTER TABLE APPO_GR_1 DROP COLUMN LOG_INFO;


Report error -
Errore SQL: ORA-39726: operazione di aggiunta/eliminazione colonne non supportata sulle tabelle compresse
39726. 00000 -  "unsupported add/drop column operation on compressed tables"
*Cause:    An unsupported add/drop column operation for compressed table
           was attemped.
*Action:   When adding a column, do not specify a default value.
           DROP column is only supported in the form of SET UNUSED column
           (meta-data drop column).

 

Modifichiamo la tabella in nocompress
 
alter table APPO_GR_1 compress;          
select tablespace_name,compression,compress_for from dba_tables where table_name='APPO_GR_1' and owner='T4946_OLTP';          

TABLESPACE_NAME                COMPRESSION COMPRESS_FOR
------------------------------ ----------- ------------
T4946_OLTP                     ENABLED     BASIC       

alter table APPO_GR_1 nocompress;
table APPO_GR_1 modificato.

select tablespace_name,compression,compress_for from dba_tables where table_name='APPO_GR_1' and owner='T4946_OLTP';          
TABLESPACE_NAME                COMPRESSION COMPRESS_FOR
------------------------------ ----------- ------------
T4946_OLTP                     DISABLED    
            

ALTER TABLE APPO_GR_1 DROP COLUMN LOG_INFO;
Report error -
Errore SQL: ORA-39726: operazione di aggiunta/eliminazione colonne non supportata sulle tabelle compresse
39726. 00000 -  "unsupported add/drop column operation on compressed tables"
*Cause:    An unsupported add/drop column operation for compressed table
           was attemped.
*Action:   When adding a column, do not specify a default value.
           DROP column is only supported in the form of SET UNUSED column
           (meta-data drop column).


select tablespace_name,def_tab_compression,compress_for from dba_tablespaces where tablespace_name='T4946_OLTP';   
TABLESPACE_NAME                DEF_TAB_COMPRESSION COMPRESS_FOR
------------------------------ ------------------- ------------
T4946_OLTP                     DISABLED     
                   

alter table APPO_GR_1 move nocompress;
table APPO_GR_1 modificato.
ALTER TABLE APPO_GR_1 DROP COLUMN LOG_INFO;
table APPO_GR_1 modificato.



desc APPO_GR_1
Nome        Nullo    Tipo        
----------- -------- ------------
LOG_SESSION NOT NULL NUMBER      
LOG_TIME             TIMESTAMP(6)
LOG_LEVEL            VARCHAR2(254)
LOG_INFO_NEW         CLOB      


alter table APPO_GR_1 compress;
table APPO_GR_1 modificato.

select tablespace_name,compression,compress_for from dba_tables where table_name='APPO_GR_1' and owner='T4946_OLTP';          

TABLESPACE_NAME                COMPRESSION COMPRESS_FOR
------------------------------ ----------- ------------
T4946_OLTP                     ENABLED     BASIC     


ALTER TABLE APPO_GR_1 RENAME COLUMN LOG_INFO_NEW TO LOG_INFO;
table APPO_GR_1 modificato.

desc APPO_GR_1
Nome        Nullo    Tipo        
----------- -------- ------------
LOG_SESSION NOT NULL NUMBER      
LOG_TIME             TIMESTAMP(6)
LOG_LEVEL            VARCHAR2(254)
LOG_INFO         CLOB      



Problema risolto, tutto per una piccola parolina "move".


Nel caso in cui si ha sempre l'errore si può procedere modificando lo STATUS della colonna mettendolo ad UNUSED:



  • alter table table_name set unused column column_name
  • alter table table_name drop unused columns






Nessun commento:

Posta un commento