Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在Oracle中删除架构中的所有内容_Sql_Oracle_Plsql - Fatal编程技术网

Sql 在Oracle中删除架构中的所有内容

Sql 在Oracle中删除架构中的所有内容,sql,oracle,plsql,Sql,Oracle,Plsql,是否可以删除Oracle中scheme中的所有内容?我发现这个脚本: Begin for c in (select table_name from user_tables) loop execute immediate ('drop table '||c.table_name||' cascade constraints); end loop; End; 但我想知道是否有任何东西可以删除模式、索引、表、约束中的所有内容。。。但不是模式删除用户 谢谢。是的,你可以。您可以删除用户,从而删除模式对

是否可以删除Oracle中scheme中的所有内容?我发现这个脚本:

Begin
for c in (select table_name from user_tables) loop
execute immediate ('drop table '||c.table_name||' cascade constraints);
end loop;
End;
但我想知道是否有任何东西可以删除模式、索引、表、约束中的所有内容。。。但不是模式删除用户


谢谢。

是的,你可以。您可以删除用户,从而删除模式对象。 DROP USER语句用于从Oracle数据库中删除用户,并删除该用户拥有的所有对象

DROP USER TestDB;
只有当TestDB在其模式中不拥有任何对象时,此语句才会正确运行并删除名为TestDB的用户。表示表和视图等的对象。 如果它包含任何对象,那么在执行DROP USER语句之后,您将得到以下错误消息

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.
如果TestDB在其架构中拥有对象,则需要运行以下DROP USER语句:

DROP USER TestDB CASCADE;

此语句将删除TestDB拥有的所有对象,并且也将删除TestDB对象上的所有引用完整性约束。

通常,删除和添加用户最简单。如果您具有对数据库的系统或sysdba访问权限,则这是首选方法

如果您没有系统级访问权限,并且希望删除模式,那么下面的sql将生成一系列drop语句,然后可以执行这些语句

select 'drop '||object_type||' '|| object_name|| DECODE(OBJECT_TYPE,'TABLE',' CASCADE CONSTRAINTS','') || ';'  from user_objects
然后,我通常清理回收站来真正清理东西。老实说,我认为oracle的回收站没有多大用处,我希望能够禁用它,但无论如何:

purge recyclebin;
这将生成一个drop语句列表。不是所有的索引都会执行-如果使用级联删除,删除PK_*索引将失败。但最终,您将拥有一个非常干净的模式。确认:

select * from user_objects
另外,只需添加一点,您问题中的Pl/sql块将只删除表,而不会删除所有其他对象


附言:从一些网站上抄袭的,对我很有用。经过测试,工作正常。

以下SQLplus脚本生成从所需用户删除所有架构对象所需的SQL语句:

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
/
该脚本对我来说是100%正常工作的-但如果出于某种原因,它对您来说不完整,那么可以使用虚拟机VM轻松地对其进行增强,如下所示:

以[您的架构用户为空]的身份登录 拍摄虚拟机的快照 运行上述脚本以创建删除语句 运行删除语句可以忽略任何对象不存在的错误,因为某些对象将在脚本删除语句之前自动删除。这是由于删除了拥有对象而导致的 注销 以SYS身份登录并执行drop user[将您的模式用户设置为空];-没有级联选项 如果步骤6失败,那么您需要识别阻止删除用户的其余对象,并将它们添加到上述脚本中。重复此操作,直到用户删除ie。您的脚本完整,然后保存脚本

将虚拟机回滚到快照,并使用更新的脚本重复步骤3和4,现在应该有一个100%的空模式。

这就是我使用的:

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
只需使用:

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

在github上找到以下脚本,该脚本是现成的SQL*Plus:Release 12.2.0.1.0生产版:

感谢作者Rafael Eyng

只需登录到要删除其对象的模式

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;
/
可能还有一些公共同义词指向刚刚删除的表。以下脚本也将删除这些内容:

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;
/

如果您的意思是不要删除Oracle用户ID,我认为该脚本可以做到这一点。但是创建一个测试数据库,并尝试一下。你的目标是什么?是否要清除所有表的内容?那你就不应该把它们扔了。如果您只想得到一个空的模式,那么我认为重新创建它更容易。你将从零开始得到一个新的模式,统计数据为空,没有任何对象表、视图、同义词、物化视图等。CI没有创建用户的权限,因此我无法删除用户并重新创建它。如果你真的需要删除每种对象类型,我无法使用问题中所述的删除用户,你得挖透这个洞,处理掉大部分的水。。。可惜Oracle提供了一个CREATESchema命令,而不是drop schema。我想这是自动构建测试的一个非常常见的要求,通常不能从头开始创建用户。这显然是OP没有要求的。编辑以在每个拖放的末尾加上分号:选择“拖放”| |对象|类型| |“|对象|名称| |解码对象|类型、‘表’、‘级联约束’、|”对于更复杂的模式,这个答案是不完整的