Saltar al contenido

Eliminar todo el contenido en un esquema en Oracle

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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *