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