miércoles, 27 de junio de 2012

Moviendo hacia otro tablespace tablas e índices en oracle


fuente http://gonzalo.aro.cl/blog/2010/07/07/moviendo-hacia-otro-tablespace-tablas-e-indices-en-oracle/

Moviendo hacia otro tablespace tablas e índices en oracle

Para mover una tabla y/o indice de un tablespace a otro se debe aplicar un ALTER como los siguientes

ALTER TABLE NOMBRE_ESQUEMA.NOMBRE_TABLA MOVE TABLESPACE NOMBRE_TABLESPACE;
ALTER INDEX NOMBRE_ESQUEMA.NOMBRE_INDICE REBUILD TABLESPACE NOMBRE_TABLESPACE;

Se puede utilizar un script (si tienes privilegios sobre las tablas) para poder armar este movimiento de tablas desde un esquema a otro. La primera selecciona toda la lista de tablas pertenecientes a un esquema y construye el SQL que ya fue mostrado. La seguna construye toda la tabla de indices.

select 'ALTER TABLE NOMBRE_ESQUEMA.' || table_name || ' MOVE TABLESPACE NOMBRE_TABLESPACE;' from all_tables whereowner = 'NOMBRE_ESQUEMA'

select 'ALTER INDEX NOMBRE_ESQUEMA.' || index_name || ' REBUILD TABLESPACE NOMBRE_TABLESPACE;' from all_indexeswhere table_owner = 'NOMBRE_ESQUEMA'



Si se requiere modificar un trigger 

Primero se dropea el trigger

Drop Trigger OWNER.TRIGGERNAME;
y despues de modificar la secuencia en el trigger se ejecuta el script para crear el trigger:


CREATE OR REPLACE TRIGGER "OWNER"."TRIGGERNAME" BEFORE
INSERT ON "OWNER"."TRIGGERNAME" FOR EACH ROW 
DECLARE
BEGIN
IF :NEW.SERIALKEY IS NULL THEN
SELECT OWNER.TRIGGERNAME
INTO   :NEW.SerialKey
FROM   dual;
     END IF;
END;






-----------------------------------------------------------------------
-- idices LOB
-----------------------------------------------------------------------


fuente http://cotosilva.blogspot.mx/2011/09/como-mover-un-indice-de-tipo-lob-un.html


Para los índices de tipo LOB que están asociados a una columna de la tabla, la cual fue creada con este tipo de segmento es necesario utilizar la siguiente consulta para determinar que índice debemos mover:

select 'alter table '||owner||'.'||table_name||' move '||chr(10)|| 'LOB ('||column_name||') store as '||'(tablespace TABLESPACE_DE_DESTINO);'
from dba_lobs
where owner ='ESQUEMA_A_MOVER';


Output:

alter table OWNER.TABLE_NAME move lob (COLUMNA_DE_TIPO_LOB) store as (tablespace TABLESPACE_DE_DESTINO);

Si no es utilizado este método para mover el índice de tipo LOB al nuevo tablespace, Oracle nos entrega el siguiente error:

ORA-02327: cannot create index on expression with datatype LOB



select 'alter table '||owner||'.'||table_name||' move '||chr(10)|| 'LOB ('||column_name||') store as '||'(tablespace MAP_IDX);'
from dba_lobs 
where owner ='MAP';