domingo, 10 de julio de 2016

Gestionando Objetos de Esquema

Objetivos:
•Modificar tablas con la sentencia ALTER TABLE.
•Agregar restricciones.
•Crear índices.
•Crear índices mediante la sentencia CREATE TABLE.
•Crear índices basados en funciones.
•Borrar columnas y definir columnas como UNUSED.
•Realizar operaciones FLASHBACK.

NOTA: Usamos como ejemplo la base de datos: ORCL, la cual viene por defecto en cualquier versión de ORACLE.
_____________________________________________________________________________________
Sentencia ALTER TABLE.
Después de crear una tabla, puede que necesite cambiar la estructura de tabla porque ha omitido una columna, se debe cambiar la definición de columna o debe eliminar columnas. Puede hacerlo mediante la sentencia ALTER TABLE.

Utilice la sentencia ALTER TABLE para:
•Agregar una nueva columna.
•Modificar una columna existente.
•Definir un valor por defecto para la nueva columna.
•Borrar una columna.

Agregar Columnas.

•No puede especificar dónde aparecerá la columna. La nueva columna se convierte en la última.

Nota: Si una tabla ya contiene filas cuando se agrega una columna, la nueva columna es nula inicialmente para todas las filas. No puede agregar una columna NOT NULL obligatoria a una tabla que contiene datos en otras columnas. Sólo puede agregar una columna NOT NULL a una tabla vacía.
Sintaxis:
ALTER TABLE table
ADD (column datatype [DEFAULT expr]
[, column datatype]...);

---
Modificación de una Columna.
Puede modificar una definición de columna mediante la sentencia ALTER TABLE con la cláusula MODIFY. La modificación de columnas puede incluir cambios en el tipo de datos de una columna, su tamaño y el valor por defecto. 

Directrices:
•Puede aumentar el ancho o la precisión de una columna numérica. 
•Puede aumentar el ancho de las columnas numéricas o de caracteres. 
•Puede reducir el ancho de una columna si: 
-La columna contiene sólo valores nulos.
-La tabla no tiene ninguna fila.
-La reducción en el ancho de columna no es menor que los valores existentes en esa columna.
•Puede cambiar el tipo de datos si la columna contiene sólo valores nulos. La excepción son las conversiones CHAR a VARCHAR2, que se pueden realizar con datos en las columnas. 
•Puede convertir una columna CHAR al tipo de datos VARCHAR2 o convertir una columna VARCHAR2 al tipo de datos CHAR sólo si la columna contiene valores nulos o si no cambia el tamaño. 
•Un cambio en el valor por defecto de una columna sólo afecta a las siguientes inserciones en la tabla.

Sintaxis:
ALTER TABLE table
MODIFY (column datatype [DEFAULT expr]
[, column datatype]...);

---
Borrado de una Columna.
Puede borrar una columna de una tabla mediante la sentencia ALTER TABLE con la cláusula DROP COLUMN.

Directrices:
•La columna puede contener o no datos. 
•Mediante la sentencia ALTER TABLE, sólo se puede borrar una columna cada vez. 
•Debe quedar al menos una columna en la tabla después de la modificación. 
•Una vez borrada una columna, no se puede recuperar. 
•Una columna no se puede borrar si forma parte de una restricción o de una clave de índice a menos que se agregue la opción de cascada. 
•El borrado de una columna puede tardar si la columna tiene muchos valores. En este caso, es posible que sea mejor definirla como no utilizada y borrarla cuando haya menos usuarios en el sistema para evitar bloqueos extendidos. 

Nota: Hay columnas que no se pueden borrar nunca, como las que forman parte de la clave de partición de una tabla particionada o las columnas que forman parte de la clave primaria de una tabla organizada por índice.

 Sintaxis:
ALTER TABLE table
DROP (column);

En las sintaxis:
•table es el nombre de la tabla.
ADD|MODIFY|DROP es el tipo de modificación.
•column es el nombre de la nueva columna.
•datatype es el tipo de datos y la longitud de la nueva columna.
DEFAULT expr especifica el valor por defecto para una nueva columna.

Ejemplos:

CREATE TABLE random_locations

(
    loc_id NUMBER(5),
    loc_descripcion VARCHAR2(25)
,
    loc_ciudad VARCHAR2(20)
);
---

CREATE TABLE random_table

(
    col_id NUMBER(6),
    col_descripcion VARCHAR2(35


)
);
/*Creamos las tablas que tomaremos de ejemplo: random_locations y random_table .*/
---

