Movendo obxectos dun tablespace a outro

Recentemente tiven que mover os obxectos dun tablespace a outro xa que quería eliminar ese tablespace, non é algo difícil, pero se vas un a un poder ser un pouco incómodo e podes esquecer algún obxecto, polo que aqui tendes os pasos que seguín para acadalo


  1. Identificar os tipos de obxectos que queres mover
    No meu caso táboas e índices (TABLE e INDEX)
  2. Identificar a sentencia a executar para mover un só dos obxectos

    No caso das táboas
  3. ALTER TABLE owner.name MOVE TABLESPACE nuevoTbs 
  4. No caso dos índices
    ALTER INDEX owner.name REBUILD TABLESPACE nuevoTbs
  5. Obter todas as sentencias de xeito fácil e reproducible, usamos a vista DBA_SEGMENTS para ver qué obxectos hai no tablespace que queremos eliminar, usamos a función decode para escoller o resultado que desexamos

    select decode(obj.segment_type,
    'TABLE','ALTER TABLE '||obj.owner||'.'||obj.segment_name ||' MOVE TABLESPACE nuevoTbs;',
    'INDEX','ALTER INDEX '||
    obj.owner||'.'||obj.segment_name ||' REBUILD TABLESPACE nuevoTbs;',
    '--objeto ' || obj.segment_type ||'-'||
    obj.owner||'.'||obj.segment_name||' no especificado')
    from dba_segments obj
    where obj.tablespace_name = 'antigoTbs'
    and obj.segment_type IN ('TABLE','INDEX')
  6. Podemos usar calquer ferramenta gráfica e exportar os resultados ou simplemente un spool para levalos a un ficheiro de texto, logo só nos quedaría executalo con sqlplus ou a ferramente que desexemos, sería bo tamén facer un spool a un ficheiro para ter constanza do resultado da execución
Así mesmo poderiamos usar este mesmo método para mover os obxectos dun usuario, ou que cumplan unha determinada condición ou o que queramos, o que se pode facer só depende do que nos imaxinemos que podemos facer :D

Agardo que vos sexa de axuda