Mostrando entradas con la etiqueta create table. Mostrar todas las entradas
Mostrando entradas con la etiqueta create table. Mostrar todas las entradas

jueves, 20 de noviembre de 2014

¿Porqué Tuve Que Borrar Esta Tabla Dos Veces?

Hallé este ejemplo en un sitio inglés y decidí traducirlo para los hispanohablantes. Lo he probado en Oracle 9.2 y Oracle 11.2 lo que quiere decir que la versión no sea demasiado importante. Un usuario que se llama Fred se conecta a una base de datos: 

SQL> conn fred/bloggs
Connected.
SQL>

Tiene solamente una sesión y no hay nadie más en la base de datos:

SQL> select username from v$session
  2  where username is not null
  3  /
 
USERNAME
------------------------------
FRED

SQL>

... y su usuario es vacio:

SQL> select count(*) from user_objects
  2  /
 
  COUNT(*)
----------
         0
 
SQL>

Fred crea una tabla, ejecuta unos comandos de SQL y intenta a borrar la tabla. Cuando lo hace por primera vez, ve dos errores que no te he mostrado:

SQL> drop table tab1
  2  /
drop table tab1
*
ERROR at line 1:
ORA-?????
ORA-?????
 
SQL>

Cuando lo hace por segunda vez, no hay problemas:

SQL> drop table tab1
  2  /
 
Table dropped.
 
SQL>

Yo necesito saber:
  1.  ¿Cómo fue creada la tabla?
  2. ¿Cuáles fueron los comandos de SQL?
  3. ¿Cuáles errores ha visto Fred?
Si sabes las respuestas puedes ponerlas en un comentario bajo estas líneas.

lunes, 14 de abril de 2014

Como se Puede Renombrar una Tabla

Probé este ejemplo en Oracle 12.1. Para empezar, creé una tabla:

SQL> create table fred
  2  as select * from user_synonyms
  3  where 1 = 2
  4  /
Tabla creada.

SQL>

Luego miré su número de identificación en user_objects:

SQL> select object_id
  2  from user_objects
  3  where object_name = 'FRED'
  4  /
 
OBJECT_ID
----------
     92212

SQL>

... y hice una descripción de la tabla:

SQL> desc fred
Nombre                     ¿Nulo?   Tipo
-------------------------- -------- ------------------
SYNONYM_NAME               NOT NULL VARCHAR2(128)
TABLE_OWNER                         VARCHAR2(128)
TABLE_NAME                 NOT NULL VARCHAR2(128)
DB_LINK                             VARCHAR2(128)
ORIGIN_CON_ID                       NUMBER

SQL>

Entonces cambié el nombre de la tabla:
 
SQL> rename fred to joe
  2  /
 
Nombre de tabla cambiado.

SQL>

... y por fin, para probar que todavía estaba mirando el mismo objeto, empleé el nombre nuevo para verificar que el número de identificación y la descripción no habían cambiado: 

SQL> select object_id
  2  from user_objects
  3  where object_name = 'JOE'
  4  /
 
OBJECT_ID
----------
     92212
 
SQL> desc joe
Nombre                     ¿Nulo?   Tipo
-------------------------- -------- ------------------
SYNONYM_NAME               NOT NULL VARCHAR2(128)
TABLE_OWNER                         VARCHAR2(128)
TABLE_NAME                 NOT NULL VARCHAR2(128)
DB_LINK                             VARCHAR2(128)
ORIGIN_CON_ID                       NUMBER
 
SQL>

En inglés 

viernes, 26 de abril de 2013

ORA-14223

Probé este ejemplo en Oracle 11.2.0.2.7. Se puede crear una tabla con creación diferida de la manera siguiente:

SQL> conn andrew/reid
Conectado.
SQL> create table blah (col1 number)
  2  segment creation deferred
  3  /

Tabla creada.

SQL>

Pero algunos usuarios, por ejemplo SYS, no están permitidos hacerlo:

SQL> conn / as sysdba
Conectado.
SQL> show user
USER es "SYS"
SQL> l
  1  create table blah (col1 number)
  2* segment creation deferred
SQL> /
create table blah (col1 number)
*
ERROR en linea 1:
ORA-14223: No esta soportada la creacion de segmentos diferida para esta tabla

SQL>

En inglés / in English

lunes, 8 de abril de 2013

ORA-02429

Leí este ejemplo aquí Luego decidí traducirlo para los hispanohablantes. Lo probé en Oracle 11.2.0.2.7. Es muy fácil crear y borrar un índice normal: 

SQL> conn andrew/reid
Connected.
SQL> alter session set nls_language = 'SPANISH'
  2  /

Sesion modificada.

SQL> create table andrews_table
  2  (andrews_column number)
  3  /

Tabla creada.

SQL> create index andrews_index on
  2  andrews_table(andrews_column)
  3  /

Indice creado.

SQL> drop index andrews_index
  2  /

Indice borrado.

SQL>

Pero si un índice sea creado automáticamente para ser empleado con un constraint, no se puede borrarlo. Para empezar, ponemos un constraint en nuestra tabla: 

SQL> alter table andrews_table
  2  add constraint andrews_constraint
  3  unique(andrews_column)
  4  /

Tabla modificada.

SQL>

Se puede ver el constraint en user_tables: 

SQL> select constraint_name
  2  from user_constraints
  3  where table_name = 'ANDREWS_TABLE'
  4  /

CONSTRAINT_NAME
------------------------------
ANDREWS_CONSTRAINT

SQL>

El constraint tiene un índice con el mismo nombre: 

SQL> select index_name
  2  from user_indexes
  3  where table_name = 'ANDREWS_TABLE'
  4  /

INDEX_NAME
------------------------------
ANDREWS_CONSTRAINT

SQL>

Pero no es posible borrarlo: 

SQL> drop index andrews_constraint
  2  /
drop index andrews_constraint
           *
ERROR en linea 1:
ORA-02429: no se puede borrar el indice utilizado para
aplicar la clave unica/primaria

SQL>

Para borrar el índice, es necesario borrar el propio constraint: 

SQL> alter table andrews_table
  2  drop constraint andrews_constraint
  3  /

Tabla modificada.

SQL>

Luego el  índice desaparece automáticamente y no es necesario borrarlo: 

SQL> drop index andrews_constraint
  2  /
drop index andrews_constraint
           *
ERROR en linea 1: ORA-01418: el indice especificado no existe

SQL>