ALTER TABLE random_table

ADD
(
     col_fecha TIMESTAMP,
     col_precio NUMBER(7)
,
     col_locacion NUMBER(5)
);
/*Aquí modificamos la tabla: random_table, agregando dos columnas mas*/
---

ALTER TABLE random_table

MODIFY
(
    col_id NUMBER(8),
    col_fecha DATE
);
/*Aquí incrementamos el ancho de la columna col_id y a la vez cambiamos el tipo de dato de la columna col_fecha.*/
---
Opción SET UNUSED.
La opción SET UNUSED marca una o más columnas como no utilizadas para que se puedan borrar cuando la demanda de recursos del sistema sea menor. La especificación de esta cláusula no elimina realmente las columnas de destino de cada fila de la tabla (es decir, no restaura el espacio en disco que utilizan estas columnas). Por lo tanto, el tiempo de respuesta es más rápido que si ejecuta la cláusula DROP. Las columnas no utilizadas se tratan como si se hubieran borrado, incluso aunque sus datos de columna sigan estando en las filas de la tabla. Si una columna se ha marcado como no utilizada, no se puede acceder a ella. Una consulta SELECT * no recuperará datos de columnas no utilizadas. Además los nombres y los tipos de columnas marcadas como no utilizadas no se mostrarán durante una sentencia DESCRIBE y puede agregar una nueva columna a la tabla con el mismo nombre que una columna no utilizada. La información SET UNUSED se almacena en la vista de diccionario USER_UNUSED_COL_TABS

Sintaxis:
ALTER TABLE <table_name>
SET UNUSED(<column_name>);

--O--
ALTER TABLE <table_name>
SET UNUSED COLUMN <column_name>;


Nota: Una vez una columna es SET UNUSED no es posible restablecerla nuevamente(SET USED), por tanto, la data se pierde. Las instrucciones para definir una columna como UNUSED son parecidas a las que se aplican al borrado de una columna.

Opción DROP UNUSED COLUMNS.
DROP UNUSED COLUMNS elimina de la tabla todas las columnas marcadas actualmente como no utilizadas. Puede utilizar esta sentencia si desea reclamar el espacio en disco adicional de las columnas no utilizadas en la tabla. Si la tabla no contiene tablas no utilizadas, la sentencia no devuelve ningún error.

Sintaxis:
ALTER TABLE <table_name>
DROP UNUSED COLUMNS;

Ejemplos:
ALTER TABLE random_table
SET UNUSED (col_preciocol_fecha);
/*Aquí establecemos las columnas col_locacion y col_descripcion como UNUSED.*/
---
ALTER TABLE random_table
DROP UNUSED COLUMNS;
/*Aquí eliminamos las columnas UNUSED.*/
_____________________________________________________________________________________
Manejo de Restricciones.
Puede agregar/eliminar restricciones para tablas existentes mediante la sentencia ALTER TABLE.

Utilice la sentencia ALTER TABLE para:
•Agregar o borrar una restricción, pero sin modificar su estructura.
•Activar o desactivar restricciones.
•Agregar una restricción NOT NULL mediante la cláusula MODIFY.

Adición de una Restricción.


Sintaxis:
ALTER TABLE <table_name>
ADD [CONSTRAINT <constraint_name>]
type (<column_name>);


En la sintaxis:
table es el nombre de la tabla.
constraint es el nombre de la restricción.
type es el tipo de restricción.
column es el nombre de la columna a la que afecta la restricción.

La sintaxis de nombre de restricción es opcional, aunque se recomienda. Si no asigna nombres a las restricciones, el sistema los generará. 

Directrices:
•Puede agregar, borrar, activar o desactivar una restricción, pero no puede modificar su estructura.
•Puede agregar una restricción NOT NULL a una columna existente mediante la cláusula MODIFY de la sentencia ALTER TABLE.

Nota: Puede definir una columna NOT NULL sólo si la tabla está vacía o si la columna tiene un valor para todas las filas.

Ejemplos:
ALTER TABLE random_locations
ADD 
(
  CONSTRAINT pk_loc_id PRIMARY KEY(loc_id),
  CONSTRAINT ck_loc_desc CHECK(LENGTH(loc_descripcion) > 10)
);
/*En este ejemplo agregamos las restricciones PRIMARY KEY y CHECK a las columnas loc_id y loc_descripcion respectivamente.*/
---

ALTER TABLE random_table

ADD CONSTRAINT fk_col_loc_id 
    FOREIGN KEY (col_locacion)
    REFERENCING random_locations(loc_id);
