jueves, 16 de mayo de 2013

ORA-00959

Aquí está un ejemplo sobre deferred segment creation. Lo probé en Oracle 11.2.0.1.0. Lo he escrito en español porque Laurent Schneider ya ha hecho un ejemplo en inglés. Se puede ver su ejemplo aquí. En esta versión de Oracle, la opción por defecto para deferred segment creation es TRUE: 

SQL> conn fred/bloggs
Connected.
SQL> alter session set nls_language = 'SPANISH'
  2  /

Session altered.

SQL> col value format a5
SQL> col isdefault format a10
SQL> select value, isdefault from v$parameter
  2  where name = 'deferred_segment_creation'
  3  /

VALUE ISDEFAULT
----- ----------
TRUE  TRUE

SQL>

Necesitamos un tablespace para este ejemplo y este tablespace tiene que ser el tablespace por defecto de Fred: 

SQL> create tablespace users1
  2  extent management local datafile
  3  '/database/Andrew/ANDREW01/users1.dbf'
  4  reuse
  5  /

Tablespace created.

SQL> alter user fred
  2  default tablespace users1
  3  /

User altered.

SQL>

Si intentas crear una tabla con deferred segment creation, Oracle no la crea inmediatamente. La crea más tarde cuando alguien inserta líneas en la tabla: 

SQL> create table dsc as
  2  select * from dba_objects
  3  where 1=2
  4  /

Table created.

SQL> select * from dsc
  2  where owner like 'A%'
  3  /

no rows selected

SQL>

Así hay detalles para la tabla en DBA_TABLES: 

SQL> select tablespace_name
  2  from dba_tables
  3  where table_name = 'DSC'
  4  /

TABLESPACE_NAME
------------------------------
USERS1

SQL>

Pero no hay nada en DBA_SEGMENTS: 

SQL> select tablespace_name
  2  from dba_segments
  3  where segment_name = 'DSC'
  4  /

no rows selected

SQL>

Luego, si borras el tablespace que contiene la tabla: 

SQL> drop tablespace users1
  2  /

Tablespace dropped.

SQL>

… Oracle te da un mensaje ORA-00959 si intentas leer o borrar la tabla: 

SQL> select * from dsc
  2  where owner like 'B%'
  3  /
select * from dsc
*
ERROR at line 1:
ORA-00959: el tablespace 'USERS1' no existe

SQL> drop table dsc
  2  /
drop table dsc
*
ERROR at line 1:
ORA-00959: el tablespace 'USERS1' no existe

SQL>

Para borrar la tabla, es necesario recrear el tablespace: 

SQL> create tablespace users1
  2  extent management local datafile
  3  '/database/Andrew/ANDREW01/users1.dbf'
  4  reuse
  5  /

Tablespace created.

SQL>

Luego se puede borrar la tabla: 

SQL> drop table dsc
  2  /

Table dropped.

SQL>

… y si intentas leer la tabla otra vez, Oracle te da un mensaje ORA-00942 lo que prueba que la tabla no existe: 

SQL> select * from dsc
  2  where owner like 'C%'
  3  /
select * from dsc
*
ERROR at line 1:
ORA-00942: la tabla o vista no existe

SQL>

No hay comentarios:

Publicar un comentario