删除Oracle中方案中的所有内容

ecr0jaav  于 2022-10-04  发布在  Oracle
关注(0)|答案(6)|浏览(129)

是否可以删除Oracle方案中的所有内容?我找到了这个剧本:

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...)。

谢谢。

jw5wzhpr

jw5wzhpr1#

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

如果您没有系统级访问权限,并且希望清除您的模式,则以下SQL将生成一系列DROP语句,然后可以执行这些语句。

select 'drop '||object_type||' '|| object_name|| DECODE(OBJECT_TYPE,'TABLE',' CASCADE CONSTRAINTS','') || ';'  from user_objects

然后,我通常会清理回收站,以便真正清理干净。老实说,我看不出甲骨文的回收站有什么用处,我希望我能禁用它,但不管怎样:

purge recyclebin;

这将生成DROP语句的列表。并不是所有的索引都会执行--如果您使用CASCADE删除,删除PK_*索引将失败。但最终,您将拥有一个非常干净的模式。通过以下方式确认:

select * from user_objects

另外,只是添加一下,您问题中的Pl/SQL块将只删除表,它不会删除所有其他对象。

PS:从一些网站上复制的,对我很有用。经受了考验,工作起来像个护身符。

yv5phkfx

yv5phkfx2#

在GitHub上找到了以下开箱即用的脚本(SQL*Plus:12.2.0.1.0版产品):

https://gist.github.com/rafaeleyng/33eaef673fc4ee98a6de4f70c8ce3657

感谢作者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;
/
hsgswve4

hsgswve43#

是的你可以。您可以删除用户,从而删除架构对象。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对象上的所有引用完整性约束。

jei2mxaa

jei2mxaa4#

以下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)轻松进行增强,如下所示:

1.以[清空您的架构用户]身份登录
1.拍摄您的虚拟机的快照
1.运行上述脚本以创建删除语句
1.运行删除语句*(您可以忽略任何“对象不存在”错误,因为一些对象将在脚本删除语句之前被自动删除。这是由于所拥有的对象被删除而发生的)*
1.注销
1.以sys身份登录并执行“DROP USER[YOUR SCHEMA USER TO EMPTY];”--不带CASCADE选项

如果步骤6失败,那么您需要确定阻止您的用户被删除的剩余对象,并将它们添加到上面的脚本中。重复上述操作,直到您的用户删除(即您的脚本是全面的)然后保存您的脚本

将您的VM回滚到您的快照并重复步骤3和4(使用更新后的脚本)--现在您应该有一个100%为空的架构。

olhwl3o2

olhwl3o25#

只要跟上:

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

lokaqttq6#

这是我的用法:

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

相关问题