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.