OracleMania en Español Volumen 1 - Page 29

RINCON DEL DBA

DBA

29

ERROR at line 1:

ORA-14096: tables in ALTER TABLE EXCHANGE PARTITION must have the same number of columns

El mismo tipo de dato en las columnas

Sea muy cuidadoso al crear las columnas de las tablas, pues aunque cada una de las columnas de la tabla particionada tenga sus columnas homologas en la tabla no particionada con el mismo tipo de dato, el tamaño que se le ha asignado tiene mucha relevancia. En el siguiente ejemplo una columna será creada con varchar2(20) pero en la tabla no particionada se creará con varchar2(21), pequeña diferencia pero que hace fallar la operación por

completo.

Usando las siguientes tablas…

create table a(

start_date TIMESTAMP ,

a number,

b varchar2(20),

c number)

PARTITION BY RANGE (start_date)

INTERVAL(NUMTODSINTERVAL (1, 'DAY'))

( PARTITION pos_data_p2 VALUES LESS

THAN (TO_DATE('05-03-2014', 'DD-MM-YYYY')) );

--La columna “b” fué alterada

create table b(

start_date TIMESTAMP ,

a number,

b varchar2(21),

c number);

… se obtendrá el siguiente error:

SQL> ALTER TABLE A EXCHANGE PARTITION POS_DATA_P2 WITH TABLE B INCLUDING INDEXES WITHOUT VALIDATION;

ALTER TABLE A EXCHANGE PARTITION POS_DATA_P2 WITH TABLE B INCLUDING INDEXES WITHOUT VALIDATION

*

ERROR at line 1:

ORA-14097: column type or size mismatch in ALTER TABLE EXCHANGE PARTITION

El estado de los Índices después de la operación

Hasta aquí se ha hablado sobre el adecuado uso de los índices LOCALES en la tabla particionada, los índices creados de facto al utilizar una llave primaria y también se vieron algunos errores muy típicos envueltos en el proceso de un intercambio de partición de una tabla. Pero no solo esos aspectos hay que tomar en cuenta, también se debe tomar en cuenta el estado de los índices después de realizar

un “Exchange partition”.

La mala noticia

Lo primero que se debe saber, es que todos los índices globales después de un “Exchange partition” son puestos en estado “UNUSABLE” después de

realizar la operación.

Repetir el paso No. 0 y continuar con lo siguiente

CREATE INDEX a1 ON a(a,b) LOCAL;

CREATE INDEX a2 ON a(a,c) LOCAL;

--Nuestro primer índice Global

CREATE INDEX a3 ON a(b,c);

Los índices están en estado “VALID”:

SQL> select table_name, index_name, STATUS from dba_indexes where table_name='A';

TABLE_NAME INDEX_NAME STATUS

---------- -------------------- --------

A A1 N/A

A A2 N/A

A A3 VALID

CREATE INDEX b1 ON b(a,b);

CREATE INDEX b2 ON b(a,c);

SQL> ALTER TABLE A EXCHANGE PARTITION POS_DATA_P2 WITH TABLE B INCLUDING INDEXES WITHOUT VALIDATION;

Table altered.