¿Cómo soltar todas las tablas de usuario?

160

¿Cómo puedo descartar todas las tablas de usuario en Oracle?

Tengo problemas con las restricciones. Cuando desactivo todo, todavía no es posible.

szaman
fuente
¿Qué tal si eliminas las restricciones en lugar de desactivarlas?
David Aldridge

Respuestas:

294
BEGIN
   FOR cur_rec IN (SELECT object_name, object_type
                   FROM user_objects
                   WHERE object_type IN
                             ('TABLE',
                              'VIEW',
                              'MATERIALIZED VIEW',
                              'PACKAGE',
                              'PROCEDURE',
                              'FUNCTION',
                              'SEQUENCE',
                              'SYNONYM',
                              'PACKAGE BODY'
                             ))
   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;
   FOR cur_rec IN (SELECT * 
                   FROM all_synonyms 
                   WHERE table_owner IN (SELECT USER FROM dual))
   LOOP
      BEGIN
         EXECUTE IMMEDIATE 'DROP PUBLIC SYNONYM ' || cur_rec.synonym_name;
      END;
   END LOOP;
END;
/
Henry Gao
fuente
1
depende de lo que pretendes hacer. También puede usar la caída de la cascada de usuarios, pero necesita volver a crear el usuario.
Henry Gao el
1
Esto funcionó muy bien y no requiere que tenga autoridad en el servidor Oracle para eliminar y volver a agregar mi usuario. Bravo. Gran respuesta.
djangofan
Obtengo java.lang.IllegalArgumentException: No se seleccionó SQL para la ejecución. Mi idea es que cur_rec no se declara. ¿Cómo declararlo ya que esto consiste en bject_name, object_type?
presa de lijep
3
Creo que el guión podría ser peligroso. Si está conectado como SYSDBA, elimina TODAS las tablas de TODOS los usuarios y también TODAS las tablas del sistema. En la práctica, elimina todo el DB. ¡Ten cuidado!
Zardo
Esto es útil para los usuarios que tienen un permiso para cierto esquema pero no el permiso dba en el entorno de desarrollo.
Henry Gao
201

Si solo quieres una forma realmente simple de hacer esto ... Aquí hay un guión que he usado en el pasado

select 'drop table '||table_name||' cascade constraints;' from user_tables;

Esto imprimirá una serie de comandos de caída para todas las tablas del esquema. Agrupe el resultado de esta consulta y ejecútelo.

Fuente: https://forums.oracle.com/forums/thread.jspa?threadID=614090

Del mismo modo, si desea borrar más de las tablas, puede editar lo siguiente para satisfacer sus necesidades

select 'drop '||object_type||' '|| object_name || ';' from user_objects where object_type in ('VIEW','PACKAGE','SEQUENCE', 'PROCEDURE', 'FUNCTION', 'INDEX')
khylo
fuente
46

Otra respuesta que funcionó para mí es (crédito a http://snipt.net/Fotinakis/drop-all-tables-and-constraints-within-an-oracle-schema/ )

BEGIN

FOR c IN (SELECT table_name FROM user_tables) LOOP
EXECUTE IMMEDIATE ('DROP TABLE "' || c.table_name || '" CASCADE CONSTRAINTS');
END LOOP;

FOR s IN (SELECT sequence_name FROM user_sequences) LOOP
EXECUTE IMMEDIATE ('DROP SEQUENCE ' || s.sequence_name);
END LOOP;

END;

Tenga en cuenta que esto funciona inmediatamente después de ejecutarlo. No NO producir una secuencia de comandos que necesita para pegar en alguna parte (al igual que otras respuestas aquí). Se ejecuta directamente en la base de datos.

kazanaki
fuente
1
Esto funciona para mí, pero tuve que citar el nombre de la tabla escribiendo 'DROP TABLE "' || c.table_name || '" CASCADE CONSTRAINTS'. Esto es necesario si los nombres de las tablas son minúsculas.
ceving
@ceving es bueno saber esto! Solo uso tablas mayúsculas, así que nunca me he encontrado con esto.
kazanaki
También se necesita +1 @ceving en caso de que el nombre de su tabla sea una palabra reservada. Además, agregaría PURGEal final de la DROPdeclaración.
Грозный
Se corrigieron las citas como ceving sugerido.
kazanaki
ORA-24005: Utilidades inapropiadas utilizadas para realizar DDL en la tabla AQ
Skylar Saveland
21
begin
  for i in (select 'drop table '||table_name||' cascade constraints' tbl from user_tables) 
  loop
     execute immediate i.tbl;
  end loop;
end;
MD Maksud Alam
fuente
12

La forma más simple es descartar al usuario que posee los objetos con el comando en cascada.

DROP USER username CASCADE
Brian
fuente
55
Este no es el método correcto. Este es un método para eliminar un usuario cuando el usuario ha creado objetos, lo que requiere el uso de CASCADE para eliminar las tablas de usuario justo antes de que se elimine el usuario. Eliminar al usuario no es la pregunta que hizo.
djangofan
3
Realiza el objetivo de manera muy efectiva en particular si el esquema es grande. Parece que en su caso evitar una comunicación con su DBA es una alta prioridad. Prefiero soluciones que fomenten una relación con su DBA, en particular si no tiene privilegios de DBA.
Brian
2
@ Brian, asumes que estás equivocado. A veces no hay un DBA en absoluto, o él está en otra compañía. O el caso más habitual: no le dará acceso para hacer lo que necesita.
kazanaki
Ser nuevo en Oracle y estoy más familiarizado con MySQL; Restablecer un DB parece difícil. EN MySQL a USERes separado de a DATABASE. DROP USER username CASCADEtrabajó para mi. Pero en MySQL todo lo que tendría que hacer es DROP DATABASEcrear uno nuevo
Gawpertron
1
Esto es efectivo para descartar toda la base de datos, incluidas las tablas si tiene 1) un script 'CREAR USUARIO' a mano con todos los permisos exactos para recrear la base de datos; y 2) permiso para ejecutar ese script. Si todo lo que necesita hacer es soltar tablas, entonces otros enfoques mencionados (@kazanaki) son más apropiados.
Rana Ian
7