/*En este ejemplo agregamos una restricción de llave foránea a la columna col_locacion de la tabla random_table referenciando la columna loc_id de la tabla random_locations.*/
---
ON DELETE CASCADE.
La acción ON DELETE CASCADE permite que se supriman los datos de clave principal a los que se hace referencia desde la tabla secundaria, pero no que se actualicen. Cuando se suprimen los datos de la clave principal, también se suprimen todas las filas de la tabla secundaria que dependen de los valores de la clave principal suprimida. Para especificar esta acción referencial, incluya la opción ON DELETE CASCADE en la definición de la restricción FOREIGN KEY.

Ejemplos:
ALTER TABLE random_table
DROP CONSTRAINT fk_col_loc_id;
/*No es posible modificar un CONSTRAINT después de creado, ni tampoco es posible tener dos CONSTRAINT iguales para la misma columna de una tabla, es por ello que elimino el CONSTRAINT: fk_col_loc_id para luego crearlo con la cláusula  ON DELETE CASCADE.*/
---
ALTER TABLE random_table
ADD CONSTRAINT fk_col_loc_id 
    FOREIGN KEY (col_locacion)
    REFERENCING random_locations(loc_id)
    ON DELETE CASCADE;
/*Con esta opción, si eliminamos un registro de la tabla random_locations(tabla primaria), se eliminan sus hijos en la tabla random_table(tabla secundaria)*/
---
Diferir Restricciones.
Se puede diferir la comprobación de validez de las restricciones hasta el final de la transacción. Una restricción es diferida si el sistema comprueba que se satisface únicamente en el momento de la validación. Si se viola una restricción diferida, la validación provoca que se haga rollback de la transacción. Si una restricción es inmediata (no diferida), se comprueba al final de cada sentencia. Si se viola, se hace rollback de la sentencia de forma inmediata. Si una restricción provoca una acción (por ejemplo, DELETE CASCADE), esa acción se toma siempre como parte de la sentencia que la provocó, independientemente de que la restricción sea diferida o inmediata. Utilice la restricción SET CONSTRAINTS para especificar, para una transacción en particular, si se comprueban las restricciones diferibles después de cada sentencia DML o en el momento de la validación de la transacción. Para crear restricciones diferibles, debe crear un índice no único para esa restricción.

Las restricciones pueden tener estos atributos:
•Diferibles o no Diferibles: DEFERRABLE o NOT DEFERRABLE.
•Inicialmente diferidas o Inicialmente inmediatas: INITIALLY DEFERRED o INITIALLY IMMEDIATE.

Ejemplo:
ALTER TABLE random_table
ADD CONSTRAINT pk_col_id
PRIMARY KEY (col_id)
DEFERRABLE INITIALLY DEFERRED;
/*Acá le agregamos la restricción PRIMARY KEY a la columna col_id de la tabla: random_table, como dicha restricción es Inicialmente diferida, podemos insertar un mismo valor las veces que queramos y no recibiríamos ningún error, el problema estaría al momento de finalizar la transacción. Si tratamos de hacer COMMIT con los valore duplicados en esta columna, se levantaría una excepción indicando que no es posible completar la transacción y de paso se produciría un ROLLBACK automático.*/
---
SET CONSTRAINTS pk_col_id IMMEDIATE;
/*Luego de este ejemplo la validación del CONSTRAINT: pk_col_id  se haría al momento de ejecutar la instrucción DML. De este modo recibiríamos un error al tratar de insertar un valor duplicado en la columna col_id.*/
---
ALTER SESSION
SET CONSTRAINTS
IMMEDIATE;
/*Con este sentencia todos los CONSTRAINTS diferibles de la SESSION son cambiados a inmediatos.*/
---
Borrado de una Restricción.
Para borrar una restricción, puede identificar el nombre de restricción desde las vistas de diccionario de datos USER_CONSTRAINTS y USER_CONS_COLUMNS. Utilice a continuación la sentencia ALTER TABLE con la cláusula DROP. La opción CASCADE de la cláusula DROP provoca que se borre también cualquier restricción dependiente. 

Sintaxis:
ALTER TABLE table
DROP PRIMARY KEY | UNIQUE (column)|
CONSTRAINT constraint [CASCADE];

En la sintaxis:
table es el nombre de la tabla.
column es el nombre de la columna a la que afecta la restricción.
constraint es el nombre de la restricción.
CASCADE borra las restricciones dependientes de esta.

