Hola a todos, hoy os vamos a contar una curiosidad que nos ha ocurrido en un cliente y que, aunque puede parecer lógico, enfrascados en el día a día se nos puede pasar y podemos provocar errores que nos pueden hacer perder mucho tiempo hasta que lo solucionamos. Aunque en concepto no sea muy complicado para cualquiera que estemos acostumbrados a trabajar con BBDD. Ocurre cuando queremos borrar un tablespace en Oracle.

Tablespaces por defecto
Todo usuario en una base de datos Oracle tiene asignado desde el momento de su creación un tablespace donde por defecto se van a crear los objetos, como tablas e índices. Si cuando se crean estos objetos no se especifica un tablespace concreto.
Este tablespace por defecto al usuario se le asigna de dos formas:
- Se le puede asignar en el comando de creación de un usuario:
CREATE USER admindb
IDENTIFIED BY admindb
DEFAULT TABLESPACE tbs_datos_admin
TEMPORARY TABLESPACE TEMP
PROFILE default;
- Si no se asigna en el comando de creación, se le asigna el tablespace por defecto de la BBDD, que se puede encontrar en la vista del catálogo database_properties:
SQL> select * from database_properties
2 where property_name='DEFAULT_PERMANENT_TABLESPACE';
PROPERTY_NAME PROPERTY_VALUE DESCRIPTION
------------------------------ ------------------------------ ----------------------------------------
DEFAULT_PERMANENT_TABLESPACE USERS Name of default permanent tablespace
Borrar un tablespace por defecto
Cuando se quiere borrar un tablespace en Oracle, el motor no comprueba si hay usuarios que lo tienen asignado como tablespace por defecto, con lo que se puede borrar sin ningún problema, teniendo en cuenta las restricciones habituales de borrado de tablespaces.
SQL> select username, account_status, default_tablespace, temporary_tablespace
2 from dba_users
3 where username='ADMINDB';
USERNAME ACCOUNT_STATUS DEFAULT_TABLESPACE TEMPORARY_TABLESPACE
------------------------------ -------------------------------- ------------------------------ ------------------------------
ADMINDB OPEN TBS_DATOS_ADMIN TEMP
Se borra con la sentencia DROP TABLESPACE
SQL> DROP TABLESPACE tbs_datos_admin INCLUDING CONTENTS AND DATAFILES;
Tablespace borrado.
Una vez borrado, el usuario sigue teniéndolo como tablespace por defecto.
SQL> select username, account_status, default_tablespace, temporary_tablespace
2 from dba_users
3 where username='ADMINDB';
USERNAME ACCOUNT_STATUS DEFAULT_TABLESPACE TEMPORARY_TABLESPACE
------------------------------ -------------------------------- ------------------------------ ------------------------------
ADMINDB OPEN TBS_DATOS_ADMIN TEMP
Borrar un tablespace por defecto de la BBDD
Si el que se intenta borrar es el tablespace por defecto de la BBDD, sí que lo comprueba y no nos deja borrarlo, devolviendonos un error.
SQL> DROP TABLESPACE users INCLUDING CONTENTS AND DATAFILES;
ERROR en lÝnea 1:
ORA-12919: No se puede borrar el tablespace permanente por defecto
Creación de objetos en tablespace borrado
Una vez borrado el tablespace, y comprobado que sigue siendo el tablespace por defecto del usuario, hay que tener cuidado porque si se quiere crear un objeto y no se especifica la clausula de almacenamiento, al ir a crearlo en el tablespace por defecto, y este no existir, pues devuelve un error no permitiéndonos crear el objeto.
SQL> connect admindb/admindb
Conectado.
SQL> CREATE TABLE tpru1 (
2 cprue1 number,
3 cprue2 varchar2(100)
4 );
CREATE TABLE tpru1 (
*
ERROR en lÝnea 1:
ORA-00959: el tablespace 'TBS_DATOS_ADMIN' no existe
Esperamos que os haya sido de utilidad.
Un saludo.
Equipo de base de datos
Si no quieres perderte trucos como este y estar al día de este mundo, suscríbete a nuestra newsletter. Te mantendremos informados con un solo email al mes.
¿Aún no conoces Query Performance? Descubre cómo puede ayudarte en tu entorno Oracle. Más información en su página de LinkedIn.
Sígue a GPS en LinkedIn
Si tienes dudas sobre su administración o relacionada con Oracle o SQL Server, ¡¡no dudes en contactar con nosotros que estaremos encantados de ayudar!!