La forma más fácil sería soltar el espacio de tabla y luego volver a crearlo. Pero prefiero no tener que hacer eso. Esto es similar al de Henry, excepto que solo hago una copia / pego en el conjunto de resultados en mi GUI.

SELECT
  'DROP'
  ,object_type
  ,object_name
  ,CASE(object_type)
     WHEN 'TABLE' THEN 'CASCADE CONSTRAINTS;'
     ELSE ';'
   END
 FROM user_objects
 WHERE
   object_type IN ('TABLE','VIEW','PACKAGE','PROCEDURE','FUNCTION','SEQUENCE')
TJR
fuente
6
SELECT 'DROP TABLE "' || TABLE_NAME || '" CASCADE CONSTRAINTS;' 
FROM user_tables;

user_tables es una tabla del sistema que contiene todas las tablas del usuario, la cláusula SELECT generará una declaración DROP para cada tabla en la que pueda ejecutar el script

ANiket Chavan
fuente
no olvide las comillas, de lo contrario no puede eliminar tablas con letras minúsculas
masterxilo
2

Para eliminar todos los objetos en Oracle:

1) dinámico

DECLARE
CURSOR IX IS
SELECT * FROM ALL_OBJECTS WHERE OBJECT_TYPE ='TABLE' 
AND OWNER='SCHEMA_NAME';
 CURSOR IY IS
 SELECT * FROM ALL_OBJECTS WHERE OBJECT_TYPE 
IN ('SEQUENCE',
'PROCEDURE',
'PACKAGE',
'FUNCTION',
'VIEW') AND  OWNER='SCHEMA_NAME';
 CURSOR IZ IS
 SELECT * FROM ALL_OBJECTS WHERE OBJECT_TYPE IN ('TYPE') AND  OWNER='SCHEMA_NAME';
BEGIN
 FOR X IN IX LOOP
   EXECUTE IMMEDIATE('DROP '||X.OBJECT_TYPE||' SCHEMA_NAME.'||X.OBJECT_NAME|| ' CASCADE CONSTRAINT');
 END LOOP;
 FOR Y IN IY LOOP
   EXECUTE IMMEDIATE('DROP '||Y.OBJECT_TYPE||' SCHEMA_NAME.'||Y.OBJECT_NAME);
 END LOOP;
 FOR Z IN IZ LOOP
   EXECUTE IMMEDIATE('DROP '||Z.OBJECT_TYPE||' SCHEMA_NAME.'||Z.OBJECT_NAME||' FORCE ');
 END LOOP;
END;
/

2) estático

    SELECT 'DROP TABLE "' || TABLE_NAME || '" CASCADE CONSTRAINTS;' FROM user_tables
        union ALL
        select 'drop '||object_type||' '|| object_name || ';' from user_objects 
        where object_type in ('VIEW','PACKAGE','SEQUENCE', 'PROCEDURE', 'FUNCTION')
        union ALL
        SELECT 'drop '
        ||object_type
        ||' '
        || object_name
        || ' force;'
        FROM user_objects
        WHERE object_type IN ('TYPE');
Goyal Vicky
fuente
1

Por favor siga los pasos a continuación.

begin
  for i in (select 'drop table '||table_name||' cascade constraints' tb from user_tables) 
  loop
     execute immediate i.tb;
  end loop;
  commit;
end;
purge RECYCLEBIN;
Lova Chittumuri
fuente