Al borrar una restricción de integridad, Oracle Server ya no fuerza esa restricción y ya no está disponible en el diccionario de datos.

Ejemplos:
SELECT *
FROM user_cons_columns
WHERE table_name LIKE 'RANDOM_%';
/*Consultamos el Diccionario de Datos para así ver nuestras restricciones, creadas en los ejemplos anteriores.*/
---
ALTER TABLE random_locations
DROP CONSTRAINT ck_loc_desc;
/*Eliminamos el CONSTRAINT: ck_loc_desc de la tabla random_locations, columna: loc_descripcion. Si consultamos la Vista: user_cons_columns o user_constraints del Diccionario de Datos notamos que ya no esta.*/
---
ALTER TABLE random_locations
DROP PRIMARY KEY CASCADE;
/*Acá eliminamos la llave primaria(pk_loc_id) de la tabla: random_locations, como especificamos: CASCADE de paso se elimina la restricción foránea(fk_col_loc_id) de la tabla random_table.*/
---
Desactivación de una Restricción.
Puede desactivar una restricción sin borrarla ni volverla a crear mediante la sentencia ALTER TABLE con la cláusula DISABLE.

Sintaxis:
ALTER TABLE table
DISABLE CONSTRAINT constraint [CASCADE];

Directrices:
•Puede utilizar la cláusula DISABLE en las sentencias CREATE TABLEALTER TABLE.
•La cláusula CASCADE desactiva las restricciones de integridad dependientes.
•La desactivación de una restricción de clave primaria o única elimina el índice único.

Ejemplo:
ALTER TABLE random_table
DISABLE CONSTRAINT pk_col_id;
/*Acá desactivamos la llave primaria de tabla random_table, por lo cual ahora podemos insertar valores duplicados en esta columna y completar la transacción(COMMIT). Si consultamos la vista: user_constraints del Diccionario de Datos notamos que la columna status nos dice que esta disabled.*/
---
SELECT constraint_name, 
       table_name, 
       status
FROM user_constraints
WHERE table_name LIKE 'RANDOM_%';
---
Activación de una Restricción.
Puede activar una restricción sin borrarla ni volverla a crear mediante la sentencia ALTER TABLE con la cláusula ENABLE

Sintaxis:

ALTER TABLE table
ENABLE CONSTRAINT constraint; 


Directrices:
Si activa una restricción, esa restricción se aplica a todos los datos de la tabla. Todos los datos de la tabla deben cumplir con la restricción.
•Si activa una restricción UNIQUE o PRIMARY KEY, se crea automáticamente un índice UNIQUE PRIMARY KEY. Si ya existe un índice, lo pueden utilizar estas claves. 
•Puede utilizar la cláusula ENABLE en las sentencias CREATE TABLE y ALTER TABLE.
•La activación de una restricción de clave primaria que se hubiese desactivado con la opción CASCADE no activa las claves ajenas que sean dependientes de la clave primaria. 
•Para activar una restricción UNIQUE PRIMARY KEY, debe disponer de los privilegios necesarios para crear un índice en la tabla.

Ejemplo:
ALTER TABLE random_table
ENABLE CONSTRAINT pk_col_id;
/*Ahora habilitamos nuestro CONSTRAINT: pk_col_id nuevamente, consulta la vista: user_constraints para que veas el status.*/
---
Restricciones en Cascada.
•La cláusula CASCADE CONSTRAINTS se utiliza junto con la cláusula DROP COLUMN
•La cláusula CASCADE CONSTRAINTS borra todas las restricciones de integridad referencial que hacen referencia a las claves única y primaria definidas en las columnas borradas.
•La cláusula CASCADE CONSTRAINTS también borra todas las restricciones de varias columnas definidas en las columnas borradas.

Ejemplos:
CREATE TABLE test1 
  pk NUMBER PRIMARY KEY
  fk NUMBER
  col1 NUMBER
  col2 NUMBER
  CONSTRAINT fk_constraint FOREIGN KEY (fk) REFERENCES test1, 
  CONSTRAINT  ck1 CHECK (pk > 0 and col1 > 0), 
  CONSTRAINT ck2 CHECK (col2 > 0)
); 
/*Esta sentencia crea la tabla: test1, con la cual veremos el uso de la cláusula CASCADE CONSTRAINTS.*/
---
ALTER TABLE test1 DROP (pk);
---
ALTER TABLE test1 DROP (col1);
/*Recibimos error en estas dos ultimas sentencias ALTER, debido a que estas columnas comparten restricciones de otras columnas; pk es una clave principal; la restricción de varias columnas ck1 hace referencia a col1.
---
ALTER TABLE test1
DROP (col1) CASCADE CONSTRAINTS;
/*Al especificar CASCADE CONSTRAINTS, se elimina la columna y todas las restricciones asociadas a ella.*/
_____________________________________________________________________________________
Visión General de Índices.
Se pueden crear dos tipos de índices. Un tipo es el índice único. Oracle Server crea automáticamente un índice único si se define una columna o un grupo de columnas en una tabla para tener una restricción PRIMARY KEY o UNIQUE. El nombre del índice es el nombre que se asigna a la restricción.

