martes, 17 de septiembre de 2013

ORA-14039

Probé este ejemplo en Oracle 11.2.0.2.7. Se puede crear una tabla con particiones de la manera siguiente:

SQL> create table andrews_table
  2  partition by range (owner)
  3  (partition p1 values less than ('M'),
  4   partition p2 values less than (maxvalue))
  5  as select * from dba_tables
  6  where owner = 'SYS'
  7  /
 
Tabla creada.
 
SQL>

Se puede crear un índice local en esta tabla así:
 
SQL> create index andrews_index
  2  on andrews_table (table_name)
  3  local
  4  /
 
Indice creado.
 
SQL> drop index andrews_index
  2  /
 
Indice borrado.
 
SQL>

Pero si quieres crear un índice único, éste no puede ser local y Oracle te da un error que no ayuda mucho:

SQL> create unique index andrews_index
  2  on andrews_table (table_name)
  3  local
  4  /
on andrews_table (table_name)
   *
ERROR en linea 2:
ORA-14039: las columnas de particion deben formar un
subjuego de columnas clave de un indice UNIQUE
 
SQL>
 
La respuesta es sencilla, el índice único tiene que ser global:
 
SQL> create unique index andrews_index
  2  on andrews_table (table_name)
  3  global
  4  /
 
Indice creado.
 
SQL>

jueves, 12 de septiembre de 2013

El Fallo 445628

Probé este ejemplo en Oracle 11.2.0.2.7.

Si tienes una base de datos con dos usuarios que se llaman (por ejemplo) USUARIO1 y USUARIO2, y USUARIO1 tiene una tabla que se llama USUARIO2, USUARIO1 no puede emplear procedimientos que pertenecen a USUARIO2. Aquí está un ejemplo:

Empecé una sesión con el usuario SYSTEM

SQL> conn system/contrasena_secreta
Conectado.
SQL>

Luego empleé SYS.DBMS_LOCK.SLEEP sin problemas:

SQL> exec sys.dbms_lock.sleep(10);
 
Procedimiento PL/SQL terminado correctamente.
 
SQL>

Entonces creé una tabla llamada SYS:

SQL> create table sys(col1 number);
 
Tabla creada.

SQL>

... y cuando intenté a emplear SYS.DBMS_LOCK.SLEEP otra vez, tenía unos errores a causa del fallo 445628:

SQL> exec sys.dbms_lock.sleep(10);
BEGIN sys.dbms_lock.sleep(10); END;
 
          *
ERROR en linea 1:
ORA-06550: linea 1, columna 11:
PLS-00302: el componente 'DBMS_LOCK' se debe declarar
ORA-06550: linea 1, columna 7:
PL/SQL: Statement ignored
 
SQL>