Este equipo de trabajo ha estado mucho tiempo buscando la resolución a tu pregunta, te dejamos la respuestas así que esperamos resultarte de gran ayuda.
Solución:
Normalmente, lo más sencillo es eliminar y agregar al usuario. Este es el método preferido si tiene acceso de sistema o sysdba a la base de datos.
Si no tiene acceso a nivel de sistema y desea borrar su esquema, el siguiente sql producirá una serie de declaraciones de eliminación, que luego se pueden ejecutar.
select 'drop '||object_type||' '|| object_name|| DECODE(OBJECT_TYPE,'TABLE',' CASCADE CONSTRAINTS','') || ';' from user_objects
Luego, normalmente purgo la papelera de reciclaje para limpiar realmente las cosas. Para ser honesto, no veo mucho uso para la papelera de reciclaje de Oracle, y desearía poder desactivarla, pero de todos modos:
purge recyclebin;
Esto producirá una lista de sentencias drop. No todos se ejecutarán; si se elimina con cascada, se producirá un error al eliminar los índices PK_*. Pero al final, tendrás un esquema bastante limpio. Confirmar con:
select * from user_objects
Además, solo para agregar, el bloque Pl/sql en su pregunta eliminará solo las tablas, no eliminará todos los demás objetos.
pd: copiado de algun sitio web, me fue util. Probado y funcionando a las mil maravillas.
Sí tu puedes. Puede descartar al usuario y, por lo tanto, descartar los objetos del esquema. La instrucción DROP USER se utiliza para eliminar un usuario de la base de datos de Oracle y eliminar todos los objetos que pertenecen a ese usuario.
DROP USER TestDB;
Esta declaración solo se ejecutará correctamente y eliminará al usuario llamado TestDB solo si TestDB no posee ningún objeto en su esquema. Objeto en el sentido de tablas y vistas, etc. Si contiene algún objeto, luego de ejecutar la declaración DROP USER, obtendrá el siguiente mensaje de error
Error starting at line : 1 in command -
DROP USER TestDB
Error report -
SQL Error: ORA-01922: CASCADE must be specified to drop 'TESTDB'
01922. 00000 - "CASCADE must be specified to drop '%s'"
*Cause: Cascade is required to remove this user from the system. The
user own's object which will need to be dropped.
*Action: Specify cascade.
Si TestDB tuviera objetos propios en su esquema, necesitaría ejecutar la siguiente instrucción DROP USER en su lugar:
DROP USER TestDB CASCADE;
Esta declaración eliminará todos los objetos que pertenecen a TestDB, y también se eliminarán todas las restricciones de integridad referencial en los objetos de TestDB.
Encontré el siguiente script en github que funcionó de inmediato (SQL*Plus: versión 12.2.0.1.0 Production):
https://gist.github.com/rafaeleyng/33eaef673fc4ee98a6de4f70c8ce3657
Gracias al autor Rafael Eyng.
Simplemente inicie sesión en el esquema cuyos objetos desea descartar.
BEGIN
FOR cur_rec IN (SELECT object_name, object_type
FROM user_objects
WHERE object_type IN
('TABLE',
'VIEW',
'PACKAGE',
'PROCEDURE',
'FUNCTION',
'SEQUENCE',
'TYPE',
'SYNONYM',
'MATERIALIZED VIEW'
))
LOOP
BEGIN
IF cur_rec.object_type = 'TABLE'
THEN
EXECUTE IMMEDIATE 'DROP '
|| cur_rec.object_type
|| ' "'
|| cur_rec.object_name
|| '" CASCADE CONSTRAINTS';
ELSE
EXECUTE IMMEDIATE 'DROP '
|| cur_rec.object_type
|| ' "'
|| cur_rec.object_name
|| '"';
END IF;
EXCEPTION
WHEN OTHERS
THEN
DBMS_OUTPUT.put_line ( 'FAILED: DROP '
|| cur_rec.object_type
|| ' "'
|| cur_rec.object_name
|| '"'
);
END;
END LOOP;
END;
/
Todavía puede haber SINÓNIMOS PÚBLICOS que apunten a las tablas que se acaban de eliminar. El siguiente script también elimina estos:
BEGIN
FOR cur_syn IN (SELECT synonym_name
FROM all_synonyms
WHERE table_owner = 'MY_USER')
LOOP
BEGIN
EXECUTE IMMEDIATE 'drop public synonym ' || cur_syn.synonym_name ;
EXCEPTION
WHEN OTHERS
THEN
DBMS_OUTPUT.PUT_LINE ('Failed to drop the public synonym ' || cur_syn.synonym_name || '! ' || sqlerrm);
END;
END LOOP;
END;
/
Comentarios y puntuaciones de la guía
Si te gustó nuestro trabajo, tienes la habilidad dejar una noticia acerca de qué le añadirías a esta crónica.