El otro tipo de índice es el no único y lo puede crear un usuario. Por ejemplo, puede crear un índice de columna FOREIGN KEY que se utilizará en uniones para mejorar la velocidad de recuperación.

Puede crear un índice en una o más columnas mediante la emisión de la sentencia CREATE INDEX.

También puede utilizar un índice existente para la columna PRIMARY KEY, por ejemplo cuando espera una carga grande de datos y desea acelerar la operación. Le conviene desactivar las restricciones durante la carga y activarlas después, en cuyo caso el hecho de tener un índice único en la clave primaria seguirá haciendo que se verifiquen los datos durante la carga. Así pues, puede crear primero un índice no único en la columna designada como PRIMARY KEY, crear a continuación la columna PRIMARY KEY y especificar que debería utilizar el índice existente. Los siguientes ejemplos ilustran el proceso:

--Paso 1: Creación de la Tabla
CREATE TABLE new_emp2
(  
  employee_id NUMBER(6),
  first_name  VARCHAR2(20),
  last_name   VARCHAR2(25)
 );
--Paso 2: Creación del Índice
CREATE INDEX emp_id_idx2 
  ON new_emp2(employee_id);
--Paso 3: Creación de la Clave Primaria
ALTER TABLE new_emp2 
ADD PRIMARY KEY (employee_id) USING INDEX emp_id_idx2;

Nota: Puede crear manualmente un índice único, pero se recomienda que cree una restricción única, lo que crea implícitamente un índice único.

Índices Basados en Funciones.
Los índices basados en funciones definidos con las palabras clave UPPER(column_name) o LOWER(column_name) permiten búsquedas no sensibles a mayúsculas/minúsculas. Por ejemplo, el siguiente índice: 

CREATE INDEX upper_last_name_idx
ON new_emp2 (UPPER(last_name));

facilita el procesamiento de consultas como: 

SELECT
FROM new_emp2
WHERE UPPER(last_name) = 'KING';

Oracle Server utiliza el índice únicamente si esa función en particular se utiliza en una consulta. Por ejemplo, la siguiente sentencia puede utilizar el índice, pero sin la cláusula WHERE Oracle Server puede realizar una exploración de tablas completas: 

SELECT *
FROM employees
WHERE UPPER(last_name) IS NOT NULL
ORDER BY UPPER(last_name);

Nota: Se debe definir el parámetro de inicialización QUERY_REWRITE_ENABLED en TRUE para que se utilice un índice basado en funciones. 

Oracle Server trata los índices con columnas marcadas como DESC como índices basados en funciones. Las columnas marcadas como DESC se clasifican en orden descendente.

Eliminación de un Índice.
Los índices no se pueden modificar. Para cambiar un índice, debe borrarlo y volverlo a crear. Para eliminar una definición de índice del diccionario de datos, emita la sentencia DROP INDEX. Para borrar un índice, debe ser el propietario del índice o tener el privilegio DROP ANY INDEX

Sintaxis:
DROP INDEX index;

Ejemplo:
DROP INDEX emp_id_idx2;

Nota: Si borra una tabla, los índices y las restricciones se borran automáticamente, pero las vistas y las secuencias permanecen.

DROP TABLE …PURGE.
La base de datos Oracle 10g presenta una nueva función para borrar tablas. Al borrar una tabla, la base de datos no libera inmediatamente el espacio asociado a la tabla. En su lugar, la base de datos cambia el nombre de la tabla y la coloca en una papelera de reciclaje, de donde se podrá recuperar después con la sentencia FLASHBACK TABLE si se da cuenta de que borró la tabla por error. Si desea liberar de forma inmediata el espacio asociado a la tabla en el momento de emitir la sentencia DROP TABLE, incluya la cláusula PURGE como se muestra en la sentencia de la diapositiva. 

