tabla - sql server query to html table
Eliminar todos los contenidos en un esquema en Oracle (5)
¿Es posible eliminar todos los contenidos en esquema en Oracle? Encontré este script:
Begin
for c in (select table_name from user_tables) loop
execute immediate (''drop table ''||c.table_name||'' cascade constraints);
end loop;
End;
Pero me gustaría saber si hay algo para eliminar todo en el esquema, los índices, las tablas, las restricciones ... pero no el esquema (eliminar usuario ...).
Gracias.
Esto es lo que usé:
set echo off feedback off serverout on
spool drop_all_objects.sql
declare l_object varchar2(32000);
begin
for i in (select object_name, object_type from dba_objects where owner=''<owner>'') loop
if i.object_type=''JOB'' then
l_object := ''begin dbms_scheduler.drop_job (job_name => ''''<owner>''||i.object_name||''''''); end;'';
elsif i.object_type=''PROGRAM'' then
l_object := ''begin dbms_scheduler.drop_program (program_name => ''''<owner>''||i.object_name||''''''); end;'';
elsif i.object_type=''RULE'' then
l_object := ''begin dbms_rule_adm.drop_rule (rule_name => ''''<owner>''||i.object_name||'''''', force => TRUE); end;'';
elsif i.object_type=''RULE SET'' then
l_object := ''begin dbms_rule_adm.drop_rule_set (rule_set_name => ''''<owner>''||i.object_name||'''''', delete_rules => TRUE); end;'';
elsif i.object_type=''CHAIN'' then
l_object := ''begin dbms_scheduler.drop_chain (chain_name => ''''<owner>''||i.object_name||'''''', force => TRUE); end;'';
elsif i.object_type=''RULE'' then
l_object := ''begin dbms_rule_adm.drop_evaluation_context (evaluation_context_name => ''''<owner>''||i.object_name||'''''', force => TRUE); end;'';
else
l_object := ''drop ''||i.object_type||''<owner>''||i.object_name||'';'';
end if;
dbms_output.put_line(i_object);
dbms_output.put_line(''/'');
end loop;
end;
/
@drop_all_objects
La siguiente secuencia de comandos SQLplus genera las instrucciones SQL necesarias para eliminar todos los objetos de esquema del usuario deseado:
set heading off
set pagesize 0
set feedback off
-- wipe out all scheduler jobs
select ''exec dbms_scheduler.drop_job(job_name => ''''''||j.job_creator||''.''||j.job_name||'''''');''
from user_scheduler_jobs j
/
-- wipe out all XML schemas
select ''exec dbms_xmlschema.deleteSchema(schemaURL => ''''''||s.qual_schema_url||'''''',delete_option => dbms_xmlschema.DELETE_CASCADE_FORCE);''
from user_xml_schemas s
/
-- wipe out all remaining objects
select ''drop ''
||o.object_type
||'' ''||object_name
||case o.object_type when ''TABLE'' then '' cascade constraints'' when ''TYPE'' then '' force'' else '''' end
||'';''
from user_objects o
where o.object_type not in (''JOB'',''LOB'',''PACKAGE BODY'',''INDEX'',''TRIGGER'')
and not exists (select 1
from user_objects r
where r.object_name = o.object_name
and r.object_type = ''MATERIALIZED VIEW''
and o.object_type != ''MATERIALIZED VIEW''
)
/
-- empty the recycle bin
select ''purge recyclebin;'' from dual
/
El script funciona al 100% para mí tal como está, pero si por alguna razón no está completo, se puede mejorar fácilmente utilizando una máquina virtual (VM) de la siguiente manera:
- inicie sesión como [su usuario de esquema para vaciar]
- Toma una instantánea de tu máquina virtual
- ejecuta el script anterior para crear las instrucciones de eliminación
- ejecute las instrucciones de eliminación (puede ignorar cualquier error de "el objeto no existe", ya que algunos objetos se eliminarán automáticamente antes de la instrucción de eliminación de la secuencia de comandos. Esto ocurre como resultado de la eliminación de los objetos)
- desconectarse
- inicie sesión como SYS y ejecute "drop user [su usuario de esquema para vaciar];" - SIN la opción de cascada
Si el paso 6 falla, debe identificar los objetos restantes que impiden que se elimine su usuario y agregarlos al script anterior. Repita hasta que su usuario se caiga (es decir, su script es completo) luego guarde su script
Restaure su VM a su instantánea y repita los pasos 3 y 4 (usando su script actualizado), y ahora debería tener un esquema 100% vacío.
Normalmente, es más sencillo soltar 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 limpiar su esquema, el siguiente sql producirá una serie de estados de descarte, que luego pueden ejecutarse.
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 desactivarlo, pero de todos modos:
purge recyclebin;
Esto producirá una lista de declaraciones de caída. No todos se ejecutarán; si lo suelta en cascada, la caída de los índices PK_ * fallará. 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.
ps: copiado de algún sitio web, me sirvió. Probado y funcionando como un encanto.
Sí tu puedes. Puede dejar al usuario y, por lo tanto, eliminar los objetos de esquema. La declaración DROP USER se utiliza para eliminar un usuario de la base de datos de Oracle y eliminar todos los objetos de su propiedad.
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 las tablas de sentido y vistas, etc. Si contiene algún objeto, luego de ejecutar la instrucción DROP USER, aparecerá 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 propiedad de TestDB, y todas las restricciones de integridad referencial en los objetos TestDB también se eliminarán.
Sólo ve con
select ''drop ''||object_type||'' ''|| object_name || '';'' from user_objects where
object_type in (''VIEW'',''PACKAGE'',''SEQUENCE'', ''PROCEDURE'', ''FUNCTION'', ''INDEX'')