3

我正在为一个 Web 项目开发 Oracle10.2g 数据库。我已经从文件(some-file.dmp)中的远程系统导出了数据库的完整Schema对象。然后我想将文件的内容导入本地系统上的另一个数据库。该过程完美无缺。

但是,我不小心将文件内容(包括表格、视图等)导入了SYS用户。因此,SYS 用户现在已经挤满了大约1500个不需要的对象。

我知道我可以单独丢弃对象,但是,这是一项令人厌烦的工作。现在,我想知道是否有任何方法可以撤消该过程并删除不需要的对象(从SYS用户中删除错误导入的表、视图等)?

编辑 :

导入的对象特别包括

  1. 表格(显然包括 FK 约束)
  2. 意见
  3. 索引
  4. 套餐
  5. 程序
  6. 功能
  7. 序列
  8. 触发器
  9. Java 代码

因此,它们是相互关联的。非常感谢任何想法或建议!

4

1 回答 1

3

您可以尝试查询DBA_OBJECTS和查找所有属于SYS和最近创建的任何内容。例如,以下列出了SYS今天在模式中创建的所有对象:

SELECT object_name, object_type
  FROM dba_objects
 WHERE owner = 'SYS'
   AND created >= TRUNC(SYSDATE)

然后,您可以使用它来生成一些动态 SQL 来删除对象。这应该可以节省您手动删除它们的时间。

但是请注意,可能有一些对象是最近创建的并且应该归 拥有SYS,所以在你删除它之前,请仔细检查你要删除的对象是什么。(在我的 Oracle 11g XE 数据库上,SYS模式中的最新对象是大约一周半前创建的索引和表分区。)

我不知道你有什么类型的对象,但是对象类型之间会有一些依赖关系。特别是,如果另一个表具有指向它的外键约束,则不能删除该表。 这个答案提供了一些 PL/SQL 代码来禁用表上的所有约束,如果需要,您可以调整以删除所有约束,或者只删除所有外键约束。

此外,如果表列使用类型,则需要在删除类型之前删除该表。同样,您可能必须注意类型是否依赖于其他类型。

其他需要注意的事项:

  • 您不需要丢弃包裹体,只需丢弃包裹,包裹体就会随之而来。
  • 您不需要删除表和视图上的触发器:删除表或视图时触发器会消失。同样,删除表会删除该表上的所有索引。
  • 视图、过程、函数和包可能依赖于其他对象,但它们不应该阻止那些其他对象被删除。视图/过程/功能/包应该变得无效,但如果它们无论如何都要被删除,那没关系。

您没有指定您拥有哪些其他类型的对象,因此您可能会遇到其他问题。

编辑:针对您更新的问题:

  • 删除 FK 约束后,您可以按照指定的顺序删除对象。桌子将是最难的部分:一旦它们都消失了,其他一切都应该是直截了当的。
  • 您不需要删除索引,因为它们会在您删除表时自动删除。
  • 您不需要删除表或视图上的触发器,因为当您删除视图或表时这些触发器会自动删除。(我不知道您是否有任何其他触发器,例如AFTER LOGON ON DATABASE,但这些触发器可能不会包含在导出中。)
  • 我只有 Oracle XE,它不支持 Java,所以我不能确定删除 Java 类所需的确切咒语。Oracle 文档DROP JAVA可能对您有所帮助。
于 2013-10-08T09:47:44.843 回答