Especifique PURGE sólo si desea borrar la tabla y liberar el espacio asociado a ella en un solo paso. Si especifica PURGE, la base de datos no coloca la tabla y sus objetos dependientes en la papelera de reciclaje. 

La utilización de esta cláusula es equivalente a borrar primero la tabla y purgarla después de la papelera de reciclaje. Esta cláusula le ahorra un paso en el proceso. Proporciona también una seguridad mejorada si desea evitar que aparezca material sensible en la papelera de reciclaje. 

Nota: No puede hacer rollback de una sentencia DROP TABLE con la cláusula PURGE, ni tampoco puede recuperar la tabla si la ha borrado con la cláusula PURGE. Esta función no estaba disponible en versiones anteriores a Oracle 10g.
_____________________________________________________________________________________
Sentencia FLASHBACK TABLE.
•Herramienta de reparación para modificaciones accidentales de tabla.
–Restaura una tabla a un punto anterior en el tiempo.
–Ventajas: Facilidad de uso, disponibilidad y ejecución rápida.

Utilidad de Reparación de Autoservicio.

La base de datos Oracle 10g proporciona un nuevo comando DDL de SQL, FLASHBACK TABLE, para restaurar el estado de una tabla a un punto anterior en el tiempo en el caso de que la haya suprimido o modificado de forma accidental. El comando FLASHBACK TABLE es una herramienta de reparación de autoservicio para restaurar datos de una tabla junto con los atributos asociados como, por ejemplo, índices o vistas. Esto se consigue cuando la base de datos está online haciendo rollback sólo de los cambios posteriores en la tabla en cuestión. Si se compara con mecanismos de recuperación tradicionales, esta función ofrece ventajas significativas, como la facilidad de uso, la disponibilidad y una recuperación más rápida. También libera al DBA del trabajo de encontrar y restaurar propiedades específicas de aplicación. La función de flashback en tabla no se ocupa de la corrupción física provocada por un disco en mal estado. 

Sintaxis:
FLASHBACK TABLE[schema.]table[, [ schema.]table ]...
TO { TIMESTAMP | SCN } expr
[ { ENABLE | DISABLE } TRIGGERS];

Puede llamar a una operación de flashback en una o más tablas, incluso en tablas de diferentes esquemas. Para especificar el punto en el tiempo al que desea revertir, proporcione un registro de hora válido. Por defecto, los disparadores de base de datos están desactivados para todas las tablas implicadas. Para sustituir este comportamiento por defecto, especifique la cláusula ENABLE TRIGGERS

Ejemplos:
CREATE TABLE emp_test
AS
  SELECT *
  FROM hr.employees;
/*Creamos la Tabla: emp_test, con la misma estructura y datos de la tabla employees de hr.*/
---
DROP TABLE emp_test;
/*Eliminamos la Tabla: emp_test.*/
---
SELECT 
        original_name,
        operation,
        droptime
FROM recyclebin
WHERE original_name LIKE 'EMP_%';
/*Consultamos nuestra tabla en la papelería de reciclaje.*/
---
FLASHBACK TABLE emp_test TO BEFORE DROP;
/*El ejemplo restaura la tabla emp_test a un estado anterior a una sentencia DROP.*/
---
La papelera de reciclaje es en realidad una tabla de diccionario de datos que contiene información sobre objetos borrados. Las tablas borradas y los objetos asociados, como índices, restricciones, tablas anidadas, etc., no se eliminan y siguen ocupando espacio. Siguen ocupando las cuotas de espacio de usuario, hasta que se purgan específicamente de la papelera de reciclaje o hasta que se produce una situación poco probable en la que las deba purgar la base de datos debido a restricciones de espacio de Tablespace.

Se puede considerar a cada usuario propietario de una papelera de reciclaje, ya que, a menos que un usuario tenga el privilegio SYSDBA, los únicos objetos a los que puede acceder en la papelera de reciclaje son los de su propiedad. Un usuario puede ver sus objetos en la papelera de reciclaje mediante la siguiente sentencia:

SELECT *
FROM recyclebin;

Al borrar un usuario, los objetos que pertenecen a ese usuario no se colocarán en la papelera de reciclaje y se purgarán todos los objetos de la papelera de reciclaje.

Puede purgar la papelera de reciclaje con la siguiente sentencia: PURGE recyclebin;
_____________________________________________________________________________________
_____________________________________________________________________________________
Fuente: Base de Datos Oracle 10g: Conceptos Fundamentales de SQL 1